Google Play 서비스 Java API의 TensorFlow Lite

Google Play 서비스의 TensorFlow Lite는 Native API 외에도 Java API를 사용하여 액세스할 수도 있습니다. 특히 Google Play 서비스의 TensorFlow Lite는 TensorFlow Lite Task APITensorFlow Lite Interpreter API를 통해 사용할 수 있습니다. 작업 라이브러리는 시각적, 오디오 및 텍스트 데이터를 사용하여 일반적인 기계 학습 작업에 최적화된 기본 모델 인터페이스를 제공합니다. TensorFlow 런타임에서 제공되는 TensorFlow Lite Interpreter API는 ML 모델 구축 및 실행을 위한 보다 일반적인 목적의 인터페이스를 제공합니다.

다음 섹션에서는 Google Play 서비스에서 TensorFlow Lite와 함께 Interpreter 및 Task Library API를 사용하는 방법에 대한 지침을 제공합니다. 앱이 Interpreter API와 작업 라이브러리 API를 모두 사용할 수 있지만 대부분의 앱은 하나의 API 세트만 사용해야 합니다.

작업 라이브러리 API 사용

TensorFlow Lite Task API는 Interpreter API를 래핑하고 시각적, 오디오 및 텍스트 데이터를 사용하는 일반적인 기계 학습 작업을 위한 고급 프로그래밍 인터페이스를 제공합니다. 애플리케이션에 지원되는 작업 중 하나가 필요한 경우 작업 API를 사용해야 합니다.

1. 프로젝트 종속성 추가

프로젝트 종속성은 기계 학습 사용 사례에 따라 다릅니다. Task API에는 다음 라이브러리가 포함되어 있습니다.

  • 비전 라이브러리: org.tensorflow:tensorflow-lite-task-vision-play-services
  • 오디오 라이브러리: org.tensorflow:tensorflow-lite-task-audio-play-services
  • 텍스트 라이브러리: org.tensorflow:tensorflow-lite-task-text-play-services

TensorFlow Lite용 Play 서비스 API에 액세스하려면 앱 프로젝트 코드에 종속성 중 하나를 추가하세요. 예를 들어 다음을 사용하여 비전 작업을 구현합니다.

dependencies {
...
    implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
...
}

2. TensorFlow Lite 초기화 추가

TensorFlow Lite API를 사용 하기 전에 Google Play 서비스 API의 TensorFlow Lite 구성요소를 초기화하세요. 다음 예에서는 비전 라이브러리를 초기화합니다.

코틀린

init {
  TfLiteVision.initialize(context)
}

3. 추론 실행

TensorFlow Lite 구성요소를 초기화한 후 detect() 메서드를 호출하여 추론을 생성합니다. detect() 메소드 내의 정확한 코드는 라이브러리 및 사용 사례에 따라 다릅니다. 다음은 TfLiteVision 라이브러리를 사용한 간단한 객체 감지 사용 사례입니다.

코틀린

fun detect(...) {
  if (!TfLiteVision.isInitialized()) {
    Log.e(TAG, "detect: TfLiteVision is not initialized yet")
    return
  }

  if (objectDetector == null) {
    setupObjectDetector()
  }

  ...

}

데이터 형식에 따라 추론을 생성하기 전에 detect() 메서드 내에서 데이터를 전처리하고 변환해야 할 수도 있습니다. 예를 들어 물체 감지기의 이미지 데이터에는 다음이 필요합니다.

val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
val results = objectDetector?.detect(tensorImage)

인터프리터 API 사용

Interpreter API는 작업 라이브러리 API보다 더 많은 제어력과 유연성을 제공합니다. 기계 학습 작업이 작업 라이브러리에서 지원되지 않거나 ML 모델 구축 및 실행을 위해 보다 범용적인 인터페이스가 필요한 경우 Interpreter API를 사용해야 합니다.

1. 프로젝트 종속성 추가

TensorFlow Lite용 Play 서비스 API에 액세스하려면 앱 프로젝트 코드에 다음 종속 항목을 추가하세요.

dependencies {
...
    // Tensorflow Lite dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    // Optional: include Tensorflow Lite Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}

2. TensorFlow Lite 초기화 추가

TensorFlow Lite API를 사용하기 전에 Google Play 서비스 API의 TensorFlow Lite 구성요소를 초기화하세요.

코틀린

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

자바

Task<Void> initializeTask = TfLite.initialize(context);

3. 인터프리터 생성 및 런타임 옵션 설정

다음 예제 코드와 같이 InterpreterApi.create() 사용하여 인터프리터를 만들고 InterpreterApi.Options.setRuntime() 을 호출하여 Google Play 서비스 런타임을 사용하도록 구성합니다.

코틀린

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private lateinit var interpreter: InterpreterApi
...
initializeTask.addOnSuccessListener {
  val interpreterOption =
    InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  interpreter = InterpreterApi.create(
    modelBuffer,
    interpreterOption
  )}
  .addOnFailureListener { e ->
    Log.e("Interpreter", "Cannot initialize interpreter", e)
  }

자바

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private InterpreterApi interpreter;
...
initializeTask.addOnSuccessListener(a -> {
    interpreter = InterpreterApi.create(modelBuffer,
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY));
  })
  .addOnFailureListener(e -> {
    Log.e("Interpreter", String.format("Cannot initialize interpreter: %s",
          e.getMessage()));
  });

Android 사용자 인터페이스 스레드를 차단하지 않으므로 위의 구현을 사용해야 합니다. 스레드 실행을 더 자세히 관리해야 하는 경우 인터프리터 생성에 Tasks.await() 호출을 추가할 수 있습니다.

코틀린

import androidx.lifecycle.lifecycleScope
...
lifecycleScope.launchWhenStarted { // uses coroutine
  initializeTask.await()
}

자바

@BackgroundThread
InterpreterApi initializeInterpreter() {
    Tasks.await(initializeTask);
    return InterpreterApi.create(...);
}

4. 추론 실행

생성한 interpreter 객체를 사용하여 run() 메서드를 호출하여 추론을 생성합니다.

코틀린

interpreter.run(inputBuffer, outputBuffer)

자바

interpreter.run(inputBuffer, outputBuffer);

하드웨어 가속

TensorFlow Lite를 사용하면 그래픽 처리 장치(GPU)와 같은 특수 하드웨어 프로세서를 사용하여 모델 성능을 가속화할 수 있습니다. 대리자 라고 하는 하드웨어 드라이버를 사용하여 이러한 특수 프로세서를 활용할 수 있습니다. Google Play 서비스에서 TensorFlow Lite와 함께 다음 하드웨어 가속 위임을 사용할 수 있습니다.

  • GPU 대리자 (권장) - 이 대리자는 Google Play 서비스를 통해 제공되며 Task API 및 Interpreter API의 Play 서비스 버전과 마찬가지로 동적으로 로드됩니다.

  • NNAPI 대리자 - 이 대리자는 Android 개발 프로젝트에 포함된 라이브러리 종속성으로 사용할 수 있으며 앱에 번들로 제공됩니다.

TensorFlow Lite를 사용한 하드웨어 가속에 대한 자세한 내용은 TensorFlow Lite 대리인 페이지를 참조하세요.

장치 호환성 확인

모든 장치가 TFLite를 사용한 GPU 하드웨어 가속을 지원하는 것은 아닙니다. 오류 및 잠재적 충돌을 완화하려면 TfLiteGpu.isGpuDelegateAvailable 메서드를 사용하여 장치가 GPU 대리자와 호환되는지 확인하세요.

이 방법을 사용하여 장치가 GPU와 호환되는지 확인하고 GPU가 지원되지 않는 경우 대체 수단으로 CPU 또는 NNAPI 대리자를 사용합니다.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

useGpuTask 와 같은 변수가 있으면 이를 사용하여 장치가 GPU 대리자를 사용하는지 여부를 결정할 수 있습니다. 다음 예에서는 작업 라이브러리와 Interpreter API를 모두 사용하여 이 작업을 수행하는 방법을 보여줍니다.

태스크 API 사용

코틀린

lateinit val optionsTask = useGpuTask.continueWith { task ->
  val baseOptionsBuilder = BaseOptions.builder()
  if (task.result) {
    baseOptionsBuilder.useGpu()
  }
 ObjectDetectorOptions.builder()
          .setBaseOptions(baseOptionsBuilder.build())
          .setMaxResults(1)
          .build()
}
    

자바

Task<ObjectDetectorOptions> optionsTask = useGpuTask.continueWith({ task ->
  BaseOptions baseOptionsBuilder = BaseOptions.builder();
  if (task.getResult()) {
    baseOptionsBuilder.useGpu();
  }
  return ObjectDetectorOptions.builder()
          .setBaseOptions(baseOptionsBuilder.build())
          .setMaxResults(1)
          .build()
});
    

통역사 API 사용

코틀린

val interpreterTask = useGpuTask.continueWith { task ->
  val interpreterOptions = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  if (task.result) {
      interpreterOptions.addDelegateFactory(GpuDelegateFactory())
  }
  InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions)
}
    

자바

Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  InterpreterApi.Options options =
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY);
  if (task.getResult()) {
     options.addDelegateFactory(new GpuDelegateFactory());
  }
  return options;
});
    

작업 라이브러리 API를 갖춘 GPU

Task API와 함께 GPU 대리자를 사용하려면 다음 안내를 따르세요.

  1. Play 서비스에서 GPU 대리자를 사용하도록 프로젝트 종속성을 업데이트합니다.

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. setEnableGpuDelegateSupport 사용하여 GPU 대리자를 초기화합니다. 예를 들어 다음을 사용하여 TfLiteVision 에 대한 GPU 대리자를 초기화할 수 있습니다.

    코틀린

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
        

    자바

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
        
  3. BaseOptions 사용하여 GPU 대리자 옵션을 활성화합니다.

    코틀린

        val baseOptions = BaseOptions.builder().useGpu().build()
        

    자바

        BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
        
  4. .setBaseOptions 사용하여 옵션을 구성합니다. 예를 들어 다음을 사용하여 ObjectDetector 에서 GPU를 설정할 수 있습니다.

    코틀린

        val options =
            ObjectDetectorOptions.builder()
                .setBaseOptions(baseOptions)
                .setMaxResults(1)
                .build()
        

    자바

        ObjectDetectorOptions options =
            ObjectDetectorOptions.builder()
                .setBaseOptions(baseOptions)
                .setMaxResults(1)
                .build();
        

인터프리터 API를 갖춘 GPU

Interpreter API와 함께 GPU 대리자를 사용하려면 다음 안내를 따르세요.

  1. Play 서비스에서 GPU 대리자를 사용하도록 프로젝트 종속성을 업데이트합니다.

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. TFlite 초기화에서 GPU 대리자 옵션을 활성화합니다:

    코틀린

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build())
        

    자바

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. 인터프리터 옵션에서 GPU 대리자를 활성화합니다. InterpreterApi.Options()` addDelegateFactory() within 호출하여 대리자 팩토리를 GpuDelegateFactory로 설정합니다.

    코틀린

        val interpreterOption = InterpreterApi.Options()
         .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
         .addDelegateFactory(GpuDelegateFactory())
        

    자바

        Options interpreterOption = InterpreterApi.Options()
          .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
          .addDelegateFactory(new GpuDelegateFactory());
        

독립형 TensorFlow Lite에서 마이그레이션

앱을 독립형 TensorFlow Lite에서 Play 서비스 API로 마이그레이션하려는 경우 앱 프로젝트 코드 업데이트에 대한 다음 추가 지침을 검토하세요.

  1. 이 페이지의 제한 사항 섹션을 검토하여 사용 사례가 지원되는지 확인하세요.
  2. 코드를 업데이트하기 전에 특히 TensorFlow Lite 버전 2.1 이전 버전을 사용하는 경우 모델의 성능 및 정확성 검사를 수행하여 새로운 구현과 비교할 기준을 마련하세요.
  3. TensorFlow Lite용 Play 서비스 API를 사용하기 위해 모든 코드를 마이그레이션한 경우 build.gradle 파일에서 기존 TensorFlow Lite 런타임 라이브러리 종속성( org.tensorflow: tensorflow-lite :* 항목)을 제거해야 합니다. 앱 크기를 줄일 수 있습니다.
  4. 코드에서 new Interpreter 객체 생성이 발생한 모든 항목을 식별하고 InterpreterApi.create() 호출을 사용하도록 각각을 수정합니다. 새로운 TfLite.initialize는 비동기식입니다. 즉, 대부분의 경우 드롭인 대체가 아닙니다. 호출이 완료되면 리스너를 등록해야 합니다. 3단계 코드의 코드 조각을 참조하세요.
  5. import org.tensorflow.lite.InterpreterApi; import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; org.tensorflow.lite.Interpreter 또는 org.tensorflow.lite.InterpreterApi 클래스를 사용하여 모든 소스 파일에 적용합니다.
  6. InterpreterApi.create() 에 대한 결과 호출에 단일 인수만 있는 경우 new InterpreterApi.Options() 인수 목록에 추가합니다.
  7. InterpreterApi.create() 호출의 마지막 인수에 .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) 추가합니다.
  8. org.tensorflow.lite.Interpreter 클래스의 다른 모든 항목을 org.tensorflow.lite.InterpreterApi 로 바꿉니다.

독립 실행형 TensorFlow Lite와 Play 서비스 API를 나란히 사용하려면 TensorFlow Lite 2.9(또는 이상)를 사용해야 합니다. TensorFlow Lite 2.8 이하 버전은 Play 서비스 API 버전과 호환되지 않습니다.