Vision은 Apple의 컴퓨터 비전 프레임워크로, 2017년 iOS 11에서 처음 소개되었습니다. Vision은 얼굴 감지, 텍스트 인식(OCR), 바코드 감지, 객체 추적, 이미지 분류 및 윤곽 분석을 위한 즉시 사용 가능한 알고리즘을 제공합니다 — 모든 작업은 Neural Engine을 사용하여 기기에서 수행됩니다. Apple WWDC 2023에 따르면, Vision은 기본 사진 앱에서 얼굴 인식에, 카메라 앱에서 iPhone 및 iPad의 실시간 텍스트 감지에 사용됩니다.
핵심 포인트
Vision은 복잡한 머신 러닝 알고리즘을 간단한 요청 API(VNRequest) 뒤에 추상화하는 고급 컴퓨터 비전 프레임워크입니다. 개발자는 컨볼루션 신경망을 이해할 필요가 없습니다 — 적절한 요청 유형을 만들고, 이미지를 전달하고, 결과를 얻기만 하면 됩니다.
Vision의 아키텍처는 Request → Handler → Result 원칙을 따릅니다: VNImageRequestHandler가 이미지를 받아 VNRequest를 실행하고 결과와 함께 VNObservation 배열을 반환합니다. 이를 통해 단일 이미지에 여러 요청을 결합할 수 있습니다 — 예를 들어, 사진에서 얼굴과 텍스트를 동시에 감지하는 등.
Vision은 iOS 11+ 및 macOS 10.13+를 지원합니다. Neural Engine을 통한 하드웨어 가속에는 A12 Bionic 칩 이상이 필요합니다. A17 Pro 및 M 시리즈 기기에서 Vision은 스트리밍 비디오에 대해 초당 최대 60프레임을 처리합니다.
주요 장점은 완전한 프라이버시입니다: 모든 계산이 기기에서 수행되며, 이미지가 서버로 전송되지 않습니다. 이를 통해 의료 또는 금융 앱과 같은 민감한 데이터를 다루는 애플리케이션에서 프레임워크를 사용할 수 있습니다.
VNDetectFaceRectanglesRequest는 이미지에서 얼굴을 감지하는 기본 Vision 요청입니다. 특정 개인을 식별하지 않고 각 얼굴을 둘러싸는 사각형의 좌표를 반환합니다.
더 자세한 분석을 위해 VNDetectFaceLandmarksRequest를 사용하세요. 눈, 눈썹, 코, 입, 턱 윤곽 등 얼굴의 주요 지점을 식별합니다. 이 데이터는 마스크 적용, 이모지 애니메이션 및 실시간 필터(FaceTime 및 Snapchat에서와 같이)에 사용됩니다.
import Vision
import UIKit
guard let image = UIImage(named: "photo") else { return }
let request = VNDetectFaceRectanglesRequest()
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try handler.perform([request])
for observation in request.results ?? [] {
let bbox = observation.boundingBox
print("Face at x=\\(bbox.origin.x), y=\\(bbox.origin.y)")
}
VNFaceObservation에는 boundingBox뿐만 아니라 confidence(0~1)와 landmarks(요청이 VNDetectFaceLandmarksRequest인 경우 얼굴 지점 배열)도 포함됩니다. 0.5 미만의 confidence는 일반적으로 오탐지를 나타냅니다 — 이러한 결과는 폐기하는 것이 좋습니다.
Vision은 또한 VNDetectFaceCaptureQualityRequest를 지원하여 얼굴 이미지의 품질(조명, 선명도, 회전 각도)을 평가합니다. 이는 사용자 등록 시 최상의 프레임을 선택하거나 아바타를 만드는 데 유용합니다.
VNRecognizeTextRequest는 iOS 13에 도입된 Apple의 내장 OCR 엔진입니다. 13개 언어(영어, 러시아어, 중국어, 일본어, 한국어, 이탈리아어, 독일어, 스페인어, 포르투갈어, 프랑스어, 아랍어, 베트남어, 태국어)를 지원하여 이미지에서 인쇄된 텍스트를 인식합니다.
VNRecognizeTextRequest는 두 가지 정확도 수준을 지원합니다: .fast(빠름, 대비되는 배경의 간단한 텍스트용)와 .accurate(정확, 다양한 글꼴과 각도의 복잡한 장면용). .fast는 3~5배 빠르지만 손글씨 텍스트와 비표준 글꼴을 덜 효과적으로 처리합니다.
import Vision
let textRequest = VNRecognizeTextRequest { request, _ in
guard let observations = request.results as? [VNRecognizedTextObservation]
else { return }
for observation in observations {
let topCandidate = observation.topCandidates(1).first
print(topCandidate?.string ?? "")
}
}
textRequest.recognitionLevel = .accurate
textRequest.usesLanguageCorrection = true
usesLanguageCorrection 속성은 언어 모델을 사용하여 인식된 텍스트 보정을 활성화합니다. 이는 영어 정확도를 10~15% 향상시키지만 처리 시간이 증가합니다. 적절한 인식이 지정되면 러시아어 보정도 사용할 수 있습니다.
Apple ML Research 2022에 따르면, .accurate 수준의 VNRecognizeTextRequest 정확도는 영어 문서 사진의 경우 96%, 러시아어의 경우 약 88%입니다. 포장, 간판 및 화면의 텍스트의 경우 정확도가 75~85%로 떨어집니다.
| 인식 수준 | 속도 | 정확도(영어) | 러시아어 지원 |
|---|---|---|---|
| .fast | 0.1~0.3초 | ~85% | 예 |
| .accurate | 0.3~1.0초 | ~96% | 예 |
VNDetectBarcodesRequest는 이미지에서 바코드와 QR 코드를 감지하고 디코딩하는 Vision 요청입니다. EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, PDF417, Aztec, QR 등 모든 주요 형식이 지원됩니다.
AVFoundation(AVCaptureMetadataOutput)과 달리 Vision은 비디오 스트림뿐만 아니라 정적 이미지에서도 작동합니다 — 기존 사진이나 스크린샷에서 코드를 스캔할 수 있습니다. Vision은 또한 코드의 boundingBox를 픽셀 단위로 정확하게 결정하여 감지된 코드 주위에 프레임을 애니메이션하는 데 편리합니다.
import Vision
let barcodeRequest = VNDetectBarcodesRequest { request, _ in
guard let observations = request.results as? [VNBarcodeObservation]
else { return }
for observation in observations {
let payload = observation.payloadStringValue ?? ""
print("Barcode: \\(payload), Symbology: \\(observation.symbology.rawValue)"
}
}
VNBarcodeObservation에는 payloadStringValue(디코딩된 내용), symbology(코드 유형) 및 confidence가 포함됩니다. QR 코드의 경우 페이로드는 URL, 텍스트 또는 JSON일 수 있습니다. EAN/UPC의 경우 데이터베이스에서 항목을 조회하는 데 사용할 수 있는 숫자 제품 코드가 반환됩니다.
Vision은 단일 이미지에서 여러 바코드를 처리할 수 있습니다 — observations 배열에는 감지된 각 코드에 대한 하나의 객체가 포함됩니다. 이는 제품 배치나 여러 바코드가 있는 문서를 스캔하는 데 유용합니다.
VNDetectObjectAtPointRequest와 VNSequenceRequestHandler는 비디오 스트림에서 객체를 추적하는 Vision 도구입니다. 전자는 사용자의 터치 지점으로 객체를 식별하고, 후자는 비디오 프레임 간에 객체를 추적합니다.
VNSequenceRequestHandler는 일련의 이미지(비디오 프레임)를 받아 각 프레임에 대해 추적된 객체의 업데이트된 위치를 반환합니다. 이는 증강 현실 앱, 비디오 편집기 및 감시 시스템에서 사용됩니다.
import Vision
let trackingRequest = VNTrackObjectRequest(detectedObjectObservation: initialObservation)
let sequenceHandler = VNSequenceRequestHandler()
for frame in videoFrames {
try sequenceHandler.perform([trackingRequest],
on: frame.cgImage!)
let newBBox = trackingRequest.results?.first?.boundingBox
// 화면에서 객체 위치 업데이트
}
VNTrackObjectRequest는 광학 흐름 기반 추적 알고리즘을 사용합니다 — 매 프레임마다 검출기를 재훈련하지 않고 이전 위치에서 객체의 변위를 계산합니다. 이를 통해 Neural Engine이 없는 기기에서도 실시간 성능을 제공합니다.
제한 사항: 빠른 움직임, 폐색 또는 급격한 조명 변화 중에 추적이 객체를 놓칠 수 있습니다. Apple은 추적 보정을 위해 10~15프레임마다 감지(VNDetectObjectAtPointRequest)를 다시 시작할 것을 권장합니다.
VNClassifyImageRequest는 1,000개 범주(ImageNet에서 훈련된 ResNet-50 모델)를 포함하는 Vision의 내장 이미지 분류 모델입니다. 요청은 범주 이름과 confidence가 포함된 VNClassificationObservation 배열을 반환합니다.
VNDetectContoursRequest는 이미지 윤곽 분석을 수행합니다 — 객체 경계를 추출하여 분할, 윤곽선 추출 및 인식 전 전처리에 유용합니다. 요청은 이미지의 각 윤곽을 설명하는 점 배열을 반환합니다.
import Vision
// 이미지 분류
let classificationRequest = VNClassifyImageRequest { request, _ in
guard let results = request.results as? [VNClassificationObservation]
else { return }
let topMatch = results.prefix(3).filter { $0.confidence > 0.3 }
for match in topMatch {
print("\\(match.identifier): \\(match.confidence)"
}
}
VNClassifyImageRequest는 일반 범주(고양이, 개, 자동차, 음식)에는 잘 작동하지만 특정 객체에는 적합하지 않습니다 — 이를 위해서는 사용자 정의 Core ML 모델을 훈련하고 VNCoreMLRequest를 사용해야 합니다. Apple의 모델은 모바일 기기에 최적화되어 있으며 5MB에 불과합니다.
VNDetectContoursRequest는 윤곽 유형(외부, 내부, 구멍)과 함께 점 배열로 윤곽을 반환합니다. 이 요청은 OCR 전 이미지 전처리(텍스트 대비 개선), 효과 그리기(객체 윤곽선), 형태 분석에 사용됩니다.
| Vision 요청 | 목적 | iOS 버전 |
|---|---|---|
| VNDetectFaceRectanglesRequest | 이미지에서 얼굴 검색 | iOS 11 |
| VNRecognizeTextRequest | 텍스트 인식(OCR) | iOS 13 |
| VNDetectBarcodesRequest | 바코드 및 QR 감지 | iOS 11 |
| VNClassifyImageRequest | 이미지 분류 | iOS 13 |
| VNDetectContoursRequest | 윤곽 분석 | iOS 14 |
| VNTrackObjectRequest | 객체 추적 | iOS 11 |
자주 묻는 질문
Vision은 모델 훈련 없이 즉시 사용 가능한 알고리즘(얼굴 감지, OCR, 바코드)을 제공합니다. Core ML은 사용자 정의 모델을 실행하는 엔진입니다. Vision + VNCoreMLRequest를 사용하면 Vision 파이프라인 내에서 Core ML 모델을 실행하여 두 세계의 장점(Vision의 즉시 사용 가능한 검출기 + Core ML의 사용자 정의 분류)을 모두 얻을 수 있습니다.
네, Vision은 추적을 위한 VNSequenceRequestHandler와 프레임별 처리를 위한 AVCaptureVideoDataOutput을 통해 실시간 비디오 스트림 처리를 지원합니다. A12+ 및 Neural Engine이 장착된 기기에서 Vision은 얼굴 감지를 위해 최대 60fps를 처리합니다. 무거운 작업(OCR, 분류)의 경우 5~10프레임마다 처리하는 것이 좋습니다.
VNRecognizeTextRequest는 13개 언어(영어, 러시아어, 중국어(간체 및 번체), 일본어, 한국어, 이탈리아어, 독일어, 스페인어, 포르투갈어, 프랑스어, 아랍어, 베트남어, 태국어)를 지원합니다. 단일 이미지에서 여러 언어를 인식하려면 recognitionLanguages 속성에 배열을 지정하세요.
네, VNCoreMLRequest를 통해 가능합니다. VNCoreMLModel로 래핑된 Core ML 모델을 만들어 VNCoreMLRequest에 전달합니다. Vision이 자동으로 이미지 전처리(크기 조정, 자르기)를 처리하고 Core ML 모델에 공급합니다. 결과는 모델의 출력 데이터와 함께 VNCoreMLFeatureValueObservation으로 반환됩니다.
아니요, Vision은 모든 분석을 전적으로 기기에서 수행합니다. 이미지가 사용자의 기기를 떠나지 않습니다. 이것이 Apple의 핵심 아키텍처입니다: 모든 ML 프레임워크(Vision, NaturalLanguage, Core ML, Speech)는 프라이버시를 보장하기 위해 온디바이스에서 작동합니다. Apple 서버로 전송되는 데이터는 없습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.