TensorFlow Lite in Google Play Services C API (Beta)

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.