paint-brush
Apple의 Vision Framework 시작하기: 개발자의 관점~에 의해@threadmaster
새로운 역사

Apple의 Vision Framework 시작하기: 개발자의 관점

~에 의해 Boris Dobretsov5m2025/02/19
Read on Terminal Reader

너무 오래; 읽다

Apple의 Vision 프레임워크는 iOS 11에서 도입되었습니다. 이를 통해 개발자는 시각적 콘텐츠를 분석하고 필요에 따라 후속 처리를 수행할 수 있습니다. 이 문서에서는 코드 예제와 함께 Vision을 사용하는 주요 시나리오를 살펴보겠습니다.
featured image - Apple의 Vision Framework 시작하기: 개발자의 관점
Boris Dobretsov HackerNoon profile picture
0-item
1-item

Vision 프레임워크는 Apple이 2017년 WWDC에서 iOS 11의 일부로 소개했습니다. 이 프레임워크의 출시는 머신 비전과 이미지 분석의 진화에 있어서 전환점을 나타내며, 개발자에게 시각적 콘텐츠를 분석하고 필요에 따라 후속 처리를 수행할 수 있는 기본 도구를 제공했습니다.


2017년에 Vision은 다음을 소개했습니다.

  • 텍스트 인식
  • 얼굴 인식
  • 직사각형 모양 감지
  • 바코드 및 QR 코드 인식


Apple은 데뷔 이후 Vision 프레임워크를 지속적으로 개선하여 현대적 요구 사항을 충족하도록 진화시켰습니다. 2024년 말 iOS 18 출시와 함께 Vision은 이제 다음을 제공합니다.

  • 다양한 언어 지원으로 텍스트 인식 정확도 향상
  • 얼굴 및 얼굴 특징 감지
  • 움직임을 분석하는 능력
  • 손의 위치와 인체의 주요 지점을 포함한 포즈를 인식하는 능력
  • 비디오에서 객체 추적 지원
  • 사용자 정의 머신 러닝 모델 작업을 위한 CoreML과의 통합 개선
  • AVKit, ARKit 등 관련 프레임워크와의 긴밀한 통합


Vision 프레임워크의 등장으로 개발자는 타사 솔루션에 의존하지 않고도 고급 이미지 및 비디오 분석 작업을 기본적으로 수행할 수 있는 기능을 얻었습니다. 이러한 기능에는 문서 스캔, 텍스트 인식, 얼굴 및 포즈 식별, 중복 이미지 감지, 비즈니스 운영을 간소화하는 다양한 프로세스 자동화가 포함됩니다.


이 글에서는 코드 예제를 통해 Vision을 사용하는 주요 시나리오를 살펴보겠습니다. 이 코드는 Vision의 작업 방법을 이해하고, Vision이 어렵지 않다는 점을 이해하고, 실제로 애플리케이션에 적용하는 데 도움이 될 것입니다.

VN요청

Vision에는 Vision에서 데이터 요청 구조를 정의하는 추상 클래스 VNRequest 가 있으며, 하위 클래스는 이미지로 특정 작업을 수행하기 위한 특정 요청을 구현합니다.


모든 하위 클래스는 VNRequest 클래스의 초기화 프로그램을 상속합니다.

 public init(completionHandler: VNRequestCompletionHandler? = nil)

요청 처리 결과를 반환합니다. 요청 결과가 요청이 전송된 동일한 큐에 반환된다는 점을 명확히 하는 것이 중요합니다.


여기서 VNRequestCompletionHandler 는 typealias입니다.

 public typealias VNRequestCompletionHandler = (VNRequest, (any Error)?) -> Void

요청 결과가 담긴 VNRequest를 반환하거나, 시스템 오류, 잘못된 이미지 등으로 인해 요청이 실행되지 않은 경우 Error를 반환합니다.


추상 VNRequest 클래스의 VNRecognizeTextRequest 클래스는 이미지의 텍스트 인식 요청을 처리하도록 설계되었습니다.


텍스트 인식 요청을 구현하는 예:

 import Vision import UIKit func recognizeText(from image: UIImage) { guard let cgImage = image.cgImage else { return } let request = VNRecognizeTextRequest { request, error in // 1 guard let observations = request.results as? [VNRecognizedTextObservation] else { return } // 2 for observation in observations { if let topCandidate = observation.topCandidates(1).first { print("Recognized text: \(topCandidate.string)") print("Text boundingBox: \(observation.boundingBox)") print("Accuracy: \(topCandidate.confidence)") } } } request.recognitionLevel = .accurate request.usesLanguageCorrection = true let handler = VNImageRequestHandler(cgImage: cgImage, options: [:]) // 3 try? handler.perform([request]) // 3 }


  1. 텍스트 인식을 위한 VNRecognizeTextRequest를 생성합니다.


  2. VNRecognizedTextObservation 객체의 배열로 텍스트 인식 요청의 결과를 받습니다.


VNRecognizedTextObservation 개체에는 다음이 포함됩니다.

  • 인식된 텍스트의 배열(V NRecognizedText().string )
  • 인식 정확도( VNRecognizedText().confidence )
  • 이미지에서 인식된 텍스트의 좌표( VNRecognizedText().boundingBox )


  1. 이미지 처리에 대한 요청을 만들고, 텍스트 인식에 대한 요청을 보냅니다.


  2. 예: 문서 인식을 위한 자체 SDK 개발 시 세금 식별 번호 및 여권 번호 인식

VNDetectFaceRectangles요청

이 클래스는 이미지에서 얼굴을 찾아 좌표를 반환합니다.


얼굴 인식 요청을 구현하는 예:

 import Vision import UIKit func detectFaces(from image: UIImage) { guard let cgImage = image.cgImage else { return } let request = VNDetectFaceRectanglesRequest { request, error in // 1 guard let results = request.results as? [VNFaceObservation] else { return } // 2 for face in results { print("Face detected: \(face.boundingBox)") } } let handler = VNImageRequestHandler(cgImage: cgImage, options: [:]) // 3 try? handler.perform([request]) // 3 }


  1. 이미지에서 얼굴을 인식하기 위해 VNDetectFaceRectanglesRequest를 생성합니다.


  2. 텍스트 인식 요청의 결과를 VNFaceObservation 객체의 배열로 받습니다.


VNFaceObservation 개체에는 다음이 포함됩니다.

  1. 인식된 얼굴의 좌표 VNFaceObservation().boundingBox.


  2. 이미지 처리에 대한 요청을 만들고 얼굴 인식에 대한 요청을 보냅니다.


  3. 예: 은행에서는 여권과 함께 사진을 찍어야 하는 KYC 온보딩이 있습니다. 이를 통해 해당 얼굴이 실제 사람의 얼굴인지 확인할 수 있습니다.


VNDetectBarcodes요청

이 수업에서는 이미지에서 바코드와 QR 코드를 인식하고 읽습니다.


바코드와 QR 코드를 인식하고 읽기 위한 요청을 구현하는 예:

 import Vision import UIKit func detectBarcodes(from image: UIImage) { guard let cgImage = image.cgImage else { return } let request = VNDetectBarcodesRequest { request, error in // 1 guard let results = request.results as? [VNBarcodeObservation] else { return } // 2 for qrcode in results { print("qr code was found: \(qrcode.payloadStringValue ?? "not data")") } } let handler = VNImageRequestHandler(cgImage: cgImage, options: [:]) // 3 try? handler.perform([request]) // 3 }


  1. 인식을 위해 VNDetectBarcodesRequest를 생성합니다.


  2. VNBarcodeObservation 객체 배열 요청의 결과를 가져옵니다.


VNBarcodeObservation 객체에는 다음을 포함한 여러 속성이 포함되어 있습니다.

  1. VNFaceObservation().payloadStringValue - 바코드 또는 QR 코드의 문자열 값입니다.


  2. 이미지 처리에 대한 요청을 만들고, 얼굴 인식에 대한 요청을 보냅니다.


  3. 예: 결제를 위해 QR 코드를 읽기 위한 QR 스캐너.


이 강력한 도구를 사용하는 데 도움이 되도록 Vision의 3가지 주요 쿼리 유형을 다루었습니다.