티스토리 뷰
- 문서: Integrating your app with visual intelligence
- 예제 프로젝트 : Adopting App Intents to support system experiences
[1] 배경
카메라나 스크린샷을 통해 Visual Search 를 하면 아래의 메소드가 타게 되고

SemanticContentDescriptor 를 통해 이미지에 대한 정보를 얻어올 수 있다.

SemanticContentDescriptor 는 labels, pixelBuffer 를 제공하는데 label 을 단독으로 쓸 수 없다.
굉장히 광범위한 label 정보를 주기 때문이다. (예를들어 스콘을 이미지 검색하면 bread 도 아니고 food 라는 label 을 준다.)
label 은 부가적인 정보일 뿐이고 visual intelligence 기능은 pixelBuffer 를 메인으로 사용해야하며
구글처럼 기존에 이미지 검색 기능을 제공하는 서비스가 타겟이라고 한다.
그럼 pixelBuffer 를 통한 이미지 검색을 제공하지 않는 곳은 정확한 label 정보를 얻기 위해
한단계를 더 거쳐야하는데, 어떤 방법이 있을 지 & 성능이 괜찮을 지 알아보자!
[2] 사전 지식 : CVReadOnlyPixelBuffer -> CVPixelBuffer 로 변환하기
CVReadOnlyPixelBuffer (iOS 26+) 를
기존에 쓰던 pixelBuffer 로 변환하려면 withUnsafeBuffer 를 사용하면 된다.

AI 는 자꾸 CVPixelBuffer 로 타입캐스팅 하라고 코드를 짜주는 데 타입캐스팅 실패한다.
이 메소드를 기억하자.
[3] PixelBuffer 로 Label 을 구하는 방법
1) Google MediaPipe의 Object Detector
- 모델을 선택해서 앱에 넣는 방식
ㄴ 테스트해보니 문서에 나온 것처럼 EfficientDet-Lite2 가 EfficientDet-Lite0 에 비해 속도는 느리지만 정확성이 높아서 이 모델로 선택!
- SPM 지원안해서 cocoapod 으로 의존성 설치해야함
- 모델을 선택해서 앱에 넣는 방식
ㄴ 과거와 달리 mlmodel 이 아니라 mlpackage 인데 그냥 다운받아서 넣으면 된다.
- 예전에는 Core ML 모델이 보통 .mlmodel 하나의 파일로 배포됐습니다.
- 요즘(특히 Core ML Tools 4+ / iOS 14+)은 모델이 크거나 여러 파일이 필요할 때 **.mlpackage**라는 디렉토리 번들 형식으로 내보내기도 해요.
- Build하면 Xcode가 자동으로 .mlmodelc(컴파일된 Core ML 모델)로 바꿔서 번들 안에 포함시킵니다.
- .mlmodel이든 .mlpackage든 직접 번들에 넣으면 Xcode가 빌드 과정에서 mlmodelc로 변환합니다. 런타임에서는 항상 .mlmodelc를 불러오게 돼요.
ㄴ 테스트해보니 FastViT, DETRResnet50SemanticSegmentationF16 보다 YOLOv3 결과가 더 잘나와서 선택! (근데 FastViT, DETR 이 더 최신 모델이고 정확도가 높다고 한다... 흠)
- API Request 하는 방식 (과금)
ㄴ 매월 1,000건까지는 무료
- 구글 콘솔 접속 -> 프로젝트 생성 -> Cloud Vision API 를 활성화 -> API 키 생성 하는 과정이 필요하다.
ㄴ API 키로 처음 요청하면 에러에 결제 계좌 등록 링크가 내려오는 데 이것까지 해줘야한다!
[4] 비교
1. SemanticContentDescriptor > labels (confidence 미제공)
2. GoogleObjectDetector with EfficientDet-Lite2 모델
3. CoreMLObjectDetector with YOLOv3 모델
4. GoogleVisionAPIObjectDetector
4가지를 비교해보자 (스샷 후, 물체를 특정해서 검색함)
GoogleVisionAPI 압승이다 압승...
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
메론빵도 안다구 ??![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
[5] 결론
GoogleVisionAPI 를 사용하면 꽤 명확한 label 정보를 얻을 수 있다
(+ food, ingredient, table 관련 label 필터링 하고 쓰면)
(+ 사용자가 정확하게 물체를 선택해서 검색하면)
완벽하진 않지만, Visual Intelligence -> GoogleVisionAPI -> label 정보로 검색결과 제공할 수 있을 듯!
'🍏 > iOS' 카테고리의 다른 글
| [iOS] NSCollectionLayoutSupplementaryItem 헷갈리는 것 정리 (0) | 2024.12.11 |
|---|---|
| [iOS] 프리뷰 빌드인 지 아는 법 (3) | 2024.07.09 |
| [iOS] Apple Intelligence > Genmoji (2) | 2024.07.04 |
| [iOS] 웹뷰 인스펙터, 웹뷰 디버깅 (0) | 2024.06.28 |
| [Xcode] Swift Package Plugin (3) | 2024.04.30 |
- Total
- Today
- Yesterday
- cocoapod
- Django Heroku Scheduler
- Flutter getter setter
- PencilKit
- Sketch 누끼
- ribs
- SerializerMethodField
- 장고 URL querystring
- flutter build mode
- Flutter 로딩
- Dart Factory
- METAL
- 구글 Geocoding API
- flutter deep link
- Django FCM
- github actions
- Watch App for iOS App vs Watch App
- 장고 Custom Management Command
- 플러터 싱글톤
- ipad multitasking
- 플러터 얼럿
- flutter dynamic link
- DRF APIException
- Python Type Hint
- Flutter Text Gradient
- drf custom error
- Flutter Spacer
- flutter 앱 출시
- Django Firebase Cloud Messaging
- Flutter Clipboard
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |













