Google Play 服務執行階段中的 LiteRT 能讓您 機器學習 (ML) 模型,不必靜態連結 LiteRT 程式庫 本指南將說明 Google 適用的 C API Play 服務。
在 Google Play 服務 C API 中使用 LiteRT 之前,請確認 已安裝 CMake 建構工具。
更新建構設定
在應用程式專案程式碼中加入下列依附元件,即可存取 Google Play Services API for LiteRT:
implementation "com.google.android.gms:play-services-tflite-java:16.2.0-beta02"
接著,請啟用 Prefab 功能即可藉由更新 Android 區塊,從 CMake 指令碼存取 C API 即可:
buildFeatures {
prefab = true
}
最後,您需要新增已匯入的套件 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)
初始化 LiteRT 執行階段
呼叫 LiteRT Native API 之前,您必須先初始化
Java/Kotlin 程式碼中的 TfLiteNative
執行階段。
Java
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
Kotlin
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
使用 Google Play 服務 Task API,TfLiteNative.initialize
以非同步方式將 Google Play 服務的 TFLite 執行階段載入
在應用程式的執行階段程序中使用 addOnSuccessListener()
可確保
有 TfLite.initialize()
項工作在執行要存取的程式碼前已完成
LiteRT API。順利完成工作後,您便可叫用
所有可用的 TFLite Native API
原生程式碼導入
如要透過原生程式碼在 Google Play 服務中使用 LiteRT,您可以這麼做 下列其中一項:
- 宣告新的 JNI 函式,以便從 Java 程式碼呼叫原生函式
- 從現有的原生 C 程式碼呼叫 LiteRT Native API。
JNI 函式:
您可以宣告新的 JNI 函式來宣告 LiteRT 執行階段 原生程式碼可存取的 Java/Kotlin 中,如下所示:
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 程式碼中的 LiteRT
加入適當的 API 標頭檔案,將 TfLite 納入 Google Play Services API:
#include "tensorflow/lite/c/c_api.h"
接著,您就可以使用一般 LiteRT C API:
auto model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
auto options = TfLiteInterpreterOptionsCreate();
// ...
auto interpreter = TfLiteInterpreterCreate(model, options);
搭配 Google Play 服務原生 API 標頭的 LiteRT 提供了
和平常一樣
LiteRT C API,但不
包括已淘汰或實驗功能的功能現在函式和類型
可用的標頭為 c_api.h
、c_api_types.h
和 common.h
。請
請注意,系統不支援 c_api_experimental.h
標頭中的函式。
如要搭配 Google Play 服務使用 LiteRT 專用函式,請按照以下步驟操作:
包括 tflite.h
。