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 にアクセスできるように Prefab 機能を有効にします。

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 Native API を呼び出す前に、Java/Kotlin コードで TfLiteNative ランタイムを初期化する必要があります。

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

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

ネイティブ コードの実装

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

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

JNI 関数:

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

Java

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);
}
      

Kotlin

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 関数を呼び出すことができます。

Java

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

Kotlin

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

C コードの TensorFlow Lite

適切な API ヘッダー ファイルをインクルードして、Google Play 開発者サービス API で TfLite をインクルードします。

#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);

TensorFlow Lite と Google Play 開発者サービスの Native API ヘッダーは、非推奨または試験運用版の機能を除き、通常の TensorFlow Lite C API と同じ API を提供します。現時点では、c_api.hc_api_types.hcommon.h ヘッダーの関数と型を利用できます。c_api_experimental.h ヘッダーからの関数はサポートされていません。

tflite.h を含めることで、Google Play 開発者サービスで TensorFlow Lite 固有の関数を使用できます。