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

LiteRT メタデータを使用すると、デベロッパーは Android での統合を可能にするラッパーコードを生成できます。ほとんどのデベロッパーにとって、Android Studio ML Model Binding のグラフィカル インターフェースが最も使いやすいでしょう。さらにカスタマイズが必要な場合や、コマンドライン ツールを使用している場合は、LiteRT Codegen も利用できます。

Android Studio ML Model Binding を使用する

メタデータで強化された LiteRT モデルの場合、デベロッパーは Android Studio ML Model Binding を使用して、プロジェクトの設定を自動的に構成し、モデルのメタデータに基づいてラッパー クラスを生成できます。ラッパーコードにより、ByteBuffer を直接操作する必要がなくなります。代わりに、デベロッパーは BitmapRect などの型付きオブジェクトを使用して LiteRT モデルを操作できます。

Android Studio で LiteRT モデルをインポートする

  1. TFLite モデルを使用するモジュールを右クリックするか、File をクリックしてから New > Other > LiteRT Model をクリックします。

  2. TFLite ファイルの場所を選択します。ツールは、ML Model Binding を使用してモジュールの依存関係を自動的に構成し、すべての依存関係を Android モジュールの build.gradle ファイルに自動的に挿入します。

    省略可: GPU アクセラレーションを使用する場合は、TensorFlow GPU をインポートするための 2 番目のチェックボックスをオンにします。

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

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

モデルの推論を高速化する

ML Model Binding を使用すると、デリゲートとスレッド数を使用してコードを高速化できます。

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

    dependencies {
        ...
        // For the LiteRT GPU delegate, we need
        // 'com.google.ai.edge.litert:litert-gpu' version 1.*.
        implementation 'com.google.ai.edge.litert:litert-gpu:1.4.1'
    }

ステップ 2. デバイスで実行されている GPU が TensorFlow GPU デリゲートと互換性があるかどうかを検出し、互換性がない場合は複数の 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
      

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

メタデータで強化された LiteRT モデルの場合、デベロッパーは LiteRT Android ラッパー コード生成ツールを使用して、プラットフォーム固有のラッパー コードを作成できます。ラッパーコードにより、ByteBuffer と直接やり取りする必要がなくなります。代わりに、開発者は BitmapRect などの型付きオブジェクトを使用して TensorFlow Lite モデルを操作できます。

コード生成ツールの有用性は、LiteRT モデルのメタデータ エントリの完全性に依存します。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 アーカイブに圧縮して Android Studio プロジェクトにダウンロードする方が簡単な場合があります。

# 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 であると想定されます。

LiteRT モデルを使用する Android Studio プロジェクトを開き、[File] -> [New] -> [Import Module] -> SRC_ROOT を選択して、生成されたモジュールをインポートします。

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

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

生成されたライブラリ モジュールを使用するアプリ モジュールで:

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

aaptOptions {
   noCompress "tflite"
}

dependencies セクションに、次のコードを追加します。

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: TFLite アクセラレーション デリゲート。例: GPUDelegate
  • (省略可)numThreads: モデルの実行に使用するスレッド数。デフォルトは 1 です。

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

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

トラブルシューティング

「java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed」というエラーが表示された場合は、ライブラリ モジュールを使用するアプリ モジュールの android セクションの下に次の行を挿入します。

aaptOptions {
   noCompress "tflite"
}