본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 26. 13:43

iOS에서의 온디바이스 AI (On-Device AI): 클라우드 호출 없이 스크린샷 분류기를 구축한 방법

요약

iOS 환경에서 개인정보 보호를 위해 클라우드 연결 없이 작동하는 온디바이스 AI 스크린샷 분류기 구축 방법을 소개합니다. Vision OCR, 규칙 기반 분류, 퍼셉추얼 해싱을 결합하여 효율적인 데이터 처리 파이프라인을 구현했습니다.

핵심 포인트

  • Vision OCR을 활용한 고정밀 텍스트 추출
  • LLM 대신 도메인 특화 휴리스틱을 통한 빠른 분류
  • pHash를 이용한 시각적 중복 이미지 탐지
  • 개인정보 보호를 위한 완전한 온디바이스 처리

스크린샷에 온디바이스 AI (On-Device AI)가 중요한 이유

스크린샷은 민감합니다. 가격, 항공편 상세 정보, 개인적인 대화, 금융 정보 등을 포함하고 있습니다. 이를 클라우드 AI에 업로드하는 것은 대부분의 사용자에게 고려 대상조차 되지 않습니다.

좋은 소식은 iOS가 완전히 온디바이스 (on-device)에서 실행되는 유능한 AI 파이프라인을 구축하는 데 필요한 모든 것을 제공한다는 점입니다. AI 스크린샷 정리 도구인 Snaap을 위해 제가 어떻게 구현했는지 소개합니다.

파이프라인 (The Pipeline)

1단계: 스크린샷 찾기

let options = PHFetchOptions()
options.predicate = NSPredicate(
    format: "mediaType == %d AND (mediaSubtypes & %d) != 0",
...

iOS는 스크린샷을 기본적으로 태깅하므로, 탐지를 위해 별도의 머신러닝 (ML) 모델이 필요하지 않습니다.

2단계: Vision OCR을 통한 텍스트 추출

let request = VNRecognizeTextRequest { request, error in
    let text = request.results?
        .compactMap { $0 as? VNRecognizedTextObservation }
...

.accurate 레벨을 사용한 VNRecognizeTextRequest는 제품 스크린샷의 작은 텍스트까지도 잡아냅니다. iPhone 14 Pro에서 약 600장의 이미지를 처리하는 데 약 90초가 소요됩니다.

3단계: 규칙 기반 분류 (Rule-Based Classification)

func classify(ocrText: String) -> Category {
    let text = ocrText.lowercased()

...

핵심 통찰은 다음과 같습니다: 동일한 카테고리의 스크린샷은 매우 예측 가능한 어휘를 공유한다는 점입니다. 항공권 예약은 항상 "boarding pass" 또는 "gate"라는 단어를 포함합니다. 영수증에는 항상 가격과 "total"이라는 단어가 있습니다. 이를 위해 거대언어모델 (LLM)이 필요하지 않습니다. 도메인 특화 휴리스틱 (domain-specific heuristics)이 더 효과적입니다.

4단계: 문맥 생성 (Context Generation)

func generateSentence(for screenshot: Screenshot) -> String {
    switch screenshot.category {
    case .travel:
...

문장들은 의사결정을 유도하도록 (prompt a decision) 설계되었습니다. "이미 도착하셨습니다"라는 문구는 삭제해도 안전하다는 느낌을 줍니다. "아직 필요하신가요?"는 선택의 여지를 남겨둡니다. 목표는 완벽한 정확도가 아니라, 삭제에 대한 두려움을 없애는 것입니다.

5단계: 퍼셉추얼 해싱 (Perceptual Hashing)을 이용한 중복 탐지

func computeHash(for image: UIImage) -> String? {
    // Resize to 8x8 grayscale
    // Compute average brightness
...

pHash는 한 이미지가 약간 잘리거나 타임스탬프(timestamp)가 다르더라도 시각적으로 동일한 스크린샷을 잡아냅니다. 제 라이브러리에서 존재조차 몰랐던 중복 항목 42개를 찾아냈습니다.

왜 LLM을 사용하지 않는가?

  1. 속도 (Speed): 규칙 기반 분류 (Rule-based classification)는 즉각적입니다. API 지연 시간 (latency)이 없습니다.
  2. 개인정보 보호 (Privacy): 어떤 데이터도 기기를 떠나지 않습니다. 스크린샷 콘텐츠에는 매우 중요한 요소입니다.
  3. 비용 (Cost): 토큰당 비용을 지불하는 대신 0달러가 듭니다.
  4. 신뢰성 (Reliability): 환각 (hallucinations) 현상이 없으며, API 중단 문제도 없습니다.
  5. 오프라인 (Offline): 비행기 안, 지하철 등 어디서나 작동합니다.

스크린샷 분류와 같이 제한된 도메인(domain)의 경우, LLM은 과합니다 (overkill). 어휘는 예측 가능하고, 카테고리는 명확하게 정의되어 있으며, 오분류(misclassification)로 인한 비용도 낮습니다 (사용자가 그냥 "기타"를 누르면 그만입니다).

결과 및 앱

Snaap은 App Store에서 무료로 제공됩니다: https://apps.apple.com/app/snaap-voucher-reminder-ai/id6770817204

OCR, 분류 (classification), 컨텍스트 생성 (context generation), 중복 탐지 (duplicate detection), 만료 확인 (expiry checking)을 포함한 전체 AI 파이프라인 (pipeline)이 기기 내에서 스크린샷당 약 0.15초 만에 실행됩니다. 네트워크 호출도, 백엔드(backend)도, 사용자 계정도 필요 없습니다.

사용자 데이터에 접근하는 iOS 앱을 구축하고 있다면, 온디바이스 AI (on-device AI)를 먼저 탐색해 볼 것을 강력히 권장합니다. 프레임워크는 견고하고, 개인정보 보호 측면의 명분은 강력하며, 사용자들도 이를 진심으로 높게 평가합니다.

Vision, PhotoKit, GRDB, SwiftUI + UIKit으로 구축되었습니다. iOS 16+ 지원.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
1

댓글

0