오늘은 현재 구현하고 있는 Chatbot 프로젝트에서 이미지를 올려 말하는 것 처럼 할 수 있고 이미지의 텍스트를 인식해 보여줄 수 있는 OCR 기능에 대해 찾아보던 중 Vision 프레임 워크가 있다는 것을 알게돼 한번 알아보려고 한다 🙂
먼저 Vision 프레임워크는 머신 러닝 기술과 Swift의 동시성 기능을 결합해 앱에서 컴퓨터 비전 작업을 수행할 수 있다. 인간 혹은 동물의 신체 자세 또는 물체의 궤적을 추적한다거나, 텍스트를 인식 하거나, 눈 코 입 등 얼굴의 랜드마크를 감지하는 등 다양한 기능을 제공한다.
먼저 Vision 작업은 요청과 핸들러를 통해 실행되게 되는데 주요 핵심 클래스는 다음과 같다.
- VNImageRequestHandler : 정적 이미지 요청을 처리하는 클래스
- VNSequenceRequestHandler : 연속적인 이미지(동영상) 요청을 처리하는 클래스
- VNRequest : 특정 Vision 작업(얼굴감지, 텍스트 인식 등)을 정의하는 클래스
얼굴을 감지하는 기능을 추가해야하니 해당 내용에 대한 예제를 먼저 살펴보고 어떻게 구현되는지 방향을 읽어보자!
import Vision
import UIKit
func detectFaces(in image: UIImage) {
guard let cgImage = image.cgImage else { return }
// 얼굴 감지 요청 생성
let request = VNDetectFaceRectanglesRequest { (request, error) in
if let error = error {
print("얼굴 감지 실패: \\(error.localizedDescription)")
return
}
guard let results = request.results as? [VNFaceObservation] else { return }
for face in results {
print("얼굴 감지됨: \\(face.boundingBox)")
}
}
// 요청 핸들러 실행
let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
do {
try requestHandler.perform([request])
} catch {
print("요청 실패: \\(error.localizedDescription)")
}
}
먼저 Vision 프레임워크는 UIImage 대신 CGImage 형식의 이미지를 사용하기 때문에 UIImge를 CGImage로 변환해서 사용해야 한다.
guard 문을 활용해 UIImage에서 CGImage를 가져올 수 없는 경우 함수 실행을 종료 시킨다.
그 다음 VNDetectFaceRectanglesRequest를 생성해 이미지에서 얼굴이 포함된 영역을 감지하도록 구현한다.
VNFaceObservation 객체의 boundingBox 속성을 사용하면 감지된 얼굴의 위치를 가져오게 된다.
boundingBox는 정규화된 좌표로 이미지의 너비와 높이를 기준으로 계산한다.
그 다음 VNImageRequestHandler 핸들러를 만들어 정적 이미지를 처리하기 위한 Vision 핸들러를 작성한다. cgimage는 감지할 이미지를 핸들러에 전달하고, options는 추가적인 옵션을 설정할 수 있으며, 기본적으로 빈 딕셔너리를 사용한다.
이처럼 Vision 프레임워크를 사용해 이미지를 분석하고 텍스트를 인식하는 과정이 생각보다 쉽게 구현이 가능하다. Vision은 추후 CoreML과 통합이 용이해 머신러닝 모델과 아주 손쉽게 결합이 가능하다는 것도 장점이다.
오늘 기록한 이 Vision 프레임워크를 활용해 이미지를 분석하는 결과물은 추후에 다시 포스팅 진행하도록 하겠다 🙂 오늘은 여기까지!!
'◽️ Programming > iOS' 카테고리의 다른 글
Swift Concurrency 중 MainActor의 역할은 무엇인가 (0) | 2025.02.03 |
---|---|
JWT의 기본 개념과 HaruFit 프로젝트에 적용해보기 (0) | 2025.01.12 |
Swift Format , Swift Lint 프로젝트에 적용하기 (0) | 2025.01.07 |
Deadlock에 대해서 알아보자!! (0) | 2024.12.13 |
멀티 쓰레드 환경에서 Race Condition에 대해서 알아보자 (0) | 2024.12.09 |