Apple의 Core ML과 Vision 프레임워크를 사용하여 iOS 앱에서 머신러닝 모델을 적용하고, 카메라로 촬영한 이미지를 실시간으로 분류하는 애플리케이션을 구현하는 방법을 배웠습니다.
Core ML은 Apple에서 제공하는 머신러닝 프레임워크로, iOS, macOS, watchOS, tvOS 등 Apple 플랫폼에서 머신러닝 모델을 쉽게 활용할 수 있도록 도와줍니다.
온디바이스(On-Device) 실행
모든 모델은 기기에서 실행되며, 네트워크 연결이 필요하지 않아 보안성과 반응성이 높음.
다양한 모델 호환성
TensorFlow, PyTorch 등 외부 도구에서 만든 모델도 Core ML Converter를 통해 변환 가능.
고성능 최적화
Apple의 Metal과 Accelerate 프레임워크로 하드웨어 가속 지원.
Static Model
미리 훈련된 모델로 네트워크 연결 없이 실행 가능.
Vision은 이미지를 분석하고 처리할 수 있는 Core ML 기반의 프레임워크입니다.
Core ML과 함께 사용하면, 이미지에서 객체를 인식하거나 텍스트를 추출하는 등의 작업을 쉽게 처리할 수 있습니다.
주요 기능
이미지 분류: Core ML 모델과 연동해 객체를 분류.
텍스트 인식: 이미지에서 텍스트를 추출.
얼굴 인식: 얼굴 특징 분석.
목표: 카메라로 촬영한 이미지를 머신러닝 모델을 사용해 분류.
사용 모델: 사전에 훈련된 꽃 이름 분류 모델(예: FlowerClassifier).
키 기술: Core ML, Vision, UIImagePickerController.
📌 1. Core ML과 Vision 프레임워크 임포트
import CoreML
import Vision
Core ML은 머신러닝 모델을 로드하고, Vision은 이미지를 Core ML 모델에 전달하여 처리합니다.
📌 2. UIImagePickerController를 활용한 카메라 연동
var imagePicker: UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .camera
picker.allowsEditing = true
return picker
}
@IBAction func cameraTapped(_ sender: UIBarButtonItem) {
present(imagePicker, animated: true)
}
UIImagePickerController: 카메라 앱을 호출하여 사진을 촬영하거나 갤러리에서 이미지를 선택.
allowsEditing: 사용자가 선택한 이미지를 편집할 수 있는 옵션.
📌 3. Vision과 Core ML을 활용한 이미지 분석
이미지 분석 과정:
Core ML 모델(FlowerClassifier)을 로드.
Vision의 VNCoreMLRequest로 요청 생성.
VNImageRequestHandler를 통해 이미지 분석 요청 처리.
func detect(image: CIImage) {
// Core ML 모델 로드
guard let coreMLModel = try? FlowerClassifier(configuration: MLModelConfiguration()),
let visionModel = try? VNCoreMLModel(for: coreMLModel.model) else {
fatalError("Loading Core ML Model Failed")
}
// Vision 요청 생성
let request = VNCoreMLRequest(model: visionModel) { request, error in
guard error == nil else {
fatalError("Failed Request")
}
guard let classification = request.results as? [VNClassificationObservation] else {
fatalError("Failed to classify image")
}
// 결과 출력
if let firstResult = classification.first {
print("Prediction: \(firstResult.identifier), Confidence: \(firstResult.confidence)")
self.navigationItem.title = firstResult.identifier.capitalized
}
}
// Vision 핸들러로 이미지 처리
let handler = VNImageRequestHandler(ciImage: image)
do {
try handler.perform([request])
} catch {
print("Image processing error: \(error)")
}
}
주요 로직 분석:
CIImage 변환:
Core ML은 CIImage 타입으로 이미지를 처리해야 함.
VNCoreMLModel:
Core ML 모델을 Vision에서 사용하기 위해 캡슐화.
VNCoreMLRequest:
머신러닝 모델로 이미지를 분석하고 결과를 반환.
VNClassificationObservation:
분류 결과를 저장하는 객체.
📌 4. 사진 선택 후 Core ML 모델로 처리
UIImagePickerController를 통해 선택된 이미지를 Core ML로 전달:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
picker.dismiss(animated: true)
guard let userPickedImage = info[.editedImage] as? UIImage,
let coreImage = CIImage(image: userPickedImage) else {
fatalError("Failed to load image")
}
imageView.image = userPickedImage
detect(image: coreImage)
}
사용자가 사진 촬영.
UIImagePickerController가 사진을 반환.
Core ML 모델이 사진을 분석.
가장 높은 정확도의 결과를 네비게이션 바 타이틀에 표시.
데이터 증강(Augmentation):
학습 데이터가 적을 경우, 노이즈나 회전된 이미지를 추가해 성능 향상 가능.
반복 학습(Iterations):
모델 학습 반복 횟수를 늘려 성능 개선.
UI 개선:
분석 결과를 텍스트뿐 아니라 이미지와 함께 표시.
Core ML과 Vision의 강력함:
머신러닝 모델을 활용한 복잡한 작업도 간단히 구현 가능.
데이터 준비의 중요성:
모델의 성능은 학습 데이터의 품질에 달려 있음.
직관적인 API:
Vision 프레임워크는 Core ML과의 연동을 쉽게 만들어 줌.
import UIKit
import CoreML
import Vision
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
var imagePicker: UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .camera
picker.allowsEditing = true
return picker
}
@IBAction func cameraTapped(_ sender: UIBarButtonItem) {
present(imagePicker, animated: true)
}
}
extension ViewController: UIImagePickerControllerDelegate & UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
picker.dismiss(animated: true)
guard let userPickedImage = info[.editedImage] as? UIImage,
let coreImage = CIImage(image: userPickedImage) else {
fatalError("Failed to load image")
}
imageView.image = userPickedImage
detect(image: coreImage)
}
}
extension ViewController {
func detect(image: CIImage) {
guard let coreMLModel = try? FlowerClassifier(configuration: MLModelConfiguration()),
let visionModel = try? VNCoreMLModel(for: coreMLModel.model) else {
fatalError("Loading Core ML Model Failed")
}
let request = VNCoreMLRequest(model: visionModel) { request, error in
guard error == nil else {
fatalError("Failed Request")
}
guard let classification = request.results as? [VNClassificationObservation] else {
fatalError("Failed to classify image")
}
if let firstResult = classification.first {
self.navigationItem.title = firstResult.identifier.capitalized
}
}
let handler = VNImageRequestHandler(ciImage: image)
do {
try handler.perform([request])
} catch {
print("Image processing error: \(error)")
}
}
}
Core ML과 Vision은 iOS 애플리케이션에서 머신러닝을 쉽게 구현할 수 있는 도구입니다. 데이터 준비와 모델 학습에 신경을 쓴다면, 간단하면서도 강력한 기능을 구현할 수 있습니다.