1. 시작하기 전에
이 시리즈의 첫 번째 Codelab에서는 이미지 라벨 지정을 사용하여 이미지의 콘텐츠를 파싱하는 매우 간단한 앱을 만들었습니다. 데이지 사진을 전달하면 꽃잎이나 하늘과 같은 항목이 표시되었습니다. 그런 다음 두 번째 Codelab에서는 Python으로 전환하여 5가지 유형의 꽃을 인식하는 새로운 맞춤 모델을 학습시켰습니다.
이 Codelab에서는 첫 번째 실습의 앱을 두 번째 실습의 모델로 업데이트합니다.
이 코드 실습의 전체 소스 코드는 이 저장소를 클론하여 가져올 수 있습니다. Android 및 iOS의 하위 디렉터리가 표시됩니다. 이전 Codelab의 코드는 따라 하려는 경우 ImageClassifierStep1로 사용할 수 있습니다. 이 Codelab의 완성된 코드는 ImageClassifierStep2로 사용할 수 있습니다.
기본 요건
- 이 학습 과정의 처음 두 Codelab을 완료해야 합니다.
빌드 및 학습할 항목
- 이전 실습에서 학습된 맞춤 모델을 Android 또는 iOS 앱에 통합합니다.
필요한 항목
- Android 스튜디오(실습의 Android 부분의 경우 developer.android.com/studio에서 사용 가능)
- Xcode(실습의 iOS 부분의 경우 Apple App Store에서 사용 가능)
2. 시작 앱 다운로드
먼저 Android 또는 iOS에서 첫 번째 컴퓨터 비전 앱 빌드 Codelab의 앱이 필요합니다. 실습을 진행한 경우 ImageClassifierStep1이라고 합니다. 실습을 진행하지 않으려면 저장소에서 완성된 버전을 클론하면 됩니다.
Android 스튜디오에서 열고 필요한 업데이트를 실행한 후 준비가 되면 앱을 실행하여 작동하는지 확인합니다. 다음과 같은 결과를 확인할 수 있습니다.

매우 기본적인 앱이지만 약간의 코드로 매우 강력한 기능을 보여줍니다. 하지만 이 꽃을 꽃이 아닌 데이지로 인식하려면 이미지 분류기용 맞춤 모델 만들기 Codelab의 맞춤 모델을 사용하도록 앱을 업데이트해야 합니다.
3. 맞춤 ML Kit 모델을 사용하도록 build.gradle 업데이트
- Android 스튜디오를 사용하여 앱 수준
build.gradle파일을 찾습니다. 가장 쉬운 방법은 프로젝트 탐색기를 사용하는 것입니다. 상단에서 Android 가 선택되어 있는지 확인하면 하단에 Gradle Scripts 폴더가 표시됩니다. - 여기에서와 같이 앱 이름 뒤에 '.app'이 오는 Module 용 파일을 엽니다(Module: ImageClassifierStep1.app).

- 파일 하단에서 dependencies 설정을 찾습니다. 다음 줄이 표시됩니다.
implementation 'com.google.mlkit:image-labeling:17.0.1'
버전 번호는 다를 수 있습니다. 항상 ML Kit 사이트(https://developers.google.com/ml-kit/vision/image-labeling/android)에서 최신 버전 번호를 찾으세요.
- 이를 맞춤 이미지 라벨 지정 라이브러리 참조로 바꿉니다. 이 버전 번호는 https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android에서 확인할 수 있습니다.
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
- 또한 이전 실습에서 만든 .tflite 모델을 추가합니다. Android 스튜디오에서 앱을 컴파일할 때 이 모델이 압축되지 않도록 하려면 동일한
build.gradle파일의 Android 섹션에서 이 설정을 사용해야 합니다.
aaptOptions{
noCompress "tflite"
}
다른 설정 내에 있지 않은지 확인합니다. android 태그 바로 아래에 중첩되어야 합니다. 예를 들면 다음과 같습니다.

4. TFLite 모델 추가
이전 Codelab에서 맞춤 모델을 만들고 model.tflite로 다운로드했습니다.
프로젝트에서 현재 flower1.jpg가 포함된 assets 폴더를 찾습니다. 다음과 같이 모델을 해당 폴더에 복사합니다.
- Android 스튜디오에서 Assets 폴더를 마우스 오른쪽 버튼으로 클릭합니다. 메뉴가 열리면 Reveal in Finder 를 선택합니다. (Windows에서는 'Show in Explorer', Linux에서는 'Show in Files')

- 파일 시스템의 디렉터리로 이동합니다.
model.tflite파일을flower1.jpg.와 함께 해당 디렉터리에 복사합니다.

Android 스튜디오가 업데이트되어 애셋 폴더에 두 파일이 모두 표시됩니다.

이제 코드를 업데이트할 준비가 되었습니다.
5. 맞춤 모델의 코드 업데이트
첫 번째 단계는 맞춤 모델을 로드하는 코드를 추가하는 것입니다.
MainActivity파일의onCreate에서setContentView(R.layout.activity_main)줄 바로 아래에 다음을 추가합니다.
그러면 LocalModel을 사용하여 model.tflite 애셋에서 빌드됩니다. Android 스튜디오에서 'LocalModel'을 빨간색으로 표시하여 불만을 제기하는 경우 ALT + Enter 를 눌러 라이브러리를 가져옵니다. 그러면 com.google.mlkit.common.model.LocalModel로 가져오기가 추가됩니다.
val localModel = LocalModel.Builder()
.setAssetFilePath("model.tflite")
.build()
이전에는 btn.setOnClickListener 핸들러에서 기본 모델을 사용했습니다. 다음 코드로 설정되었습니다.
val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
맞춤 모델을 사용하도록 이를 바꿉니다.
- 맞춤 옵션 객체를 설정합니다.
val options = CustomImageLabelerOptions.Builder(localModel)
.setConfidenceThreshold(0.7f)
.setMaxResultCount(5)
.build()
이렇게 하면 기본 옵션이 맞춤설정된 세트로 바뀝니다. 신뢰도 임곗값은 반환할 예측의 품질에 대한 기준을 설정합니다. 이 Codelab의 상단에 있는 샘플을 다시 살펴보면 이미지가 데이지인 경우 4개의 예측이 있으며 각 예측 옆에 'Sky'가 .7632인 것과 같은 값이 있습니다.
높은 신뢰도 임곗값을 사용하면 품질이 낮은 결과를 효과적으로 필터링할 수 있습니다. 예를 들어 이를 0.9로 설정하면 그보다 낮은 우선순위의 라벨이 반환되지 않습니다. setMaxResultCount()는 클래스가 많은 모델에서 유용하지만 이 모델에는 5개만 있으므로 5로 두면 됩니다.
이제 레이블러의 옵션이 있으므로 레이블러의 인스턴스화를 다음과 같이 변경할 수 있습니다.
val labeler = ImageLabeling.getClient(options)
나머지 코드는 수정 없이 실행됩니다. 직접 해보세요.

이제 이 꽃이 .959 확률로 데이지로 식별되었습니다.
두 번째 꽃 이미지를 추가하고 다시 실행해 보겠습니다.

장미로 식별합니다.
'장미'가 아닌 장미 라고 하는 이유가 궁금할 수 있습니다. 데이터 세트에서 라벨은 폴더 이름으로 지정되며, 아쉽게도 이러한 폴더 이름은 약간 일관성이 없으며 때로는 단수 (예: '데이지')를 사용하고 때로는 복수 (예: '장미')를 사용하기 때문입니다. 이를 이미지의 항목을 계산하려는 모델과 혼동하지 마세요. 훨씬 더 기본적인 모델이며 꽃 유형만 식별할 수 있습니다.
6. iOS 시작 앱 다운로드
- 먼저 첫 번째 Codelab의 앱이 필요합니다. 실습을 진행한 경우 ImageClassifierStep1이라고 합니다. 실습을 진행하지 않으려면 저장소에서 완성된 버전을 클론하면 됩니다. 저장소에 포드와 .xcworkspace가 없으므로 다음 단계로 진행하기 전에 .xcproject와 동일한 디렉터리에서 'pod install'을 실행해야 합니다.
- Xcode에서
ImageClassifierStep1.xcworkspace를 엽니다. 포드를 사용하여 ML Kit를 번들로 묶었으므로 .xcproject가 아닌 .xcworkspace를 사용해야 하며 작업 공간에서 이러한 포드를 로드합니다.
이 실습의 나머지 부분에서는 Codelab의 빌드 대상을 지원해야 하는 iPhone 시뮬레이터에서 앱을 실행합니다. 자체 기기를 사용하려면 프로젝트 설정에서 iOS 버전에 맞게 빌드 대상을 변경해야 할 수 있습니다.
실행하면 다음과 같은 결과가 표시됩니다.

매우 일반적인 분류(꽃잎, 꽃, 하늘)에 유의하세요. 이전 Codelab에서 만든 모델은 데이지를 포함한 5가지 꽃을 감지하도록 학습되었습니다.
이 Codelab의 나머지 부분에서는 맞춤 모델로 앱을 업그레이드하는 데 필요한 작업을 살펴봅니다.
7. 맞춤 ML Kit 이미지 레이블러 포드 사용
첫 번째 앱은 포드 파일을 사용하여 기본 ML Kit 이미지 레이블러 라이브러리 및 모델을 가져왔습니다. 맞춤 이미지 라벨 지정 라이브러리를 사용하도록 업데이트해야 합니다.
- 프로젝트 디렉터리에서
podfile이라는 파일을 찾습니다. 열면 다음과 같은 결과가 표시됩니다.
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- 다음과 같이 포드 선언을
ImageLabeling에서ImageLabelingCustom으로 변경합니다.
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- 완료되면 터미널을 사용하여 podfile(.xcworkspace 포함)이 포함된 디렉터리로 이동하고
pod install을 실행합니다.

잠시 후 MLKitImageLabeling 라이브러리가 삭제되고 맞춤 라이브러리가 추가됩니다. 이제 .xcworkspace를 열어 코드를 수정할 수 있습니다.
8. Xcode에 TFLite 모델 추가
이전 Codelab에서 맞춤 모델을 만들고 model.tflite로 다운로드했습니다. 이 모델이 없는 경우 돌아가서 해당 Codelab을 실행하거나 여기에서 Colab 코드를 살펴보세요. 여기. Google Colab에 액세스할 수 없는 경우 이 링크에서 노트북을 사용할 수 있습니다.
- Xcode에서 작업 공간을 연 상태에서 model.tflite를 프로젝트로 드래그합니다.
ViewController.swift또는Main.storyboard와 같은 나머지 파일과 동일한 폴더에 있어야 합니다. - 파일 추가 옵션이 있는 대화상자가 팝업됩니다. Add to Targets 가 선택되어 있는지 확인합니다. 그렇지 않으면 기기에 배포할 때 모델이 앱과 함께 번들로 묶이지 않습니다.
'Add to Targets' 항목에는 ImageClassifierStep1에서 시작하여 이 실습 단계를 단계별로 진행하는 경우 ImageClassifierStep1이 표시되고 완성된 코드로 건너뛴 경우 ImageClassifierStep2가 표시됩니다 (표시된 대로).

이렇게 하면 모델을 로드할 수 있습니다. 다음 단계에서 방법을 알아봅니다.
9. 맞춤 모델의 코드 업데이트
ViewController.swift파일을 엽니다. 파일 상단의 'import MLKitImageLabeling'에 오류가 표시될 수 있습니다. 포드 파일을 업데이트할 때 일반 이미지 라벨 지정 라이브러리를 삭제했기 때문입니다. 이 줄을 삭제하고 다음으로 업데이트하세요.
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
이러한 코드를 빠르게 읽고 동일한 코드가 반복된다고 생각하기 쉬울 수 있습니다. 하지만 끝에 'Common'과 'Custom'이 있습니다.
- 다음으로 이전 단계에서 추가한 맞춤 모델을 로드합니다.
getLabels()함수를 찾습니다.visionImage.orientation = image.imageOrientation줄 아래에 다음 줄을 추가합니다.
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
- 일반 ImageLabeler의 옵션을 지정하는 코드를 찾습니다. 이러한 라이브러리가 삭제되었으므로 오류가 발생할 수 있습니다.
let options = ImageLabelerOptions()
이를 다음 코드로 바꿔서 CustomImageLabelerOptions를 사용하고 로컬 모델을 지정합니다.
let options = CustomImageLabelerOptions(localModel: localModel)
...이것으로 끝입니다. 이제 앱을 실행해 보세요. 이미지를 분류하려고 하면 더 정확해지고 높은 확률로 데이지를 보고 있다고 알려줍니다.

두 번째 꽃 이미지를 추가하고 다시 실행해 보겠습니다.

앱에서 이 이미지가 '장미' 라벨과 일치하는 것을 감지했습니다.
10. 축하합니다.
이제 일반 모델을 사용하여 이미지의 콘텐츠를 인식하는 앱을 빌드하는 것부터 꽃과 같은 특정 항목을 인식하는 자체 ML 모델을 만들고 맞춤 모델을 사용하도록 앱을 업데이트하는 것까지 진행했습니다.
결과 앱은 번들 이미지 애셋에 의존하므로 매우 제한적입니다. 하지만 ML 부분은 잘 작동합니다. 예를 들어 AndroidX 카메라를 사용하여 실시간 피드에서 프레임을 가져와 분류하여 휴대전화에서 인식하는 꽃을 확인할 수 있습니다.
여기에서 가능성은 무궁무진합니다. 꽃 이외의 항목에 대한 자체 데이터가 있는 경우 컴퓨터 비전을 사용하여 인식하는 앱을 빌드하는 데 필요한 기반이 마련되어 있습니다. 이러한 단계는 훨씬 더 광범위한 세계로 나아가는 첫 번째 단계일 뿐이며, 이러한 단계를 진행하는 데 즐거우셨기를 바랍니다.