TensorFlow Lite nell'API C dei servizi Google Play (Beta)

TensorFlow Lite nel runtime dei servizi Google Play ti consente di eseguire modelli di machine learning (ML) senza raggruppare staticamente le librerie TensorFlow Lite nella tua app. Questa guida fornisce istruzioni su come utilizzare le API C per i servizi Google Play.

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

Aggiorna la configurazione della build

Aggiungi le seguenti dipendenze al codice del progetto della tua 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 dal tuo script CMake aggiornando il blocco Android del file build.gradle del tuo modulo:

buildFeatures {
  prefab = true
}

Infine devi aggiungere il pacchetto tensorflowlite_jni_gms_client importato da AAR come dipendenza nel tuo 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 di TensorFlow Lite

Prima di chiamare l'API nativa TensorFlow Lite è necessario inizializzare il runtime TfLiteNative nel codice Java/Kotlin.

Giava

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

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

Implementazione del codice nativo

Per utilizzare TensorFlow Lite nei servizi Google Play con il tuo codice nativo, puoi effettuare una delle seguenti operazioni:

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

Funzioni JNI:

Puoi dichiarare una nuova funzione JNI per rendere il runtime TensorFlow Lite dichiarato in Java/Kotlin accessibile al tuo codice nativo come segue:

Giava

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
}
        

Corrispondenza delle 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

Puoi quindi chiamare le tue funzioni C dal tuo codice Java/Kotlin:

Giava

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 API appropriato per includere TfLite con l'API dei servizi Google Play:

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

È quindi possibile utilizzare la normale API TensorFlow Lite C:

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

Le intestazioni API native di TensorFlow Lite con Google Play Services forniscono la stessa API della normale API C di TensorFlow Lite , escluse le funzionalità deprecate o sperimentali. Per ora 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. La documentazione è reperibile online .

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