TensorFlow Lite en la API C de servicios de Google Play (Beta)

TensorFlow Lite en el tiempo de ejecución de los servicios de Google Play le permite ejecutar modelos de aprendizaje automático (ML) sin agrupar estáticamente bibliotecas de TensorFlow Lite en su aplicación. Esta guía proporciona instrucciones sobre cómo utilizar las API 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úrese de tener instalada la herramienta de compilación CMake .

Actualice su configuración de compilación

Agregue las siguientes dependencias al código del proyecto de su aplicación 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, habilite la función Prefab para acceder a la API de C desde su script CMake actualizando el bloque de Android del archivo build.gradle de su módulo:

buildFeatures {
  prefab = true
}

Finalmente necesitas agregar el paquete tensorflowlite_jni_gms_client importado de AAR como una dependencia en tu 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)

Inicialice el tiempo de ejecución de TensorFlow Lite

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

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Al utilizar la API de tareas de los servicios de Google Play, TfLiteNative.initialize carga de forma asincrónica el tiempo de ejecución de TFLite desde los servicios de Google Play en el proceso de tiempo de ejecución de su aplicación. Utilice addOnSuccessListener() para asegurarse de que la tarea TfLite.initialize() se complete antes de ejecutar el código que accede a las API de TensorFlow Lite. Una vez que la tarea se haya completado con éxito, puede invocar todas las API nativas de TFLite disponibles.

Implementación de código nativo

Para usar TensorFlow Lite en los servicios de Google Play con su código nativo, puede realizar una de las siguientes acciones:

  • declare nuevas funciones JNI para llamar a funciones nativas desde su código Java
  • Llame a la API nativa de TensorFlow Lite desde su código C nativo existente.

Funciones JNI:

Puedes declarar una nueva función JNI para que el tiempo 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
}
        

Coincidencia de 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 puede llamar a sus funciones C desde su 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

Incluya el archivo de encabezado API apropiado para incluir TfLite con la API de servicios de Google Play:

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

Luego puedes usar la API C normal de TensorFlow Lite:

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

Los encabezados de API nativa de TensorFlow Lite con servicios de Google Play proporcionan la misma API que la API C de TensorFlow Lite normal, excluyendo las funciones que están obsoletas o son experimentales. Por ahora, las funciones y tipos de los encabezados c_api.h , c_api_types.h y common.h están disponibles. Tenga en cuenta que las funciones del encabezado c_api_experimental.h no son compatibles. La documentación se puede encontrar en línea .

Puede utilizar funciones específicas de TensorFlow Lite con los servicios de Google Play incluyendo tflite.h .