LiteRT in der C API der Google Play-Dienste (Beta)

Mit LiteRT in der Laufzeit der Google Play-Dienste können Sie Lernmodelle (ML), ohne LiteRT-Bibliotheken statisch zu bündeln, für Ihre App. Dieser Leitfaden enthält eine Anleitung zur Verwendung der C APIs für Google Google Play-Dienste.

Bevor Sie mit LiteRT in der C API der Google Play-Dienste arbeiten, müssen Sie sicherstellen, Sie haben das Build-Tool CMake installiert.

Build-Konfiguration aktualisieren

Füge deinem App-Projektcode die folgenden Abhängigkeiten hinzu, um auf den Play Store zuzugreifen Services API für LiteRT:

implementation "com.google.android.gms:play-services-tflite-java:16.2.0-beta02"

Aktivieren Sie dann die Präferenz um über dein CMake-Skript auf die C API zuzugreifen, indem du den Android-Block aktualisierst. der build.gradle-Datei Ihres Moduls:

buildFeatures {
  prefab = true
}

Abschließend müssen Sie das importierte Paket tensorflowlite_jni_gms_client hinzufügen. als Abhängigkeit in Ihrem CMake-Skript:

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-Laufzeit initialisieren

Vor dem Aufrufen der LiteRT Native API müssen Sie die TfLiteNative-Laufzeit im Java-/Kotlin-Code

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Über die Task API der Google Play-Dienste, TfLiteNative.initialize lädt die TFLite-Laufzeit asynchron aus den Google Play-Diensten in Ihre den Laufzeitprozess der Anwendung. Mit addOnSuccessListener() können Sie sicherstellen, Die Aufgabe „TfLite.initialize()“ ist abgeschlossen, bevor Code ausgeführt wird, der auf LiteRT-APIs Sobald die Aufgabe erfolgreich abgeschlossen wurde, können Sie alle verfügbaren nativen TFLite-APIs.

Native Code-Implementierung

Wenn Sie LiteRT in Google Play-Diensten mit Ihrem nativen Code verwenden möchten, haben Sie folgende Möglichkeiten: eines der folgenden:

  • Deklarieren Sie neue JNI-Funktionen, um native Funktionen aus Ihrem Java-Code aufzurufen
  • Rufen Sie die LiteRT Native API über Ihren vorhandenen nativen C-Code auf.

JNI-Funktionen:

Sie können eine neue JNI-Funktion deklarieren, damit die LiteRT-Laufzeit deklariert wird in Java oder 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
}
        

Übereinstimmung mit 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 aus Ihrem 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")
    // ...
}
      

LiteRT im C-Code

Fügen Sie die entsprechende API-Headerdatei hinzu, um TfLite in Google Play einzubinden. Services API:

#include "tensorflow/lite/c/c_api.h"

Sie können dann die reguläre LiteRT C API verwenden:

auto model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
auto options = TfLiteInterpreterOptionsCreate();
// ...
auto interpreter = TfLiteInterpreterCreate(model, options);

Die Native API-Header von LiteRT mit den Google Play-Diensten bieten die wie die reguläre API LiteRT C API, außer Funktionen, die veraltet sind oder sich noch in der Testphase befinden. Vorerst werden die Funktionen und Typen aus den Headern c_api.h, c_api_types.h und common.h sind verfügbar. Bitte Beachten Sie, dass Funktionen aus dem c_api_experimental.h-Header nicht unterstützt werden.

Sie können für LiteRT spezifische Funktionen mit den Google Play-Diensten verwenden, indem Sie einschließlich tflite.h.