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 デリゲートを使用するには:
Play 開発者サービスの GPU デリゲートを使用するようにプロジェクトの依存関係を更新します。
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
TFlite の初期化で GPU デリゲート オプションを有効にします。
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
インタープリタ オプションで GPU デリゲートを有効にします。
addDelegateFactory() within
InterpreterApi.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 に移行することを計画している場合は、アプリのプロジェクト コードの更新に関する次の追加ガイダンスを確認してください。
- このページの制限事項セクションをご覧になり、ご使用のユースケースがサポートされていることを確認してください。
- コードを更新する前に、モデルのパフォーマンスと精度を確認します。特に TensorFlow Lite のバージョン 2.1 より前のバージョンを使用している場合は、新しい実装と比較するためのベースラインを確保します。
- TensorFlow Lite 用 Play 開発者サービス API を使用するようにすべてのコードを移行した場合は、既存の TensorFlow Lite ランタイム ライブラリの依存関係(
org.tensorflow:tensorflow-lite:*
を含むエントリ)を build.gradle ファイルから削除して、アプリのサイズを削減する必要があります。 - コード内で
new Interpreter
オブジェクトの作成をすべて特定し、InterpreterApi.create() 呼び出しを使用するように各オブジェクトを変更します。新しい TfLite.initialize は非同期です。ほとんどの場合、簡単に置き換えるものではありません。呼び出しが完了したときにリスナーを登録する必要があります。ステップ 3 のコード スニペットをご覧ください。 org.tensorflow.lite.Interpreter
クラスまたはorg.tensorflow.lite.InterpreterApi
クラスを使用して、任意のソースファイルにimport org.tensorflow.lite.InterpreterApi;
とimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
を追加します。- 結果として得られる
InterpreterApi.create()
の呼び出しに引数が 1 つしかない場合は、引数リストにnew InterpreterApi.Options()
を追加します。 InterpreterApi.create()
の呼び出しの最後の引数に.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
を追加します。- 他の
org.tensorflow.lite.Interpreter
クラスはすべてorg.tensorflow.lite.InterpreterApi
に置き換えます。
スタンドアロンの TensorFlow Lite と Play 開発者サービス API を併用する場合は、TensorFlow Lite 2.9 以降を使用する必要があります。TensorFlow Lite 2.8 以前のバージョンは、Play 開発者サービス API バージョンと互換性がありません。