Google Play サービスの TensorFlow Lite

TensorFlow Lite は、現在のバージョンの Play サービスを実行しているすべての Android デバイスの Google Play サービス ランタイムで利用できます。このランタイムを使用すると、TensorFlow Lite ライブラリをアプリに静的にバンドルすることなく、機械学習 (ML) モデルを実行できます。

Google Play サービス API を使用すると、アプリのサイズを縮小し、最新の安定したバージョンのライブラリからパフォーマンスを向上させることができます。 Android で TensorFlow Lite を使用するには、Google Play サービスの TensorFlow Lite を使用することをお勧めします。

サンプル アプリケーションを実装するためのステップバイステップ ガイドを提供するクイックスタートを使用して、Play サービス ランタイムを開始できます。アプリでスタンドアロンの TensorFlow Lite を既に使用している場合は、「スタンドアロンの TensorFlow Lite からの移行」セクションを参照して、Play サービス ランタイムを使用するように既存のアプリを更新してください。 Google Play サービスの詳細については、 Google Play サービスの Web サイトを参照してください。

Play サービス ランタイムの使用

Google Play サービスの TensorFlow Lite は、 TensorFlow Lite Task APIおよびTensorFlow Lite Interpreter APIを通じて利用できます。タスク ライブラリは、ビジュアル、オーディオ、およびテキスト データを使用して、一般的な機械学習タスク用に最適化されたすぐに使えるモデル インターフェイスを提供します。 TensorFlow ランタイムおよびサポート ライブラリによって提供される TensorFlow Lite Interpreter API は、ML モデルを構築および実行するためのより汎用的なインターフェースを提供します。

次のセクションでは、Google Play サービスで Interpreter API と Task Library API を実装する方法について説明します。アプリでインタープリター API とタスク ライブラリ API の両方を使用することは可能ですが、ほとんどのアプリでは 1 つの API セットのみを使用する必要があります。

タスク ライブラリ API の使用

TensorFlow Lite Task API は Interpreter API をラップし、ビジュアル、オーディオ、およびテキスト データを使用する一般的な機械学習タスク用の高レベルのプログラミング インターフェースを提供します。サポートされているタスクのいずれかがアプリケーションに必要な場合は、Task API を使用する必要があります。

1. プロジェクトの依存関係を追加する

プロジェクトの依存関係は、機械学習のユース ケースによって異なります。タスク 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

依存関係の 1 つをアプリ プロジェクト コードに追加して、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 の使用

インタープリター API は、タスク ライブラリ API よりも優れた制御と柔軟性を提供します。機械学習タスクが Task ライブラリでサポートされていない場合、または 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. Interpreter を作成し、ランタイム オプションを設定する

次のコード例に示すように、 InterpreterApi.Options.setRuntime() () を使用してInterpreterApi.create()を呼び出して、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 Delegatesページを参照してください。

デバイスの互換性の確認

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

このメソッドを使用して、デバイスが GPU と互換性があるかどうかを確認し、GPU がサポートされていない場合のフォールバックとして CPU または NNAPI デリゲートを使用します。

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

useGpuTaskのような変数を取得したら、それを使用して、デバイスが GPU デリゲートを使用するかどうかを判断できます。次の例は、Task Library API と 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;
});
    

GPU とタスク ライブラリ API

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

  1. プロジェクトの依存関係を更新して、Play サービスから GPU デリゲートを使用します。

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. GPU デリゲートをsetEnableGpuDelegateSupportで初期化します。たとえば、 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();
        

GPU とインタープリター API

インタープリター 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. InterpreterApi.Options() addDelegateFactory()を呼び出して、 DelegateFactoryを使用するようにインタープリター オプションで GPU デリゲートを設定します。

    コトリン

        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. コードを更新する前に、特にバージョン 2.1 より前のバージョンの TensorFlow Lite を使用している場合は、モデルのパフォーマンスと精度のチェックを行い、新しい実装と比較するためのベースラインを用意してください。
  3. TensorFlow Lite の Play サービス API を使用するためにすべてのコードを移行した場合は、既存の TensorFlow Liteランタイム ライブラリの依存関係 ( org.tensorflow: tensorflow-lite :*を含むエントリ) を build.gradle ファイルから削除する必要があります。アプリのサイズを縮小できます。
  4. コード内で発生するnew Interpreterオブジェクトの作成をすべて特定し、InterpreterApi.create() 呼び出しを使用するように変更します。この新しい API は非同期です。つまり、ほとんどの場合、簡単に置き換えることはできず、呼び出しが完了したときのリスナーを登録する必要があります。ステップ 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()への呼び出しのいずれかに引数が 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 バージョンと互換性がありません。

制限事項

Google Play サービスの TensorFlow Lite には次の制限があります。

  • ハードウェア アクセラレーション デリゲートのサポートは、「ハードウェア アクセラレーション」セクションにリストされているデリゲートに限定されます。その他のアクセラレーション デリゲートはサポートされていません。
  • ネイティブ APIを介した TensorFlow Lite へのアクセスはサポートされていません。 TensorFlow Lite Java API のみが Google Play サービスから利用できます。
  • カスタム op を含む実験的または非推奨の TensorFlow Lite API はサポートされていません。

サポートとフィードバック

TensorFlow Issue Tracker を通じてフィードバックを提供し、サポートを受けることができます。 Google Play サービスの TensorFlow Lite の問題テンプレートを使用して、問題とサポート リクエストを報告してください。

利用規約

Google Play サービス API での TensorFlow Lite の使用には、 Google API サービス利用規約が適用されます。

プライバシーとデータ収集

Google Play サービス API で TensorFlow Lite を使用する場合、画像、ビデオ、テキストなどの入力データの処理は完全にデバイス上で行われ、Google Play サービス API の TensorFlow Lite はそのデータを Google サーバーに送信しません。その結果、当社の API を使用して、デバイスから出てはならないデータを処理できます。

Google Play サービス API の TensorFlow Lite は、バグ修正、更新されたモデル、ハードウェア アクセラレータの互換性情報などを受け取るために、時々 Google サーバーに接続する場合があります。 Google Play サービス API の TensorFlow Lite は、アプリ内の API のパフォーマンスと使用率に関する指標も Google に送信します。 Google はこの指標データを使用して、パフォーマンスの測定、デバッグ、API の維持と改善、誤用や乱用の検出を行います。詳細については、プライバシー ポリシーをご覧ください。

デベロッパーは、適用法で義務付けられている Google Play サービス API メトリクス データの TensorFlow Lite の Google による処理について、アプリのユーザーに通知する責任があります。

当社が収集するデータには以下が含まれます。

  • デバイス情報 (メーカー、モデル、OS バージョン、ビルドなど) と利用可能な ML ハードウェア アクセラレータ (GPU および DSP)。診断と使用状況の分析に使用されます。
  • 診断と使用状況の分析に使用されるデバイス識別子。
  • アプリ情報 (パッケージ名、アプリ バージョン)。診断と使用状況の分析に使用されます。
  • API 構成 (どのデリゲートが使用されているかなど)。診断と使用状況の分析に使用されます。
  • イベントの種類 (インタープリターの作成、推論など)。診断と使用状況の分析に使用されます。
  • エラーコード。診断に使用されます。
  • パフォーマンス指標。診断に使用されます。

次のステップ

TensorFlow Lite を使用してモバイル アプリケーションに機械学習を実装する方法の詳細については、 TensorFlow Lite デベロッパー ガイドを参照してください。 TensorFlow Hubで、画像分類、オブジェクト検出、およびその他のアプリケーション用の追加の TensorFlow Lite モデルを見つけることができます。