MLコミュニティデーは11月9日です! TensorFlow、JAXからの更新のために私たちに参加し、より多くの詳細をご覧ください

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

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

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

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

注意: Android Studio 4.1 以上が必要です。

TensorFlow Lite モデルを Android Studio にインポートする

  1. TF Lite モデルを使用するモジュールを右クリックするか、File をクリックして、New > Other > TensorFlow Lite Model に移動します。Right-click menus to access the TensorFlow Lite import functionality

  2. TFLite ファイルの場所を選択します。ユーザーに代わってツールが、ML Model バインディングとのモジュールの依存関係と Android モジュールの build.gradle ファイルに自動的に挿入されたすべての依存関係を構成します。

    オプション: GPU アクセラレーションを使用する場合は、TensorFlow GPU をインポートするための 2 番目のチェックをオンにしてください。

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

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

モデル推論の加速

ML Model Binding を利用すると、開発者はデリゲートや様々なスレッドを使用してコードを高速化できます。

注意: TensorFlow Lite インタープリタは、実行時と同じスレッドで作成する必要があります。そうでないと、「TfLiteGpuDelegate Invoke: GpuDelegate must run on the same thread where it was initialized.」が表示される可能性があります。

ステップ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 が TensorFlow GPU デリゲートと互換性があるかどうかを検出します。互換性がない場合は、複数の CPU スレッドを使用してモデルを実行します。

Kotlin

    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate
</div>
<pre data-md-type="block_code" data-md-language=""><code>GL_CODE_13</code>

TensorFlow Lite コードジェネレータを使用してモデルインターフェイスを生成する{:#codegen}

注意:TensorFlow Lite ラッパーコードジェネレータは現在、Android のみをサポートしています。

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

コードジェネレータの有用性は、TensorFlow Lite モデルのメタデータエントリの完全性に依存します。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であると想定されます。

TensorFlow Lite モデルを使用する Android Studio プロジェクトを開き、生成されたモジュールを次の方法でインポートします。And File-> New-> Import Module-> 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 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: This file can not be opened as a file descriptor; it is probably compressed」エラーが発生する場合、ライブラリモジュールを使用するアプリモジュールの Android セクションの下に次の行を挿入します。

aaptOptions {
   noCompress "tflite"
}