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.h
、 c_api_types.h
、およびcommon.h
ヘッダーの関数と型が利用可能です。 c_api_experimental.h
ヘッダーの関数はサポートされていないことに注意してください。ドキュメントはオンラインで見つけることができます。
tflite.h
をインクルードすることで、Google Play Services で TensorFlow Lite に固有の機能を使用できます。