TensorFlow Lite en la API C de los Servicios de Google Play (beta)

TensorFlow Lite en el entorno de ejecución de los Servicios de Google Play te permite ejecutar modelos de aprendizaje automático (AA) sin agrupar de forma estática las bibliotecas de TensorFlow Lite en tu app. En esta guía, se proporcionan instrucciones sobre cómo usar las APIs de C para los Servicios de Google Play.

Antes de trabajar con TensorFlow Lite en la API C de los Servicios de Google Play, asegúrate de tener instalada la herramienta de compilación CMake.

Cómo actualizar la configuración de tu compilación

Agrega las siguientes dependencias al código del proyecto de tu app para acceder a la API de Servicios de Play para TensorFlow Lite:

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

Luego, habilita la función Prefab para acceder a la API para C desde la secuencia de comandos de CMake actualizando el bloque de Android del archivo build.gradle del módulo:

buildFeatures {
  prefab = true
}

Por último, debes agregar el paquete tensorflowlite_jni_gms_client importado desde el AAR como una dependencia en la secuencia de comandos de 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)

Inicializa el entorno de ejecución de TensorFlow Lite

Antes de llamar a la API nativa de TensorFlow Lite, debes inicializar el entorno de ejecución TfLiteNative en el código Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Con la API de Tasks de los Servicios de Google Play, TfLiteNative.initialize carga de forma asíncrona el entorno de ejecución de TFLite desde los Servicios de Google Play al proceso del tiempo de ejecución de tu aplicación. Usa addOnSuccessListener() para asegurarte de que la tarea TfLite.initialize() se complete antes de ejecutar el código que accede a las APIs de TensorFlow Lite. Una vez que se haya completado correctamente la tarea, podrás invocar todas las APIs nativas de TFLite disponibles.

Implementación de código nativo

Para usar TensorFlow Lite en los Servicios de Google Play con tu código nativo, puedes realizar una de las siguientes acciones:

  • declarar nuevas funciones JNI para llamar a funciones nativas desde tu código Java
  • Llama a la API nativa de TensorFlow Lite desde tu código C nativo existente.

Funciones de JNI:

Puedes declarar una nueva función JNI para que el entorno de ejecución de TensorFlow Lite declarado en Java/Kotlin sea accesible para tu código nativo de la siguiente manera:

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
}
        

Coincidencias con las siguientes funciones nativas loadModel y 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

Luego, puedes llamar a tus funciones C desde el código 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 en código C

Incluye el archivo de encabezado de API adecuado para incluir TfLite con la API de los Servicios de Google Play:

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

Luego, puedes usar la API normal de TensorFlow Lite C:

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

Los encabezados de la API nativa de TensorFlow Lite con los Servicios de Google Play proporcionan la misma API que la API normal de TensorFlow Lite para C, y se excluyen las funciones que están obsoletas o experimentales. Por ahora, están disponibles las funciones y los tipos de los encabezados c_api.h, c_api_types.h y common.h. Ten en cuenta que no se admiten las funciones del encabezado c_api_experimental.h.

Puedes usar funciones específicas de TensorFlow Lite con los Servicios de Google Play, incluido tflite.h.