Vision 프레임 워크를 활용해 얼굴 인식하기

오늘은 현재 구현하고 있는 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 프레임워크를 활용해 이미지를 분석하는 결과물은 추후에 다시 포스팅 진행하도록 하겠다 🙂 오늘은 여기까지!!