Android 빠른 시작

이 튜토리얼에서는 TensorFlow Lite를 사용하여 Android 앱을 빌드하여 최소한의 코드로 실시간 카메라 피드를 분석하고 기계 학습 모델을 사용하여 객체를 식별하는 방법을 보여줍니다. 기존 프로젝트를 업데이트하는 경우 코드 샘플을 참조로 사용하고 프로젝트 수정 지침으로 건너뛸 수 있습니다 .

기계 학습을 통한 객체 감지

물체 감지 애니메이션 데모 이 자습서의 기계 학습 모델은 객체 감지를 수행합니다. 객체 감지 모델은 특정 형식의 이미지 데이터를 가져와 분석하고 이미지의 항목을 인식하도록 훈련된 알려진 클래스 집합 중 하나로 분류하려고 시도합니다. 모델이 알려진 객체를 식별할 수 있는 속도(객체 예측 또는 추론 이라고 함)는 일반적으로 밀리초 단위로 측정됩니다. 실제로 추론 속도는 모델을 호스팅하는 하드웨어, 처리 중인 데이터의 크기, 기계 학습 모델의 크기에 따라 다릅니다.

설정 및 실행 예제

이 자습서의 첫 번째 부분에서는 GitHub에서 샘플을 다운로드하고 Android Studio 를 사용하여 실행합니다. 이 자습서의 다음 섹션에서는 코드 예제의 관련 섹션을 탐색하므로 이를 자신의 Android 앱에 적용할 수 있습니다. 이러한 도구의 다음 버전이 설치되어 있어야 합니다.

  • 안드로이드 스튜디오 4.2.2 이상
  • Android SDK 버전 31 이상

예제 코드 가져오기

예제 코드의 로컬 복사본을 만듭니다. 이 코드를 사용하여 Android Studio에서 프로젝트를 만들고 샘플 애플리케이션을 실행합니다.

예제 코드를 복제하고 설정하려면:

  1. git 저장소
    git clone https://github.com/android/camera-samples.git
    
    복제
  2. 스파스 체크아웃을 사용하도록 git 인스턴스를 구성하면 객체 감지 예제 앱에 대한 파일만 남게 됩니다.

    cd camera-samples
    git sparse-checkout init --cone
    git sparse-checkout set CameraXAdvanced
    

프로젝트 가져오기 및 실행

다운로드한 예제 코드에서 프로젝트를 생성하고 프로젝트를 빌드한 후 실행합니다.

예제 코드 프로젝트를 가져오고 빌드하려면:

  1. Android 스튜디오 를 시작합니다.
  2. Android Studio 시작 페이지에서 프로젝트 가져오기 를 선택하거나 파일 > 새로 만들기 > 프로젝트 가져오기 를 선택합니다.
  3. build.gradle 파일( .../android/camera-samples/CameraXAdvanced/build.gradle )이 포함된 예제 코드 디렉터리로 이동하여 해당 디렉터리를 선택합니다.

올바른 디렉토리를 선택하면 Android Studio에서 새 프로젝트를 만들고 빌드합니다. 이 프로세스는 컴퓨터 속도와 다른 프로젝트에 Android Studio를 사용한 경우에 따라 몇 분이 소요될 수 있습니다. 빌드가 완료되면 Android 스튜디오는 빌드 출력 상태 패널에 BUILD SUCCESSFUL 메시지를 표시합니다.

선택사항: Android 플러그인 버전을 업데이트하여 빌드 오류를 수정하려면:

  1. 프로젝트 디렉터리에서 build.gradle 파일을 엽니다.
  2. Android 도구 버전을 다음과 같이 변경합니다.

    // from:
    classpath 'com.android.tools.build:gradle:4.2.2'
    // to:
    classpath 'com.android.tools.build:gradle:4.1.2'
    
  3. File > Sync Project with Gradle Files 를 선택하여 프로젝트를 동기화합니다.

프로젝트를 실행하려면:

  1. Android Studio에서 Run > Run…CameraActivity 를 선택하여 프로젝트를 실행합니다.
  2. 카메라가 연결된 Android 기기를 선택하여 앱을 테스트하세요.

다음 섹션에서는 이 예제 앱을 참조 지점으로 사용하여 이 기능을 자신의 앱에 추가하기 위해 기존 프로젝트를 수정해야 하는 방법을 보여줍니다.

프로젝트 종속성 추가

자체 애플리케이션에서 TensorFlow Lite 기계 학습 모델을 실행하고 이미지와 같은 데이터를 사용 중인 모델에서 처리할 수 있는 텐서 데이터 형식으로 변환하는 유틸리티 기능에 액세스하려면 특정 프로젝트 종속성을 추가해야 합니다.

예제 앱은 여러 TensorFlow Lite 라이브러리를 사용하여 객체 감지 기계 학습 모델의 실행을 활성화합니다.

  • TensorFlow Lite 메인 라이브러리 - 필요한 데이터 입력 클래스, 머신 러닝 모델 실행, 모델 처리 결과 출력을 제공합니다.
  • TensorFlow Lite 지원 라이브러리 - 이 라이브러리는 카메라의 이미지를 기계 학습 모델에서 처리할 수 있는 TensorImage 데이터 객체로 변환하는 도우미 클래스를 제공합니다.
  • TensorFlow Lite GPU 라이브러리 - 이 라이브러리는 사용 가능한 경우 장치에서 GPU 프로세서를 사용하여 모델 실행을 가속화하는 지원을 제공합니다.

다음 지침은 필요한 프로젝트 및 모듈 종속성을 자체 Android 앱 프로젝트에 추가하는 방법을 설명합니다.

모듈 종속성을 추가하려면:

  1. TensorFlow Lite를 사용하는 모듈에서 다음 종속성을 포함하도록 모듈의 build.gradle 파일을 업데이트합니다. 예제 코드에서 이 파일은 .../android/camera-samples/CameraXAdvanced/tflite/build.gradle ( 코드 참조 )에 있습니다.

    ...
    dependencies {
    ...
        // Tensorflow lite dependencies
        implementation 'org.tensorflow:tensorflow-lite:2.8.0'
        implementation 'org.tensorflow:tensorflow-lite-gpu:2.8.0'
        implementation 'org.tensorflow:tensorflow-lite-support:2.8.0'
    ...
    }
    
  2. Android Studio에서 File > Sync Project with Gradle Files 를 선택하여 프로젝트 종속성을 동기화합니다.

ML 모델 인터프리터 초기화

Android 앱에서 모델로 예측을 실행하기 전에 매개변수로 TensorFlow Lite 기계 학습 모델 인터프리터를 초기화해야 합니다. 이러한 초기화 매개변수는 사용 중인 모델에 따라 다르며 예측에 대한 최소 정확도 임계값 및 식별된 객체 클래스에 대한 레이블과 같은 설정을 포함할 수 있습니다.

TensorFlow Lite 모델에는 모델 코드가 포함된 .tflite 파일이 포함되어 있으며 모델에서 예측한 클래스 이름이 포함된 레이블 파일이 자주 포함됩니다. 객체 감지의 경우 클래스는 사람, 개, 고양이 또는 자동차와 같은 객체입니다. 모델은 일반적으로 코드 예제와 같이 기본 모듈의 src/main/assets 디렉토리에 저장됩니다.

  • CameraXAdvanced/tflite/src/main/assets/coco_ssd_mobilenet_v1_1.0_quant.tflite
  • CameraXAdvanced/tflite/src/main/assets/coco_ssd_mobilenet_v1_1.0_labels.txt

편의와 코드 가독성을 위해 예제에서는 모델에 대한 설정을 정의하는 컴패니언 개체를 선언합니다.

앱에서 모델을 초기화하려면:

  1. 모델에 대한 설정을 정의하기 위해 컴패니언 개체를 만듭니다. ( 코드 참조 )

    companion object {
       private val TAG = CameraActivity::class.java.simpleName
    
       private const val ACCURACY_THRESHOLD = 0.5f
       private const val MODEL_PATH = "coco_ssd_mobilenet_v1_1.0_quant.tflite"
       private const val LABELS_PATH = "coco_ssd_mobilenet_v1_1.0_labels.txt"
    }
    
  2. 이 객체의 설정을 사용하여 모델이 포함된 TensorFlow Lite Interpreter 객체를 구성합니다. ( 코드 참조 )

    private val tflite by lazy {
       Interpreter(
           FileUtil.loadMappedFile(this, MODEL_PATH),
           Interpreter.Options().addDelegate(nnApiDelegate))
    }
    

하드웨어 가속기 구성

애플리케이션에서 TensorFlow Lite 모델을 초기화할 때 하드웨어 가속 기능을 사용하여 모델의 예측 계산 속도를 높일 수 있습니다. 위의 코드 예제는 NNAPI 대리자를 사용하여 모델 실행의 하드웨어 가속을 처리합니다.

Interpreter.Options().addDelegate(nnApiDelegate)

TensorFlow Lite 대리자 는 GPU, TPU 또는 DSP와 같은 모바일 장치의 특수 처리 하드웨어를 사용하여 기계 학습 모델의 실행을 가속화하는 소프트웨어 모듈입니다. TensorFlow Lite 모델을 실행하기 위해 대리자를 사용하는 것이 권장되지만 필수는 아닙니다.

TensorFlow Lite에서 대리자를 사용하는 방법에 대한 자세한 내용은 TensorFlow Lite 대리자 를 참조하십시오.

모델에 데이터 제공

Android 앱에서 코드는 이미지와 같은 기존 데이터를 모델에서 처리할 수 있는 Tensor 데이터 형식으로 변환하여 해석을 위해 모델에 데이터를 제공합니다. Tensor의 데이터에는 모델을 훈련하는 데 사용되는 데이터 형식과 일치하는 특정 차원 또는 모양이 있어야 합니다.

모델에 필요한 텐서 모양을 결정하려면:

  • 초기화된 Interpreter 객체를 사용하여 아래 코드 조각과 같이 모델에서 사용하는 텐서의 모양을 결정합니다. ( 코드 참조 )

    private val tfInputSize by lazy {
       val inputIndex = 0
       val inputShape = tflite.getInputTensor(inputIndex).shape()
       Size(inputShape[2], inputShape[1]) // Order of axis is: {1, height, width, 3}
    }
    

예제 코드에 사용된 객체 감지 모델은 300 x 300 픽셀 크기의 정사각형 이미지를 예상합니다.

카메라에서 이미지를 제공하려면 먼저 앱에서 이미지를 가져와 예상 크기에 맞게 만들고 회전을 조정하고 이미지 데이터를 정규화해야 합니다. TensorFlow Lite 모델로 이미지를 처리할 때 TensorFlow Lite 지원 라이브러리 ImageProcessor 클래스를 사용하여 아래와 같이 이 데이터 사전 처리를 처리할 수 있습니다.

모델의 이미지 데이터를 변환하려면:

  1. 지원 라이브러리 ImageProcessor 를 사용하여 모델이 예측을 실행하는 데 사용할 수 있는 형식으로 이미지 데이터를 변환하기 위한 개체를 만듭니다. ( 코드 참조 )

    private val tfImageProcessor by lazy {
       val cropSize = minOf(bitmapBuffer.width, bitmapBuffer.height)
       ImageProcessor.Builder()
           .add(ResizeWithCropOrPadOp(cropSize, cropSize))
           .add(ResizeOp(
               tfInputSize.height, tfInputSize.width, ResizeOp.ResizeMethod.NEAREST_NEIGHBOR))
           .add(Rot90Op(-imageRotationDegrees / 90))
           .add(NormalizeOp(0f, 1f))
           .build()
    }
    
  2. Android 카메라 시스템에서 이미지 데이터를 복사하고 ImageProcessor 개체로 분석을 위해 준비합니다. ( 코드 참조 )

    // Copy out RGB bits to the shared buffer
    image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer)  }
    
    // Process the image in Tensorflow
    val tfImage =  tfImageProcessor.process(tfImageBuffer.apply { load(bitmapBuffer) })
    

예측 실행

Android 앱에서 올바른 형식의 이미지 데이터로 TensorImage 객체를 생성하면 해당 데이터에 대해 모델을 실행하여 예측 또는 추론 을 생성할 수 있습니다. 이 자습서의 예제 코드는 이 코드를 predict() 메서드로 캡슐화하는 ObjectDetectionHelper 클래스를 사용합니다.

이미지 데이터 세트에 대한 예측을 실행하려면 다음 안내를 따르세요.

  1. 이미지 데이터를 예측 함수에 전달하여 예측을 실행합니다. ( 코드 참조 )

    // Perform the object detection for the current frame
    val predictions = detector.predict(tfImage)
    
  2. 이미지 데이터를 사용하여 tflite 객체 인스턴스에서 run 메소드를 호출하여 예측을 생성합니다. ( 코드 참조 )

    fun predict(image: TensorImage): List<ObjectPrediction> {
       tflite.runForMultipleInputsOutputs(arrayOf(image.buffer), outputBuffer)
       return predictions
    }
    

TensorFlow Lite Interpreter 객체는 이 데이터를 수신하여 모델에 대해 실행하고 예측 목록을 생성합니다. 모델에서 데이터를 연속적으로 처리하려면 각 예측 실행에 대해 Interpreter 객체가 생성된 다음 시스템에서 제거되지 않도록 runForMultipleInputsOutputs() 메서드를 사용하십시오.

모델 출력 처리

Android 앱에서 객체 감지 모델에 대해 이미지 데이터를 실행한 후 추가 비즈니스 로직을 실행하거나 사용자에게 결과를 표시하거나 다른 작업을 수행하여 앱 코드가 처리해야 하는 예측 목록을 생성합니다.

주어진 TensorFlow Lite 모델의 출력은 생성하는 예측의 수(하나 또는 여러 개)와 각 예측에 대한 설명 정보에 따라 다릅니다. 객체 감지 모델의 경우 예측에는 일반적으로 이미지에서 객체가 감지된 위치를 나타내는 경계 상자에 대한 데이터가 포함됩니다. 예제 코드에서 반환된 데이터는 아래와 같이 ObjectPrediction 개체 목록의 형식이 지정됩니다. ( 코드 참조 )

val predictions get() = (0 until OBJECT_COUNT).map {
   ObjectPrediction(

       // The locations are an array of [0, 1] floats for [top, left, bottom, right]
       location = locations[0][it].let {
           RectF(it[1], it[0], it[3], it[2])
       },

       // SSD Mobilenet V1 Model assumes class 0 is background class
       // in label file and class labels start from 1 to number_of_classes + 1,
       // while outputClasses correspond to class index from 0 to number_of_classes
       label = labels[1 + labelIndices[0][it].toInt()],

       // Score is a single value of [0, 1]
       score = scores[0][it]
   )
}

물체 감지 스크린샷 이 예에 사용된 모델의 경우 각 예측에는 객체의 경계 상자 위치, 객체의 레이블, 예측의 신뢰도를 나타내는 Float로 0과 1 사이의 예측 점수가 포함되며 1이 가장 높은 신뢰도 등급입니다. . 일반적으로 점수가 50%(0.5) 미만인 예측은 결정적이지 않은 것으로 간주됩니다. 그러나 낮은 값의 예측 결과를 처리하는 방법은 사용자와 응용 프로그램의 요구 사항에 달려 있습니다.

모델이 예측 결과를 반환하면 애플리케이션은 결과를 사용자에게 제시하거나 추가 논리를 실행하여 해당 예측에 따라 조치를 취할 수 있습니다. 예제 코드의 경우 응용 프로그램은 식별된 개체 주위에 경계 상자를 그리고 화면에 클래스 이름을 표시합니다. 자세한 내용은 예제 코드에서 CameraActivity.reportPrediction() 함수를 검토하세요.

다음 단계

  • 예제 에서 TensorFlow Lite의 다양한 용도를 살펴보세요.
  • 모델 섹션에서 TensorFlow Lite와 함께 기계 학습 모델을 사용하는 방법에 대해 자세히 알아보세요.
  • TensorFlow Lite 개발자 가이드 에서 모바일 애플리케이션에서 기계 학습을 구현하는 방법에 대해 자세히 알아보세요.