Google Play 開発者サービス Java API の TensorFlow Lite

Google Play 開発者サービスの TensorFlow Lite には、ネイティブ API に加えて Java API でもアクセスできます。特に、Google Play 開発者サービスの TensorFlow Lite は、TensorFlow Lite Interpreter API を介して利用できます。

Interpreter API を使用する

TensorFlow ランタイムによって提供される TensorFlow Lite Interpreter API は、ML モデルを構築して実行するための汎用インターフェースを提供します。Google Play 開発者サービスのランタイムで TensorFlow Lite を使用して 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 コンポーネントを初期化します。

Kotlin

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

Java

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

3. インタープリタを作成してランタイム オプションを設定する

次のサンプルコードに示すように、InterpreterApi.create() を使用してインタープリタを作成し、InterpreterApi.Options.setRuntime() を呼び出して Google Play 開発者サービス ランタイムを使用するように構成します。

Kotlin

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)
  }

Java

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() 呼び出しを追加できます。

Kotlin

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

Java

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

4. 推論を実行する

作成した interpreter オブジェクトを使用して、run() メソッドを呼び出し、推論を生成します。

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

ハードウェア アクセラレーション

TensorFlow Lite では、画像処理装置(GPU)などの専用のハードウェア プロセッサを使用して、モデルのパフォーマンスを高速化できます。委譲と呼ばれるハードウェア ドライバを使用して、これらの専用プロセッサを活用できます。

GPU デリゲートは、Google Play 開発者サービスを通じて提供され、Interpreter API の Play 開発者サービス バージョンと同様に動的に読み込まれます。

デバイスの互換性を確認しています

すべてのデバイスが TFLite による GPU ハードウェア アクセラレーションをサポートしているわけではありません。エラーや潜在的なクラッシュを軽減するには、TfLiteGpu.isGpuDelegateAvailable メソッドを使用して、デバイスが GPU デリゲートと互換性があるかどうかを確認します。

このメソッドを使用して、デバイスが GPU に対応しているかどうかを確認し、GPU がサポートされていない場合のフォールバックとして CPU を使用します。

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

useGpuTask のような変数を作成したら、それを使用してデバイスが GPU デリゲートを使用しているかどうかを判断できます。

Kotlin

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)
}
    

Java

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;
});
    

Interpreter API を備えた GPU

Interpreter API で GPU デリゲートを使用するには:

  1. Play 開発者サービスの GPU デリゲートを使用するようにプロジェクトの依存関係を更新します。

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. TFlite の初期化で GPU デリゲート オプションを有効にします。

    Kotlin

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

    Java

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. インタープリタ オプションで GPU デリゲートを有効にします。addDelegateFactory() withinInterpreterApi.Options()` を呼び出して、デリゲート ファクトリを GpuDelegateFactory に設定します。

    Kotlin

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

    Java

    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 を使用するようにすべてのコードを移行した場合は、既存の TensorFlow Lite ランタイム ライブラリの依存関係(org.tensorflow:tensorflow-lite:* を含むエントリ)を build.gradle ファイルから削除して、アプリのサイズを削減する必要があります。
  4. コード内で new Interpreter オブジェクトの作成をすべて特定し、InterpreterApi.create() 呼び出しを使用するように各オブジェクトを変更します。新しい TfLite.initialize は非同期です。ほとんどの場合、簡単に置き換えるものではありません。呼び出しが完了したときにリスナーを登録する必要があります。ステップ 3 のコード スニペットをご覧ください。
  5. org.tensorflow.lite.Interpreter クラスまたは org.tensorflow.lite.InterpreterApi クラスを使用して、任意のソースファイルに import org.tensorflow.lite.InterpreterApi;import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; を追加します。
  6. 結果として得られる InterpreterApi.create() の呼び出しに引数が 1 つしかない場合は、引数リストに 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 バージョンと互換性がありません。