TensorFlow Lite (Android)를 사용하여 커스텀 객체 감지 모델 빌드 및 배포

1. 시작하기 전에

이 Codelab에서는TFLite 모델 메이커 그런 다음 모델을 사용하여 Android 앱에 모델을 배포합니다.TFLite 작업 라이브러리 가 있는지 진단합니다. 다음을 수행합니다.

  • 식사 이미지의 성분을 감지하는 Android 앱을 빌드합니다.
  • 선행 학습된 TFLite 객체 감지 모델을 통합하고 모델이 감지할 수 있는 한계를 확인하세요.
  • 샐러드와 TFLite 모델 메이커를 사용해 식사의 재료/구성요소를 감지하도록 커스텀 객체 감지 모델을 학습시킵니다.
  • TFLite 작업 라이브러리를 사용하여 Android 앱에 커스텀 모델을 배포합니다.

마지막으로 아래 이미지와 비슷한 항목을 만듭니다.

b9705235366ae162.png

기본 요건

이 Codelab은 머신러닝 경험이 있는 모바일 개발자를 위해 설계되었습니다. 다음을 잘 알고 있어야 합니다.

  • Kotlin과 Android 스튜디오를 사용한 Android 개발
  • 기본 Python 구문

과정 내용

  • TFLite Model Maker를 사용하여 커스텀 객체 감지 모델을 학습시키는 방법
  • TFLite 작업 라이브러리를 사용하여 TFLite 객체 감지 모델을 배포하는 방법

준비물

  • 최신 버전의 Android 스튜디오 (v4.2 이상)
  • Android 스튜디오 에뮬레이터 또는 실제 Android 기기
  • 샘플 코드
  • Kotlin의 Android 개발에 관한 기본 지식

2 객체 감지

객체 감지는 디지털 이미지에서 객체를 감지하고 찾을 수 있는 컴퓨터 비전 작업 집합입니다. 이미지 또는 동영상 스트림을 통해 객체 감지 모델은 알려진 객체 집합 중 어느 것이 있는지 식별하고 이미지 내의 위치에 대한 정보를 제공할 수 있습니다.

TensorFlow는 자동차, 오렌지와 같은 일반적인 객체를 감지할 수 있는 선행 학습된 모바일 최적화 모델을 제공합니다. 단 몇 줄의 코드로 모바일 앱에 선행 학습된 모델을 통합할 수 있습니다. 하지만 더 뚜렷하고 이례적인 카테고리의 객체를 감지해야 하거나 필요할 수 있습니다. 자체 학습 이미지를 수집한 다음 자체 객체 감지 모델을 학습시키고 배포해야 합니다.

TensorFlow Lite

TensorFlow Lite는 Android 및 iOS 휴대기기를 비롯한 에지 기기에서 머신러닝 모델을 실행하도록 최적화된 크로스 플랫폼 머신러닝 라이브러리입니다.

TensorFlow Lite는 ML Kit에서 머신러닝 모델을 실행하는 데 사용되는 핵심 엔진입니다. TensorFlow Lite 생태계에는 휴대기기에서 머신러닝 모델을 쉽게 학습시키고 배포하는 데 도움이 되는 두 가지 구성요소가 있습니다.

  • Model Maker는 단 몇 줄의 코드만으로 사용자의 데이터를 사용하여 TensorFlow Lite 모델을 손쉽게 학습시킬 수 있는 Python 라이브러리로, 머신러닝에 대한 전문 지식이 필요하지 않습니다.
  • 작업 라이브러리는 모바일 앱의 코드 몇 줄만으로 TensorFlow Lite 모델을 손쉽게 배포할 수 있게 해주는 크로스 플랫폼 라이브러리입니다.

이 Codelab에서는 TFLite에 중점을 둡니다. TFLite와 객체 감지와 관련 없는 개념과 코드 블록은 설명되지 않으며 간단히 복사하여 붙여넣을 수 있도록 제공됩니다.

3. 설정

코드 다운로드

다음 링크를 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.

다운로드한 ZIP 파일의 압축을 해제합니다. 그러면 필요한 모든 리소스가 포함된 루트 폴더 (odml-pathways-main)가 압축 해제됩니다. 이 Codelab에서는 object-detection/codelab2/android 하위 디렉터리의 소스만 필요합니다.

object-detection/codelab2/android 저장소의 android 하위 디렉터리에는 두 디렉터리가 포함됩니다.

  • android_studio_folder.pngstarter: 이 Codelab에서 빌드하는 시작 코드입니다.
  • android_studio_folder.png최종: 완료된 샘플 앱의 완성된 코드입니다.

시작 앱 가져오기

먼저 시작 앱을 Android 스튜디오로 가져옵니다.

  1. Android 스튜디오를 열고 Import Project (Gradle, Eclipse ADT 등)를 선택합니다.
  2. 이전에 다운로드한 소스 코드에서 starter 폴더를 엽니다.

7c0f27882a2698ac.png

앱에서 모든 종속 항목을 사용할 수 있도록 하려면 가져오기 프로세스가 완료되었을 때 프로젝트를 Gradle 파일과 동기화해야 합니다.

  1. Android 스튜디오 툴바에서 Sync Project with Gradle Files ( b451ab2d04d835f9.png)를 선택합니다. starter/app/build.gradle 가져오기

시작 앱 실행

프로젝트를 Android 스튜디오로 가져왔으므로 이제 앱을 처음으로 실행할 수 있습니다.

USB를 통해 Android 기기를 컴퓨터에 연결하거나 Android 스튜디오 에뮬레이터를 시작하고 Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다.

4. 시작 앱 이해

이 Codelab을 단순하게 유지하고 머신러닝 비트에 집중하기 위해, 시작 앱에는 몇 가지 상용구 코드가 몇 가지 포함되어 있습니다.

  • 기기의 카메라를 사용하여 사진을 찍을 수 있습니다.
  • Android Emulator에서 객체 감지를 사용해 볼 수 있는 스톡 이미지가 포함되어 있습니다.
  • 입력 비트맵에 객체 감지 결과를 그리는 편리한 방법이 있습니다.

대부분 앱 스켈레톤에서 다음 메서드와 상호작용합니다.

  • fun runObjectDetection(bitmap: Bitmap) 미리 설정된 이미지를 선택하거나 사진을 찍으면 이 메서드가 호출됩니다. bitmap는 객체 감지를 위한 입력 이미지입니다. 이 Codelab의 뒷부분에서 이 메서드에 객체 감지 코드를 추가합니다.
  • data class DetectionResult(val boundingBoxes: Rect, val text: String) 시각화를 위한 객체 감지 결과를 나타내는 데이터 클래스입니다. boundingBoxes는 객체가 있는 직사각형이고 text는 객체의 경계 상자와 함께 표시할 감지 결과 문자열입니다.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<DetectionResult>): Bitmap 이 메서드는 입력 bitmapdetectionResults에 객체 감지 결과를 그리고 수정된 복사본을 반환합니다.

다음은 drawDetectionResult 유틸리티 메서드의 출력 예입니다.

f6b1e6dad726e129.png

5 기기 객체 감지 추가

이제 공통 객체를 시작 앱에 감지할 수 있는 선행 학습된 TFLite 모델을 통합하여 프로토타입을 빌드해 보겠습니다.

선행 학습된 TFLite 객체 감지 모델 다운로드

TensorFlow Hub에는 사용할 수 있는 몇 가지 객체 감지기 모델이 있습니다. 이 Codelab에서는 COCO 2017 데이터 세트에서 학습되고 TFLite에 최적화되고 모바일 CPU, GPU의 성능에 맞게 설계된 EfficientDet-Lite Object 감지 모델을 다운로드합니다. , EdgeTPU

다음으로, TFLite 작업 라이브러리를 사용하여 선행 학습된 TFLite 모델을 시작 앱에 통합합니다. TFLite 작업 라이브러리를 사용하면 모바일에 최적화된 머신러닝 모델을 모바일 앱에 쉽게 통합할 수 있습니다. 객체 감지, 이미지 분류, 텍스트 분류를 비롯하여 널리 사용되는 머신러닝 사용 사례를 많이 지원합니다. 코드 몇 줄로 TFLite 모델을 로드하고 실행할 수 있습니다.

시작 앱에 모델 추가

  1. 방금 다운로드한 모델을 시작 앱의 assets 폴더에 복사합니다. 이 폴더는 Android 스튜디오의 Project 탐색 패널에서 찾을 수 있습니다.

C2609599b7d22641.png

  1. 파일 이름을 model.tflite로 지정합니다.

C83e9397177c4561.png

Gradle 파일 작업 라이브러리 종속 항목 업데이트

app/build.gradle 파일로 이동하여 다음 줄을 dependencies 구성에 추가합니다.

implementation 'org.tensorflow:tensorflow-lite-task-vision:0.3.1'

프로젝트를 Gradle 파일과 동기화하기

앱에서 모든 종속 항목을 사용할 수 있도록 하려면 이 시점에서 프로젝트를 Gradle 파일과 동기화해야 합니다. Android 스튜디오 툴바에서 Sync Project with Gradle Files ( b451ab2d04d835f9.png)를 선택합니다.

(이 버튼을 사용 중지한 경우 전체 저장소가 아닌 starter/app/build.gradle만 가져오세요.)

이미지에서 기기 객체 감지 설정 및 실행

객체 감지 모델을 로드하고 실행하려면 3개의 API로 간단한 3단계만 거치면 됩니다.

  • 이미지 / 스트림 준비: TensorImage
  • 검사 프로그램 객체 ObjectDetector를 만듭니다.
  • 위의 두 객체 연결: detect(image)

MainActivity.kt 파일의 runObjectDetection(bitmap: Bitmap) 함수 내에서 가능합니다.

/**
* TFLite Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
    //TODO: Add object detection code here
}

현재 함수는 비어 있습니다. 다음 단계로 이동하여 TFLite 객체 감지기를 구현합니다. 그 과정에서 Android 스튜디오에 필요한 가져오기를 추가하라는 메시지가 표시됩니다.

  • org.tensorflow.lite.support.image.TensorImage
  • org.tensorflow.lite.task.vision.detector.ObjectDetector

이미지 객체 만들기

이 Codelab에 사용할 이미지는 기기 내 카메라 또는 앱의 UI에서 선택한 미리 설정된 이미지를 사용합니다. 입력 이미지는 Bitmap 형식으로 디코딩되고 runObjectDetection 메서드에 전달됩니다.

TFLite는 Bitmap에서 TensorImage를 생성하는 간단한 API를 제공합니다. 아래의 코드를 runObjectDetection(bitmap:Bitmap) 상단에 추가합니다.

// Step 1: create TFLite's TensorImage object
val image = TensorImage.fromBitmap(bitmap)

검사 프로그램 인스턴스 만들기

TFLite 작업 라이브러리는 빌더 디자인 패턴을 따릅니다. 구성을 빌더에 전달한 다음, 여기에서 감지기를 획득합니다. 객체 감지기의 민감도를 조정하는 옵션을 비롯하여 몇 가지 옵션을 구성할 수 있습니다.

  • 최대 결과 (모델에서 감지해야 하는 최대 객체 수)
  • 점수 임계값 (감지된 객체를 반환하는 객체 감지기의 신뢰도)
  • 라벨 허용 목록/거부 목록 (사전 정의된 목록에서 객체 허용/거부)

TFLite 모델 파일 이름과 구성 옵션을 지정하여 객체 감지기 인스턴스를 초기화합니다.

// Step 2: Initialize the detector object
val options = ObjectDetector.ObjectDetectorOptions.builder()
    .setMaxResults(5)
    .setScoreThreshold(0.5f)
    .build()
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "model.tflite", // must be same as the filename in assets folder
    options
)

검사 프로그램에 피드 이미지

다음 코드를 fun runObjectDetection(bitmap:Bitmap)에 추가합니다. 이렇게 하면 이미지가 검사 프로그램에 전달됩니다.

// Step 3: feed given image to the model and print the detection result
val results = detector.detect(image)

완료되면 감지기는 Detection 목록을 반환하며, 각 목록에는 모델이 이미지에서 발견한 객체에 대한 정보가 포함됩니다. 각 객체에 대한 설명은 다음과 같습니다.

  • boundingBox: 이미지 내에서 객체의 존재와 위치를 선언하는 직사각형
  • categories: 객체의 종류 및 감지 결과에 대한 모델의 신뢰도입니다. 이 모델은 여러 카테고리를 반환하고 가장 신뢰도 높은 카테고리를 먼저 반환합니다.
  • label: 객체 카테고리의 이름입니다.
  • classificationConfidence: 0.0~1.0 범위의 부동 소수점 수, 1.0: 100%

다음 코드를 fun runObjectDetection(bitmap:Bitmap)에 추가합니다. 이 메서드는 객체 감지 결과를 Logcat에 출력하는 메서드를 호출합니다.

// Step 4: Parse the detection result and show it
debugPrint(results)

그런 다음 이 debugPrint() 메서드를 MainActivity 클래스에 추가합니다.

private fun debugPrint(results : List<Detection>) {
    for ((i, obj) in results.withIndex()) {
        val box = obj.boundingBox

        Log.d(TAG, "Detected object: ${i} ")
        Log.d(TAG, "  boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")

        for ((j, category) in obj.categories.withIndex()) {
            Log.d(TAG, "    Label $j: ${category.label}")
            val confidence: Int = category.score.times(100).toInt()
            Log.d(TAG, "    Confidence: ${confidence}%")
        }
    }
}

이제 객체 감지기가 준비되었습니다. Android 스튜디오 툴바에서 Run ( execute.png)을 클릭하여 앱을 컴파일하고 실행합니다. 앱이 기기에 표시되면 미리 설정된 이미지 중 하나를 탭하여 객체 감지기를 시작합니다. 그런 다음 IDE 내의 Logcat 창*(* 16bd6ea224cf8cf1.png*)* 을 보면 다음과 유사한 것을 볼 수 있습니다.

D/TFLite-ODT: Detected object: 0
D/TFLite-ODT:   boundingBox: (0.0, 15.0) - (2223.0,1645.0)
D/TFLite-ODT:     Label 0: dining table
D/TFLite-ODT:     Confidence: 77%
D/TFLite-ODT: Detected object: 1
D/TFLite-ODT:   boundingBox: (702.0, 3.0) - (1234.0,797.0)
D/TFLite-ODT:     Label 0: cup
D/TFLite-ODT:     Confidence: 69%

검사 프로그램이 객체 2개를 확인했음을 나타냅니다. 첫 번째는 다음과 같습니다.

  • 객체가 (0, 15) – (2223, 1645)의 직사각형 안에 있습니다.
  • 라벨은 식탁
  • 이 모델은 첫 번째 자리가 식탁 (77%)이라고 확신합니다.

TFLite 작업 라이브러리를 작동하는 데 필요한 모든 기술적만 갖추면 됩니다. 바로 이 모든 것이 가능합니다. 축하합니다.

그러나 UI 측에서는 여전히 출발점에 있습니다. 이제 감지된 결과를 후처리하여 UI에서 감지된 결과를 사용해야 합니다.

6. 입력 이미지에 감지 결과 그리기

이전 단계에서는 감지 결과를 logcat에 간단하고 빠르게 출력했습니다. 이 단계에서는 시작 앱에 이미 구현된 유틸리티 메서드를 사용하여 다음을 수행합니다.

  • 이미지에 경계 상자 그리기
  • 경계 상자 내에 카테고리 이름과 신뢰도 백분율을 그립니다.
  1. debugPrint(results) 호출을 다음 코드 스니펫으로 바꿉니다.
val resultToDisplay = results.map {
    // Get the top-1 category and craft the display text
    val category = it.categories.first()
    val text = "${category.label}, ${category.score.times(100).toInt()}%"

    // Create a data object to display the detection result
    DetectionResult(it.boundingBox, text)
}
// Draw the detection result on the bitmap and show it.
val imgWithResult = drawDetectionResult(bitmap, resultToDisplay)
runOnUiThread {
    inputImageView.setImageBitmap(imgWithResult)
}
  1. 이제 Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다.
  2. 앱이 로드되면 미리 설정된 이미지 중 하나를 탭하여 감지 결과를 확인합니다.

본인의 사진을 사용해 보고 싶으신가요? 사진 촬영 버튼을 탭하고 주변의 사물 사진을 캡처합니다.

8b024362b15096a6.png

7 커스텀 객체 감지 모델 학습

이전 단계에서는 선행 학습된 TFLite 객체 감지 모델을 Android 앱에 통합했으며, 그릇이나 식탁과 같은 일반적인 객체를 샘플 이미지에서 감지할 수 있음을 확인했습니다. 하지만 목표는 이미지의 요리 재료를 감지하는 것이므로 일반적인 객체 감지가 사용 사례에 적합하지 않습니다. 감지하려는 성분이 포함된 학습 데이터 세트를 사용하여 커스텀 객체 감지 모델을 학습시키려고 합니다.

다음은 자체 커스텀 모델 학습을 연습하는 데 사용할 수 있는 이미지와 라벨이 포함된 데이터 세트입니다. Open Images Dataset V4의 이미지를 사용하여 생성되었습니다.

Colaboratory

다음은 Google Colab으로 이동하여 커스텀 모델을 학습시켜 보겠습니다.

커스텀 모델을 학습시키는 데 약 30분이 소요됩니다.

급한 경우 데이터 세트를 통해 선행 학습된 모델을 다운로드하고 다음 단계를 진행할 수 있습니다.

8 맞춤 TFLite 모델을 Android 앱에 통합

샐러드 감지 모델을 학습시켰다면 이제 모델을 통합하고 공통 객체 감지기에서 특히 샐러드 감지기로 전환합니다.

  1. 샐러드 TFLite 모델을 assets 폴더에 복사합니다. 새 모델의 이름을 salad.tflite로 지정합니다.

91e8d37c4f78eddb.png

  1. MainActivity.kt 파일을 열고 ObjectDetector 초기화 코드를 찾습니다.
  2. EfficientDet-Lite 모델 (model.tflite)을 샐러드 모델 (salad.tflite)으로 대체
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "salad.tflite", // must be same as the filename in assets folder
    options
)
  1. Android 스튜디오 툴바에서 Run ( execute.png)을 클릭하여 새 모델로 앱을 다시 실행합니다. 그러면 이제 앱에서 치즈, 샐러드, 베이커리 제품을 인식할 수 있습니다.

b9705235366ae162.png

9. 축하합니다.

TFLite를 사용하여 커스텀 모델을 학습시키고 객체 감지 기능을 앱에 추가했습니다. 이것으로 모든 작업을 시작할 수 있습니다.

학습한 내용

  • TensorFlow Hub에서 선행 학습된 TFLite 객체 감지 모델을 찾는 방법
  • TFLite 작업 라이브러리를 사용하여 부정적 반응 감지 모델을 Android 앱에 통합하는 방법
  • TFLite Model Maker를 사용하여 커스텀 객체 감지 모델을 학습시키는 방법

다음 단계

  • Firebase를 사용하여 TFLite 모델 배포 개선
  • 학습 데이터를 수집하여 자체 모델 학습시키기
  • 자체 Android 앱에서 객체 감지 적용

자세히 알아보기