メタデータを使用してモデルインターフェイスを生成する

開発者は、 TensorFlow Liteメタデータを使用して、Androidでの統合を可能にするラッパーコードを生成できます。ほとんどの開発者にとって、 Android StudioMLモデルバインディングのグラフィカルインターフェイスが最も使いやすいです。さらにカスタマイズが必要な場合、またはコマンドラインツールを使用している場合は、 TensorFlow LiteCodegenも利用できます。

Android StudioMLモデルバインディングを使用する

メタデータで拡張されたTensorFlowLiteモデルの場合、開発者はAndroid Studio MLモデルバインディングを使用して、プロジェクトの設定を自動的に構成し、モデルメタデータに基づいてラッパークラスを生成できます。ラッパーコードにより、 ByteBufferと直接対話する必要がなくなります。代わりに、開発者はBitmapRectなどの型指定されたオブジェクトを使用してTensorFlowLiteモデルと対話できます。

TensorFlowLiteモデルをAndroidStudioにインポートします

  1. モジュールを右クリックしますTFLiteモデルを使用するか、をクリックしたいFile 、そしてNew > Other > TensorFlow Lite Model メニューを右クリックして、TensorFlowLiteのインポート機能にアクセスします

  2. TFLiteファイルの場所を選択します。ツールは、MLモデルバインディングを使用してモジュールの依存関係を構成し、すべての依存関係はAndroidモジュールのbuild.gradleファイルに自動的に挿入されることに注意してください。

    オプション:GPUアクセラレーションを使用する場合は、TensorFlowGPUをインポートするための2番目のチェックボックスを選択します。 TFLiteモデルのインポートダイアログ

  3. [ Finishクリックします。

  4. インポートが成功すると、次の画面が表示されます。モデルの使用を開始するには、KotlinまたはJavaを選択し、コードをコピーして[ Sample Codeセクションに貼り付けます。 Android Studioのmlディレクトリの下にあるTFLiteモデルをダブルクリックすると、この画面に戻ることができます。 AndroidStudioのモデル詳細ページ

モデル推論の加速

ML Model Bindingは、開発者がデリゲートとスレッド数を使用してコードを高速化する方法を提供します。

手順1.モジュールbuild.gradleファイルに次の依存関係が含まれていることを確認します。

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
    }

手順2.デバイスで実行されているGPUがTensorFlowGPUデリゲートと互換性があるかどうかを検出します。互換性がない場合は、複数のCPUスレッドを使用してモデルを実行します。

Kotlin

    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate

    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice) {
        // if the device has a supported GPU, add the GPU delegate
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        // if the GPU is not supported, run on 4 threads
        Model.Options.Builder().setNumThreads(4).build()
    }

    // Initialize the model as usual feeding in the options object
    val myModel = MyModel.newInstance(context, options)

    // Run inference per sample code
      

Java

    import org.tensorflow.lite.support.model.Model
    import org.tensorflow.lite.gpu.CompatibilityList;
    import org.tensorflow.lite.gpu.GpuDelegate;

    // Initialize interpreter with GPU delegate
    Model.Options options;
    CompatibilityList compatList = CompatibilityList();

    if(compatList.isDelegateSupportedOnThisDevice()){
        // if the device has a supported GPU, add the GPU delegate
        options = Model.Options.Builder().setDevice(Model.Device.GPU).build();
    } else {
        // if the GPU is not supported, run on 4 threads
        options = Model.Options.Builder().setNumThreads(4).build();
    }

    MyModel myModel = new MyModel.newInstance(context, options);

    // Run inference per sample code
      

TensorFlowLiteコードジェネレーターを使用してモデルインターフェースを生成する

メタデータで拡張されたTensorFlowLiteモデルの場合、開発者はTensorFlow Lite Androidラッパーコードジェネレーターを使用して、プラットフォーム固有のラッパーコードを作成できます。ラッパーコードにより、 ByteBufferと直接対話する必要がなくなります。代わりに、開発者はBitmapRectなどの型指定されたオブジェクトを使用してTensorFlowLiteモデルと対話できます。

コードジェネレーターの有用性は、TensorFlowLiteモデルのメタデータエントリの完全性に依存します。 codegenツールが各フィールドを解析する方法については、 metadata_schema.fbsの関連フィールドの下にある<Codegen usage>セクションを参照してください。

ラッパーコードを生成する

ターミナルに次のツールをインストールする必要があります。

pip install tflite-support

完了すると、次の構文を使用してコードジェネレーターを使用できます。

tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --package_name=org.tensorflow.lite.classify \
    --model_class_name=MyClassifierModel \
    --destination=./classify_wrapper

結果のコードは、宛先ディレクトリに配置されます。 Google Colabまたはその他のリモート環境を使用している場合は、結果をzipアーカイブに圧縮してAndroidStudioプロジェクトにダウンロードする方が簡単な場合があります。

# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/

# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')

生成されたコードを使用する

ステップ1:生成されたコードをインポートする

必要に応じて、生成されたコードをディレクトリ構造に解凍します。生成されたコードのルートはSRC_ROOTと想定されます。

TensorFlowliteモデルを使用するAndroidStudioプロジェクトを開き、生成されたモジュールを次の方法でインポートします。ファイル->新規->モジュールのインポート-> SRC_ROOT選択しますSRC_ROOT

上記の例を使用すると、インポートされたディレクトリとモジュールはclassify_wrapperと呼ばれます。

ステップ2:アプリのbuild.gradleファイルを更新します

生成されたライブラリモジュールを消費するアプリモジュールでは、次のようになります。

androidセクションの下に、以下を追加します。

aaptOptions {
   noCompress "tflite"
}

依存関係セクションの下に、以下を追加します。

implementation project(":classify_wrapper")

ステップ3:モデルを使用する

// 1. Initialize the model
MyClassifierModel myImageClassifier = null;

try {
    myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
    // Error reading the model
}

if(null != myImageClassifier) {

    // 2. Set the input with a Bitmap called inputBitmap
    MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
    inputs.loadImage(inputBitmap));

    // 3. Run the model
    MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);

    // 4. Retrieve the result
    Map<String, Float> labeledProbability = outputs.getProbability();
}

モデル推論の加速

生成されたコードは、開発者がデリゲートとスレッド数を使用してコードを高速化する方法を提供します。これらは、モデルオブジェクトを開始するときに設定できます。これは、次の3つのパラメータを使用するためです。

  • Context :Androidアクティビティまたはサービスからのコンテキスト
  • (オプション) Device :GPUDelegateやNNAPIDelegateなどのTFLiteアクセラレーションデリゲート
  • (オプション) numThreads :モデルの実行に使用されるスレッドの数-デフォルトは1です。

たとえば、NNAPIデリゲートと最大3つのスレッドを使用するには、次のようにモデルを初期化できます。

try {
    myImageClassifier = new MyClassifierModel(this, Model.Device.NNAPI, 3);
} catch (IOException io){
    // Error reading the model
}

トラブルシューティング

'java.io.FileNotFoundExceptionが発生した場合:このファイルをファイル記述子として開くことはできません。おそらく圧縮されたエラーです。ライブラリモジュールを使用するアプリモジュールのandroidセクションの下に次の行を挿入します。

aaptOptions {
   noCompress "tflite"
}