TensorFlow Lite nell'API C di Google Play Services (beta)

TensorFlow Lite nel runtime di Google Play Services consente di eseguire modelli di machine learning (ML) senza integrare in modo statico le librerie TensorFlow Lite nella tua app. Questa guida fornisce istruzioni su come utilizzare le API C per Google Play Services.

Prima di utilizzare TensorFlow Lite nell'API C di Google Play Services, assicurati di avere installato lo strumento di creazione CMake.

Aggiorna la configurazione della build

Aggiungi le seguenti dipendenze al codice del progetto dell'app per accedere all'API Play Services per TensorFlow Lite:

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

Quindi, abilita la funzionalità Prefab per accedere all'API C dallo script CMake aggiornando il blocco Android del file build.gradle del modulo:

buildFeatures {
  prefab = true
}

Infine, devi aggiungere il pacchetto tensorflowlite_jni_gms_client importato da AAR come dipendenza nello script 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)

Inizializza il runtime TensorFlow Lite

Prima di chiamare l'API nativa TensorFlow Lite, devi inizializzare il runtime TfLiteNative nel tuo codice Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Utilizzando l'API Google Play Services Task, TfLiteNative.initialize carica in modo asincrono il runtime TFLite da Google Play Services nel processo di runtime della tua applicazione. Usa addOnSuccessListener() per assicurarti che l'attività TfLite.initialize() venga completata prima di eseguire il codice che accede alle API TensorFlow Lite. Una volta completata l'attività, puoi richiamare tutte le API TFLite native disponibili.

Implementazione di codice nativo

Per utilizzare TensorFlow Lite in Google Play Services con il tuo codice nativo, puoi:

  • dichiarare nuove funzioni JNI per chiamare funzioni native dal tuo codice Java.
  • Chiama l'API Native TensorFlow Lite dal codice C nativo esistente.

Funzioni JNI:

Puoi dichiarare una nuova funzione JNI per rendere accessibile al tuo codice nativo il runtime TensorFlow Lite dichiarato in 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
}
        

Corrisponde alle seguenti funzioni native loadModel e 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

Quindi puoi chiamare le funzioni C dal tuo codice Java/Kotlin:

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 codice C

Includi il file di intestazione dell'API appropriato per includere l'API TfLite con Google Play Services:

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

Puoi quindi utilizzare l'API TensorFlow Lite C standard:

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

Le intestazioni dell'API TensorFlow Lite con l'API nativa di Google Play Services forniscono la stessa API dell'API TensorFlow Lite C standard, escluse le funzionalità deprecate o sperimentali. Per il momento sono disponibili le funzioni e i tipi delle intestazioni c_api.h, c_api_types.h e common.h. Tieni presente che le funzioni dell'intestazione c_api_experimental.h non sono supportate.

Puoi utilizzare funzioni specifiche di TensorFlow Lite con Google Play Services come tflite.h.