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
.