iOS·Android 온디바이스 AI 완벽 가이드 (2) - iOS 실전: Core ML과 Vision

온디바이스AIiOSCore MLVisionSwiftCreate ML

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 앱)

  1. Create ML 실행 → Image Classifier 새 프로젝트.
  2. 학습 데이터: 폴더명이 클래스명이 되도록 구성 (예: cat/, dog/).
  3. TrainExport.mlmodel 저장.
  4. 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편

궁금한 점이 있으신가요?

문의사항이 있으시면 언제든지 연락주세요.