1. 시작하기 전에

휴대전화 카메라로 물건을 가리키면 온라인에서 구매할 수 있는 곳을 찾을 수 있는 Google 렌즈 데모를 보셨나요? 앱에 동일한 기능을 추가하는 방법을 알아보려면 이 Codelab을 참고하세요. 이는 모바일 앱에 제품 이미지 검색 기능을 빌드하는 방법을 안내하는 학습 과정의 일부입니다.
이 Codelab에서는 제품 이미지 검색 기능을 빌드하는 첫 번째 단계인 이미지에서 객체를 감지하고 사용자가 검색할 객체를 선택하도록 하는 방법을 알아봅니다. ML Kit 객체 감지 및 추적을 사용하여 이 기능을 빌드합니다.
Vision API 제품 검색으로 제품 검색 백엔드를 빌드하는 방법을 비롯한 나머지 단계는 학습 과정에서 확인할 수 있습니다.
빌드할 항목
|
|
학습할 내용
- Android 애플리케이션에 ML Kit SDK를 통합하는 방법
- ML Kit 객체 감지 및 추적 API
필요한 항목
- Android 스튜디오 최신 버전 (v4.1.2 이상)
- Android 스튜디오 에뮬레이터 또는 실제 Android 기기
- 샘플 코드
- Kotlin을 사용한 Android 개발에 관한 기본 지식
이 Codelab에서는 ML Kit에 중점을 둡니다. 다른 개념과 코드 블록은 학습하지 않으며 간단히 복사하여 붙여넣을 수 있도록 제공됩니다.
2. 설정
코드 다운로드
다음 링크를 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.
다운로드한 ZIP 파일의 압축을 해제합니다. 그러면 필요한 모든 리소스가 포함된 루트 폴더 (odml-pathways-main)가 압축 해제됩니다. 이 Codelab에서는 product-search/codelab1/android 하위 디렉터리의 소스만 필요합니다.
mlkit-android 저장소의 object-detection 하위 디렉터리에는 다음 두 디렉터리가 포함되어 있습니다.
starter: 이 Codelab에서 빌드할 시작 코드입니다.
final: 완성된 샘플 앱의 완료된 코드입니다.
3. 프로젝트에 ML Kit 객체 감지 및 추적 API 추가
Android 스튜디오로 앱 가져오기
먼저 시작 앱을 Android 스튜디오로 가져옵니다.
Android 스튜디오로 이동하여 'Import Project (Gradle, Eclipse ADT, etc.)'를 선택하고 이전에 다운로드한 소스 코드에서 starter 폴더를 선택합니다.

ML Kit 객체 감지 및 추적 종속 항목 추가
ML Kit 종속 항목을 사용하면 앱에 ML Kit ODT SDK를 통합할 수 있습니다.
프로젝트의 app/build.gradle 파일로 이동하여 종속 항목이 이미 있는지 확인합니다.
build.gradle
dependencies {
// ...
implementation 'com.google.mlkit:object-detection:16.2.4'
}
프로젝트를 Gradle 파일과 동기화
앱에서 모든 종속 항목을 사용할 수 있도록 하려면 이 시점에서 프로젝트를 Gradle 파일과 동기화해야 합니다.
Android 스튜디오 툴바에서 Sync Project with Gradle Files (
)를 선택합니다.
(이 버튼이 사용 중지된 경우 전체 저장소가 아닌 starter/app/build.gradle만 가져왔는지 확인하세요.)
4. 시작 앱 실행
이제 프로젝트를 Android 스튜디오로 가져오고 ML Kit 객체 감지 및 추적의 종속 항목을 추가했으므로 앱을 처음으로 실행할 수 있습니다.
USB를 통해 Android 기기를 호스트에 연결하거나 Android 스튜디오 에뮬레이터를 시작하고 Android 스튜디오 툴바에서 실행 (
)을 클릭합니다.
앱 실행 및 탐색
Android 기기에서 앱이 실행됩니다. 이 파일에는 사진을 캡처하거나 사전 설정된 이미지를 선택하여 이 Codelab에서 빌드할 객체 감지 및 추적 파이프라인에 제공할 수 있는 상용구 코드가 있습니다. 코드를 작성하기 전에 앱을 조금 살펴봅니다.
먼저 하단에 버튼 (
)이 있습니다.
- 기기/에뮬레이터에 통합된 카메라 앱을 실행합니다.
- 카메라 앱에서 사진을 찍습니다.
- 시작 앱에서 캡처된 이미지를 수신합니다.
- 이미지 표시
'사진 찍기' 버튼을 사용해 보세요. 메시지에 따라 사진을 찍고, 사진을 수락하고, 스타터 앱 내부에 표시되는지 확인합니다.
두 번째로 선택할 수 있는 사전 설정 이미지가 3개 있습니다. 나중에 Android 에뮬레이터에서 실행하는 경우 이러한 이미지를 사용하여 객체 감지 코드를 테스트할 수 있습니다.
- 사전 설정된 3개의 이미지 중에서 이미지를 선택합니다.
- 이미지가 더 큰 뷰에 표시되는지 확인합니다.

5. 기기 내 객체 감지 추가
이 단계에서는 이미지에서 객체를 감지하는 기능을 시작 앱에 추가합니다. 이전 단계에서 보았듯이 시작 앱에는 기기의 카메라 앱으로 사진을 찍는 상용구 코드가 포함되어 있습니다. Android 에뮬레이터에서 Codelab을 실행하는 경우 객체 감지를 시도해 볼 수 있는 사전 설정 이미지도 앱에 3개 있습니다.
사전 설정된 이미지에서 선택하거나 카메라 앱으로 사진을 찍으면 상용구 코드가 이미지를 Bitmap 인스턴스로 디코딩하고, 화면에 표시하고, 이미지와 함께 runObjectDetection 메서드를 호출합니다.
이 단계에서는 runObjectDetection 메서드에 객체 감지를 위한 코드를 추가합니다.
이미지에서 기기 내 객체 감지 설정 및 실행
ML Kit ODT를 설정하는 데는 3개의 API를 사용하는 3가지 간단한 단계만 있습니다.
- 이미지 준비:
InputImage - 감지기 객체 생성:
ObjectDetection.getClient(options) - 위의 두 객체를 연결합니다.
process(image)
이는 MainActivity.kt 파일의 **runObjectDetection(bitmap: Bitmap)**함수 내에서 이루어집니다.
/**
* ML Kit Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
}
현재 함수가 비어 있습니다. 다음 단계로 이동하여 ML Kit ODT를 통합하세요. 이 과정에서 Android 스튜디오는 필요한 가져오기를 추가하라는 메시지를 표시합니다.
com.google.mlkit.vision.common.InputImagecom.google.mlkit.vision.objects.ObjectDetectioncom.google.mlkit.vision.objects.defaults.ObjectDetectorOptions
1단계: InputImage 만들기
ML Kit는 Bitmap에서 InputImage를 만드는 간단한 API를 제공합니다. 그런 다음 InputImage를 ML Kit API에 제공할 수 있습니다.
// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)
위 코드를 runObjectDetection(bitmap:Bitmap) 상단에 추가합니다.
2단계: 감지기 인스턴스 만들기
ML Kit은 빌더 디자인 패턴을 따르므로 구성을 빌더에 전달한 다음 여기에서 감지기를 획득합니다. 구성할 수 있는 옵션은 3가지입니다 (Codelab에서는 굵은 글씨로 표시된 옵션 사용).
- 감지기 모드 (단일 이미지 또는 스트림)
- 감지 모드 (단일 또는 여러 객체 감지)
- 분류 모드 (사용 또는 사용 중지)
이 Codelab은 단일 이미지 - 다중 객체 감지 및 분류를 위한 것입니다. 다음 단계를 따르세요.
// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
.setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
.enableMultipleObjects()
.enableClassification()
.build()
val objectDetector = ObjectDetection.getClient(options)
3단계: 감지기에 이미지 제공
객체 감지 및 분류는 비동기 처리입니다.
process()를 통해 감지기에 이미지를 전송합니다.- 감지기가 이 작업을 매우 열심히 수행합니다.
- 감지기가 콜백을 통해 결과를 다시 보고합니다.
다음 코드가 바로 그 역할을 합니다. fun runObjectDetection(bitmap:Bitmap)): 내의 기존 코드에 복사하여 추가하세요.
// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
.addOnSuccessListener {
// Task completed successfully
debugPrint(it)
}
.addOnFailureListener {
// Task failed with an exception
Log.e(TAG, it.message.toString())
}
완료되면 감지기가 다음을 통해 알림을 보냅니다.
- 감지된 총 객체 수
- 감지된 각 객체는
trackingId: 프레임 간에 추적하는 데 사용하는 정수 (이 Codelab에서는 사용하지 않음)boundingBox: 객체의 경계 상자- 감지된 객체의
labels:라벨 목록(분류가 사용 설정된 경우에만 해당) index(이 라벨의 색인을 가져옴)text('패션 상품', '음식', '홈 상품', '장소', '식물'을 포함한 이 라벨의 텍스트 가져오기)confidence(0.0~1.0 사이의 부동 소수점, 1.0은 100%를 의미)
코드에서 감지된 결과를 debugPrint()를 사용하여 Logcat에 출력하는 것을 확인했을 것입니다. MainActivity 클래스에 추가합니다.
private fun debugPrint(detectedObjects: List<DetectedObject>) {
detectedObjects.forEachIndexed { index, detectedObject ->
val box = detectedObject.boundingBox
Log.d(TAG, "Detected object: $index")
Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
detectedObject.labels.forEach {
Log.d(TAG, " categories: ${it.text}")
Log.d(TAG, " confidence: ${it.confidence}")
}
}
}
이제 감지를 위해 이미지를 수락할 수 있습니다.
Android 스튜디오 툴바에서 Run (
)을 클릭하여 Codelab을 실행합니다. 사전 설정된 이미지를 선택하거나 사진을 찍은 다음 IDE 내의 Logcat 창(
)을 확인합니다. 다음과 비슷한 모습이어야 합니다.
D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection: categories: Fashion good
D/MLKit Object Detection: confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection: categories: Home good
D/MLKit Object Detection: confidence: 0.75390625
즉, 감지기가 다음 객체 3개를 확인했습니다.
- 카테고리는 패션 상품과 가정용품입니다.
- 두 번째는 알 수 없는 클래스이므로 반환된 카테고리가 없습니다.
- 아니요 (단일 이미지 감지 모드이기 때문)
trackingId boundingBox직사각형 내부의 위치 (예: (481, 2021) – (2426, 3376))- 감지기는 첫 번째 이미지가 패션 상품 (90%)이라고 확신합니다(드레스임).
기술적으로 ML Kit 객체 감지를 작동하는 데 필요한 모든 것이 지금 갖춰져 있습니다. 수고하셨습니다.
예, UI 측면에서는 시작할 때와 같은 단계에 있지만 감지된 결과를 UI에서 활용하여 경계 상자를 그리는 등 더 나은 환경을 만들 수 있습니다. 다음 단계는 감지된 결과를 시각화하는 것입니다.
6. 감지 결과 후처리
이전 단계에서는 감지된 결과를 logcat에 출력했습니다. 간단하고 빠릅니다.
이 섹션에서는 이미지의 결과를 사용합니다.
- 이미지에 경계 상자 그리기
- 경계 상자 내에 카테고리 이름과 신뢰도 그리기
시각화 유틸리티 이해하기
감지 결과를 시각화하는 데 도움이 되는 상용구 코드가 Codelab 내에 있습니다. 이러한 유틸리티를 활용하여 시각화 코드를 간단하게 만듭니다.
class ImageClickableView감지 결과의 시각화 및 상호작용을 위한 편리한 유틸리티를 제공하는 이미지 뷰 클래스입니다.fun drawDetectionResults(results: List<DetectedObject>)이 메서드는 감지된 각 객체의 중앙에 흰색 원을 그립니다.fun setOnObjectClickListener(listener: ((objectImage: Bitmap) -> Unit))사용자가 탭한 객체만 포함된 잘린 이미지를 수신하는 콜백입니다. 나중에 Codelab에서 이 잘린 이미지를 이미지 검색 백엔드로 전송하여 시각적으로 유사한 결과를 얻습니다. 이 Codelab에서는 아직 이 메서드를 사용하지 않습니다.
ML Kit 감지 결과 표시
시각화 유틸리티를 사용하여 입력 이미지 위에 ML Kit 객체 감지 결과를 표시합니다.
debugPrint()를 호출하는 위치로 이동하여 아래에 다음 코드 스니펫을 추가합니다.
runOnUiThread {
viewBinding.ivPreview.drawDetectionResults(it)
}
실행하기
이제 Android 스튜디오 툴바에서 Run (
)을 클릭합니다.
앱이 로드되면 카메라 아이콘이 있는 버튼을 누르고, 카메라를 물체에 대고, 사진을 찍고, 카메라 앱에서 사진을 수락하거나, 사전 설정된 이미지를 탭하면 됩니다. 감지 결과가 표시됩니다. 버튼을 다시 누르거나 다른 이미지를 선택하여 몇 번 반복하고 최신 ML Kit ODT를 경험해 보세요.

7. 축하합니다.
ML Kit를 사용하여 앱에 객체 감지 기능을 추가했습니다.
- 3단계, 3개의 API
- 입력 이미지 만들기
- 검사 프로그램 만들기
- 감지기에 이미지 전송
이것으로 설정 및 실행이 완료됩니다.
학습한 내용
- Android 앱에 ML Kit 객체 감지 및 추적을 추가하는 방법
- ML Kit에서 기기 내 객체 감지 및 추적을 사용하여 이미지에서 객체를 감지하는 방법
다음 단계
- 감지된 객체를 제품 검색 백엔드로 전송하고 검색 결과를 표시하는 방법을 알아보려면 이 Codelab을 사용해 보세요.
- 더 많은 이미지와 라이브 동영상으로 ML Kit ODT를 자세히 살펴보고 감지 및 분류 정확도와 성능을 경험해 보세요.
- 객체 감지로 더 나아가기 학습 과정을 통해 맞춤 모델을 학습하는 방법을 알아보세요.
- 객체 감지 실시간 카메라 및 정적 이미지에 관한 Material Design 권장사항을 읽어보세요.
- 자체 Android 앱에 ML Kit ODT 적용