스크린샷을 읽고 왜 저장했는지 알려주는 AI를 만들었습니다
요약
사용자의 스크린샷을 분석하여 저장 의도를 파악하고 설명해주는 iOS 앱 'Snaap'의 개발 사례를 소개합니다. 온디바이스 OCR과 규칙 기반 분류를 활용하여 개인정보를 보호하면서 효율적인 스크린샷 관리를 지원합니다.
핵심 포인트
- Apple Vision 프레임워크를 활용한 온디바이스 OCR 구현
- 클라우드 API 없이 규칙 기반(Regex) 분류로 비용 및 보안 최적화
- pHash를 이용한 이미지 중복 탐지 기술 적용
- 스크린샷을 '외부화된 의도'로 정의하여 관리 문제 해결
문제점
제 iPhone에는 2,847개의 스크린샷이 있었습니다. 2023년의 탑승권, 스크린샷은 찍었지만 한 번도 구매하지 않은 제품들, 저장해두고 잊어버린 레시피, 이미 모두에게 보내버린 밈(Meme)들까지 말이죠.
Apple의 사진(Photos) 앱은 이것들을 그저... 사진으로 취급합니다. 실제로는 절반쯤 완성된 의도(intentions)임에도 불구하고 말입니다.
통찰
모든 스크린샷은 외부화된 의도 (externalized intention) 입니다. 즉, 당신이 무언가를 하려고, 사려고, 보려고, 혹은 기억하려고 했던 무언가입니다. 하지만 카메라 롤(camera roll)은 형편없는 작업 관리자(task manager)입니다.
사람들이 스크린샷을 삭제하지 않는 이유는 게으름 때문이 아니라, 중요한 것을 삭제할지도 모른다는 두려움 때문이라는 것을 깨달았습니다. 만약 각 스크린샷이 무엇인지 알 수 있다면, 단 1초 만에 결정을 내릴 수 있을 것입니다. 문제는 동기 부여가 아니라 정보입니다.
내가 만든 것
Snaap — 온디바이스 AI (on-device AI)를 통해 모든 스크린샷을 읽고 한 문장의 설명을 생성하는 iOS 앱입니다:
_"VN123 항공편 탑승권 — 2월 14일 출발함. 여행은 종료됨."
_"Instagram에서 본 Nike Air Max $89. 3개월 전 저장됨 — 아직 구매하지 않음."
_"8가지 재료가 들어가는 파스타 레시피. 4주 전 저장됨 — 요리한 적 없음."
왜 그것을 저장했는지 알게 되면, 유지할지 삭제할지에 대한 결정은 즉각적으로 이루어집니다.
작동 원리 (기술 스택)
1. 스크린샷 감지 (Screenshot Detection)
iOS는 PHAssetMediaSubtype.photoScreenshot을 노출하므로, 스크린샷을 찾기 위해 별도의 머신러닝 (ML)이 필요하지 않습니다. PhotoKit이 데이터 수집(ingestion)과 변경 사항 관찰(change observation)을 처리하므로 새로운 스크린샷이 자동으로 나타납니다.
2. 온디바이스 OCR (On-Device OCR)
Apple의 Vision 프레임워크 (VNRecognizeTextRequest)가 각 스크린샷에서 모든 텍스트를 추출합니다. 백그라운드 큐(background queue)에서 실행되며, 결과는 SQLite에 캐싱(cached)됩니다.
3. 규칙 기반 분류 (Rule-Based Classification)
GPT도, 클라우드도, API 호출도 사용하지 않습니다. 키워드와 정규 표현식 (regex) 분류기가 스크린샷을 다음 카테고리로 분류합니다:
- 영수증 (Receipt) (가격 패턴, "total", "invoice")
- 여행 (Travel) (항공 코드, "boarding pass", "gate")
- 레시피 (Recipe) ("ingredients", "tbsp", "preheat")
- 제품 (Product) ("add to cart", "buy now", "sale")
- 코드 (Code) ("func", "const", "import")
- 밈/기타 (Meme/Other) (기본값)
4. 문맥 생성 (Context Generation)
템플릿 엔진(Template engine)은 분류된 데이터와 추출된 데이터를 사람이 읽을 수 있는 문장으로 변환합니다. 날짜, 가격, 출처 앱, 그리고 저장된 후 경과된 시간 등이 모두 문장에 포함됩니다.
5. 중복 탐지 (Duplicate Detection)
지각 해싱 (Perceptual hashing, pHash): 8x8 그레이스케일로 크기를 조정하고, 비트 문자열을 계산한 뒤, 해밍 거리 (Hamming distance)가 10 미만인지 비교합니다.
6. 만료 탐지 (Expiry Detection)
정규 표현식 (Regex)을 사용하여 여행 관련 스크린샷에서 날짜를 추출하고 현재 날짜와 비교합니다. 만료된 탑승권은 삭제해도 안전합니다.
아키텍처 (Architecture)
SwiftUI (Splash, Scan, Home, Settings)
+
UIKit (UIPanGestureRecognizer 스와이프가 적용된 Inbox 카드 스택)
...
- 백엔드 없음. API 호출 없음. 사용자 계정 없음.
- 100% 온디바이스 (On-device). 스크린샷은 절대 휴대폰을 떠나지 않습니다.
- SwiftUI + UIKit 하이브리드. 정적인 화면에는 SwiftUI를, 제스처가 많은 카드 스택에는 UIKit을 사용합니다.
결과 (Results)
저의 첫 번째 실제 테스트 세션 결과입니다:
- 약 90초 만에 634개의 스크린샷 스캔 완료
- 89개의 만료 항목 자동 탐지
- 42개의 중복 항목 발견
- 4분 만에 612개 정리 완료
- 약 1.2 GB 용량 확보
배운 점 (What I Learned)
-
규칙 기반 AI (Rule-based AI)는 과소평가되어 있습니다. 스크린샷과 같이 제한된 도메인에서는 정규 표현식 (Regex)과 키워드가 속도, 비용, 개인정보 보호 측면에서 LLM보다 뛰어난 성능을 발휘합니다. 환각 (Hallucination) 현상도 없습니다.
-
스와이프 UX가 곧 제품입니다. AI는 빠른 결정을 내릴 수 있게 도와줄 뿐이며, 카드 스택과 제스처 인터페이스가 제품의 사용감을 결정합니다.
-
"왜 저장했는가"가 "정리"보다 중요합니다. 사용자들은 또 다른 파일 정리 시스템을 원하는 것이 아닙니다. 그들은 미완결된 의도에 대한 종결을 원합니다.
-
iOS는 훌륭한 기본 요소(Primitives)를 갖추고 있습니다.
PHAsset.photoScreenshot, Vision OCR, GRDB 등 OS는 개인정보 보호를 우선시하는 AI 앱을 만드는 데 필요한 모든 것을 제공합니다.
체험하기 (Try It)
Snaap은 App Store에서 무료로 이용할 수 있습니다: https://apps.apple.com/app/snaap-voucher-reminder-ai/id6770817204
개발자 커뮤니티의 피드백을 기다립니다. 특히 분류 방식과 스와이프 UX에 대한 의견이 궁금합니다!
Swift, SwiftUI, UIKit, Vision, PhotoKit, GRDB로 제작되었습니다. iOS 16 이상 지원.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기