Google Play サービス C API の TensorFlow Lite (ベータ版)

Google Play サービス ランタイムの TensorFlow Lite を使用すると、TensorFlow Lite ライブラリをアプリに静的にバンドルすることなく、機械学習 (ML) モデルを実行できます。このガイドでは、Google Play サービスの C API の使用方法について説明します。

Google Play サービス C API で TensorFlow Lite を使用する前に、 CMakeビルド ツールがインストールされていることを確認してください。

ビルド構成を更新する

TensorFlow Lite の Play サービス API にアクセスするには、次の依存関係をアプリ プロジェクト コードに追加します。

implementation "com.google.android.gms:play-services-tflite-java:16.2.0-beta02"

次に、モジュールの build.gradle ファイルの android ブロックを更新することで、プレハブ機能が CMake スクリプトから C API にアクセスできるようにします。

buildFeatures {
  prefab = true
}

最後に、AAR からインポートされたパッケージtensorflowlite_jni_gms_client依存関係として CMake スクリプトに追加する必要があります。

find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)

target_link_libraries(tflite-jni # your JNI lib target
        tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client
        android # other deps for your target
        log)

# Also add -DTFLITE_IN_GMSCORE -DTFLITE_WITH_STABLE_ABI
# to the C/C++ compiler flags.

add_compile_definitions(TFLITE_IN_GMSCORE)
add_compile_definitions(TFLITE_WITH_STABLE_ABI)

TensorFlow Lite ランタイムを初期化する

TensorFlow Lite ネイティブ API を呼び出す前に、Java/Kotlin コードでTfLiteNativeランタイムを初期化する必要があります。

ジャワ

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

コトリン

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

TfLiteNative.initialize 、Google Play サービスの Task API を使用して、TFLite ランタイムを Google Play サービスからアプリケーションのランタイム プロセスに非同期的に読み込みます。 addOnSuccessListener()を使用して、TensorFlow Lite API にアクセスするコードを実行する前にTfLite.initialize()タスクが完了していることを確認します。タスクが正常に完了すると、利用可能なすべての TFLite ネイティブ API を呼び出すことができます。

ネイティブコードの実装

Google Play サービスでネイティブ コードを使用して TensorFlow Lite を使用するには、次のいずれかを実行できます。

  • 新しい JNI 関数を宣言して Java コードからネイティブ関数を呼び出す
  • 既存のネイティブ C コードから TensorFlow Lite ネイティブ API を呼び出します。

JNI 関数:

次のように、新しい JNI 関数を宣言して、Java/Kotlin で宣言された TensorFlow Lite ランタイムにネイティブ コードからアクセスできるようにすることができます。

ジャワ

package com.google.samples.gms.tflite.c;

public class TfLiteJni {
  static {
    System.loadLibrary("tflite-jni");
  }
  public TfLiteJni() { /**/ };
  public native void loadModel(AssetManager assetManager, String assetName);
  public native float[] runInference(float[] input);
}
      

コトリン

package com.google.samples.gms.tflite.c

class TfLiteJni() {
  companion object {
    init {
      System.loadLibrary("tflite-jni")
    }
  }
  external fun loadModel(assetManager: AssetManager, assetName: String)
  external fun runInference(input: FloatArray): FloatArray
}
        

次のloadModelおよびrunInferenceネイティブ関数と一致します。

#ifdef __cplusplus
extern "C" {
#endif

void Java_com_google_samples_gms_tflite_c_loadModel(
  JNIEnv *env, jobject tflite_jni, jobject asset_manager, jstring asset_name){}
  //...
}

jfloatArray Java_com_google_samples_gms_tflite_c_TfLiteJni_runInference(
  JNIEnv* env, jobject tfliteJni, jfloatArray input) {
  //...
}

#ifdef __cplusplus
}  // extern "C".
#endif

その後、Java/Kotlin コードから C 関数を呼び出すことができます。

ジャワ

tfLiteHandleTask.onSuccessTask(unused -> {
    TfLiteJni jni = new TfLiteJni();
    jni.loadModel(getAssets(), "add.bin");
    //...
});
    

コトリン

tfLiteHandleTask.onSuccessTask {
    val jni = TfLiteJni()
    jni.loadModel(assets, "add.bin")
    // ...
}
      

C コードの TensorFlow Lite

TfLite を Google Play サービス API に含めるには、適切な API ヘッダー ファイルを含めます。

#include "tensorflow/lite/c/c_api.h"

その後、通常の TensorFlow Lite C API を使用できるようになります。

auto model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
auto options = TfLiteInterpreterOptionsCreate();
// ...
auto interpreter = TfLiteInterpreterCreate(model, options);

Google Play サービスのネイティブ API ヘッダーを備えた TensorFlow Lite は、非推奨または実験的な機能を除き、通常のTensorFlow Lite C APIと同じ API を提供します。現時点では、 c_api.hc_api_types.h 、およびcommon.hヘッダーの関数と型が利用可能です。 c_api_experimental.hヘッダーの関数はサポートされていないことに注意してください。ドキュメントはオンラインで見つけることができます。

tflite.hをインクルードすることで、Google Play Services で TensorFlow Lite に固有の機能を使用できます。