iOS 온디바이스 AI 실전 개요
1편에서 온디바이스 AI의 개념과 Apple/Google 전략을 살펴봤습니다. 2편에서는 iOS에서 실제로 어떻게 구현하는지, Core ML, Vision, Create ML 중심으로 코드와 함께 정리합니다.
iOS 온디바이스 AI 스택 한눈에
앱 레벨
├── Swift / SwiftUI (또는 UIKit)
├── Core ML → 모델 로드 & 추론 (VNDetectXXX, MLModel)
├── Vision → 이미지/비디오 분석 (객체 검출, 텍스트, 얼굴 등)
├── Natural Language → 텍스트 분류, NER, 감성 분석
└── Speech → 음성 인식 (온디바이스 옵션)
도구
├── Xcode → .mlmodel 통합, 디버깅
├── Create ML → 커스텀 모델 학습 후 Core ML 내보내기
└── coremltools (Python) → PyTorch/TF 모델 → Core ML 변환
1. Core ML로 모델 불러와 추론하기
1.1 모델 추가
- Xcode에서 File → Add Files로
.mlmodel추가. - 또는 Create ML / coremltools로 만든 모델을 프로젝트에 넣으면, Xcode가 자동으로 Swift 클래스를 생성합니다.
1.2 Swift에서 추론 (이미지 분류 예시)
import CoreML
import Vision
// Xcode가 생성한 모델 클래스 (이름은 .mlmodel 파일명에 따름)
guard let model = try? VNCoreMLModel(for: MyImageClassifier(configuration: MLModelConfiguration()).model) else {
fatalError("모델 로드 실패")
}
let request = VNCoreMLRequest(model: model) { request, error in
guard let results = request.results as? [VNClassificationObservation] else { return }
let top = results.prefix(3)
for r in top {
print("\(r.identifier): \(r.confidence)")
}
}
request.imageCropAndScaleOption = .centerCrop
// CVPixelBuffer 또는 CGImage로 실행
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
try? handler.perform([request])
- VNCoreMLRequest가 Core ML과 Vision을 이어주고, Neural Engine 사용은 시스템이 자동으로 선택합니다.
- 카메라 프레임(
CVPixelBuffer)이나CGImage를 그대로 넘기면 됩니다.
2. Vision 프레임워크로 즉시 사용하기
Core ML 커스텀 모델 없이도 Vision만으로 많은 기능을 쓸 수 있습니다. 모두 온디바이스입니다.
2.1 텍스트 인식 (VNRecognizeTextRequest)
import Vision
let request = VNRecognizeTextRequest { request, error in
guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
for obs in observations {
guard let text = obs.topCandidates(1).first?.string else { continue }
print(text)
}
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try? handler.perform([request])
2.2 얼굴 검출 (VNDetectFaceRectanglesRequest)
let faceRequest = VNDetectFaceRectanglesRequest { request, error in
guard let results = request.results as? [VNFaceObservation] else { return }
for face in results {
let box = face.boundingBox
// 정규화된 좌표 (0~1) → 뷰 좌표로 변환해 그리기
}
}
try? handler.perform([faceRequest])
2.3 객체 검출 (VNDetectObjectRectanglesRequest)
let objectRequest = VNDetectObjectRectanglesRequest { request, error in
guard let results = request.results as? [VNDetectedObjectObservation] else { return }
for obj in results {
print(obj.boundingBox, obj.labels)
}
}
try? handler.perform([objectRequest])
- 문서 스캔, 바코드, 동물/사람 검출 등 Vision에 내장된 요청을 조합하면 서버 없이 바로 구현 가능합니다.
3. Create ML로 커스텀 모델 만들기
Create ML은 Mac 앱으로, 데이터만 준비하면 이미지/텍스트/타블로이드 등 모델을 학습시키고 **Core ML(.mlmodel)**로 내보낼 수 있습니다.
3.1 이미지 분류 (Create ML 앱)
- Create ML 실행 → Image Classifier 새 프로젝트.
- 학습 데이터: 폴더명이 클래스명이 되도록 구성 (예:
cat/,dog/). - Train 후 Export →
.mlmodel저장. - Xcode 프로젝트에 추가하면 Swift에서 바로 사용 가능.
3.2 Swift에서 Create ML 모델 사용
let config = MLModelConfiguration()
config.computeUnits = .all // CPU + GPU + Neural Engine
let model = try MyImageClassifier(configuration: config)
let input = MyImageClassifierInput(image: pixelBuffer)
let output = try model.prediction(input: input)
print("예측: \(output.classLabel), 신뢰도: \(output.classLabelProbs[output.classLabel] ?? 0)")
- computeUnits:
.cpuOnly,.cpuAndGPU,.all중 선택..all이 Neural Engine까지 씁니다.
4. 실전 팁: 성능과 배터리
| 항목 | 권장 |
|---|---|
| 해상도 | 추론용 이미지는 224×224, 299×299 등 모델 입력 크기에 맞춰 리사이즈 후 넘기기 |
| 비동기 | DispatchQueue.global(qos: .userInitiated).async에서 추론 실행, UI는 메인에서 업데이트 |
| 캐싱 | 동일 이미지 재추론은 피하고, 필요 시 결과만 캐시 |
| computeUnits | 배터리 민감하면 .cpuAndGPU, 성능 우선이면 .all |
5. App Intents와 Siri 연동 (온디바이스)
iOS 16+ App Intents로 앱 기능을 Siri·단축어에 노출할 수 있고, 인텐트 처리 자체는 온디바이스에서 이뤄집니다.
import AppIntents
struct ClassifyImageIntent: AppIntent {
static var title: LocalizedStringResource = "이미지 분류"
@Parameter(title: "이미지")
var image: IntentFile?
func perform() async throws -> some IntentResult & ReturnsValue<String> {
guard let image = image else { return .result(value: "이미지 없음") }
// 이미지 로드 후 Core ML 추론
let result = await runOnDeviceClassification(image)
return .result(value: result)
}
}
- 사용자가 “Hey Siri, [앱 이름]에서 이미지 분류해줘”처럼 호출하면, 기기 안에서만 처리됩니다.
6. 2편 요약
- Core ML:
.mlmodel로드 후 Swift에서 추론. Vision의VNCoreMLRequest와 함께 쓰면 편리함. - Vision: 텍스트 인식, 얼굴/객체 검출 등 내장 요청으로 서버 없이 온디바이스 처리.
- Create ML: Mac에서 커스텀 이미지/텍스트 모델 학습 후 Core ML로 내보내기.
- App Intents: Siri·단축어 연동 시에도 추론은 온디바이스로 설계 가능.
3편에서는 **Android(AOS)**에서 ML Kit, TensorFlow Lite, Gemini Nano를 어떻게 쓰는지 실전 코드와 함께 다룹니다.
BlueFox Dev - iOS·Android 온디바이스 AI 완벽 가이드 2편