TensorFlow Lite na API C do Google Play Services (Beta)

O TensorFlow Lite no ambiente de execução do Google Play Services permite executar modelos de machine learning (ML) sem agrupar bibliotecas do TensorFlow Lite estaticamente no seu app. Este guia fornece instruções sobre como usar as APIs C para o Google Play Services.

Antes de trabalhar com o TensorFlow Lite na API C do Google Play Services, verifique se você tem a ferramenta de build CMake instalada.

Atualizar a configuração da compilação

Adicione as seguintes dependências ao código do projeto do app para acessar a API Play Services para o TensorFlow Lite:

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

Em seguida, ative o recurso Prefab (link em inglês) para acessar a API C no script do CMake atualizando o bloco Android do arquivo build.gradle do módulo:

buildFeatures {
  prefab = true
}

Por fim, você precisa adicionar o pacote tensorflowlite_jni_gms_client importado do AAR como uma dependência no script do 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)

Inicializar o ambiente de execução do TensorFlow Lite

Antes de chamar a API nativa do TensorFlow Lite, inicialize o ambiente de execução TfLiteNative no código Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Usando a API Task do Google Play Services, TfLiteNative.initialize carrega de forma assíncrona o ambiente de execução do TFLite do Google Play Services no processo de execução do seu app. Use addOnSuccessListener() para garantir que a tarefa TfLite.initialize() seja concluída antes de executar o código que acessa as APIs do TensorFlow Lite. Depois que a tarefa for concluída, você poderá invocar todas as APIs nativas do TFLite disponíveis.

Implementação de código nativo

Para usar o TensorFlow Lite no Google Play Services com seu código nativo, siga um destes procedimentos:

  • declarar novas funções JNI para chamar funções nativas do código Java
  • Chame a API nativa do TensorFlow Lite usando o código C nativo.

Funções JNI:

É possível declarar uma nova função JNI para tornar o ambiente de execução do TensorFlow Lite declarado em Java/Kotlin acessível ao código nativo da seguinte maneira:

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
}
        

Correspondência das seguintes funções nativas 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

Em seguida, você pode chamar suas funções C pelo 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 em código C

Inclua o arquivo principal da API adequado para incluir o TfLite com a API Google Play Services:

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

Em seguida, use a API TensorFlow Lite C normal:

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

Os cabeçalhos da API nativa do TensorFlow Lite com o Google Play Services fornecem a mesma API que a API TensorFlow Lite C normal, exceto recursos que foram descontinuados ou experimentais. Por enquanto, as funções e os tipos dos cabeçalhos c_api.h, c_api_types.h e common.h estão disponíveis. As funções do cabeçalho c_api_experimental.h não são compatíveis.

É possível usar funções específicas do TensorFlow Lite com o Google Play Services incluindo tflite.h.