Mit TensorFlow Lite in der Laufzeit von Google Play-Diensten können Sie Modelle für maschinelles Lernen (ML) ausführen, ohne TensorFlow Lite-Bibliotheken statisch in Ihrer App zu bündeln. Diese Anleitung enthält eine Anleitung zur Verwendung der C APIs für Google Play-Dienste.
Bevor Sie mit TensorFlow Lite in der C API der Google Play-Dienste arbeiten, muss das Build-Tool CMake installiert sein.
Build-Konfiguration aktualisieren
Fügen Sie dem Code Ihres App-Projekts die folgenden Abhängigkeiten hinzu, um auf die Play Services API für TensorFlow Lite zuzugreifen:
implementation "com.google.android.gms:play-services-tflite-java:16.2.0-beta02"
Aktivieren Sie dann die Prefab-Funktion, um über Ihr CMake-Skript auf die C API zuzugreifen. Aktualisieren Sie dazu den Android-Block der build.gradle-Datei Ihres Moduls:
buildFeatures {
prefab = true
}
Schließlich müssen Sie das aus AAR importierte Paket tensorflowlite_jni_gms_client
als Abhängigkeit in Ihr CMake-Skript einfügen:
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-Laufzeit initialisieren
Bevor Sie die TensorFlow Lite Native API aufrufen, müssen Sie die TfLiteNative
-Laufzeit in Ihrem Java-/Kotlin-Code initialisieren.
Java
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
Kotlin
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
Mithilfe der Task API der Google Play-Dienste lädt TfLiteNative.initialize
die TFLite-Laufzeit asynchron aus Google Play-Diensten in den Laufzeitprozess Ihrer Anwendung. Prüfen Sie mit addOnSuccessListener()
, ob die Aufgabe TfLite.initialize()
abgeschlossen ist, bevor Sie Code ausführen, der auf TensorFlow Lite APIs zugreift. Nachdem die Aufgabe erfolgreich abgeschlossen wurde, können Sie alle verfügbaren nativen TFLite APIs aufrufen.
Implementierung von nativem Code
Sie haben folgende Möglichkeiten, TensorFlow Lite in Google Play-Diensten mit Ihrem nativen Code zu verwenden:
- Neue JNI-Funktionen deklarieren, um native Funktionen aus Ihrem Java-Code aufzurufen
- Rufen Sie die TensorFlow Lite Native API über Ihren vorhandenen nativen C-Code auf.
JNI-Funktionen:
So können Sie eine neue JNI-Funktion deklarieren, um die in Java/Kotlin deklarierte TensorFlow Lite-Laufzeit für Ihren nativen Code zugänglich zu machen:
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 }
Passend zu den folgenden nativen loadModel
- und runInference
-Funktionen:
#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
Anschließend können Sie die C-Funktionen über Ihren Java-/Kotlin-Code aufrufen:
Java
tfLiteHandleTask.onSuccessTask(unused -> { TfLiteJni jni = new TfLiteJni(); jni.loadModel(getAssets(), "add.bin"); //... });
Kotlin
tfLiteHandleTask.onSuccessTask { val jni = TfLiteJni() jni.loadModel(assets, "add.bin") // ... }
TensorFlow Lite in C-Code
Fügen Sie die entsprechende API-Header-Datei hinzu, um die TfLite mit Google Play Services API einzubinden:
#include "tensorflow/lite/c/c_api.h"
Sie können dann die reguläre TensorFlow Lite C API verwenden:
auto model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
auto options = TfLiteInterpreterOptionsCreate();
// ...
auto interpreter = TfLiteInterpreterCreate(model, options);
Die nativen API-Header von TensorFlow Lite mit Google Play-Diensten bieten dieselbe API wie die reguläre TensorFlow Lite C API, mit Ausnahme von verworfenen oder experimentellen Features. Derzeit sind die Funktionen und Typen aus den Headern c_api.h
, c_api_types.h
und common.h
verfügbar. Funktionen des Headers c_api_experimental.h
werden nicht unterstützt.
Sie können Funktionen speziell für TensorFlow Lite mit Google Play-Diensten verwenden, indem Sie tflite.h
einschließen.