TensorFlow Lite w usługach Google Play C API (Beta)

TensorFlow Lite w środowisku wykonawczym usług Google Play umożliwia uruchamianie modeli uczenia maszynowego (ML) bez statycznego dołączania bibliotek TensorFlow Lite do aplikacji. Ten przewodnik zawiera instrukcje dotyczące korzystania z interfejsów API C dla usług Google Play.

Przed rozpoczęciem pracy z TensorFlow Lite w interfejsie API C usług Google Play upewnij się, że masz zainstalowane narzędzie do kompilacji CMake .

Zaktualizuj konfigurację kompilacji

Dodaj następujące zależności do kodu projektu aplikacji, aby uzyskać dostęp do interfejsu API usług Play dla TensorFlow Lite:

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

Następnie włącz funkcję Prefab , aby uzyskać dostęp do interfejsu API języka C ze skryptu CMake, aktualizując blok Android w pliku build.gradle modułu:

buildFeatures {
  prefab = true
}

Na koniec musisz dodać pakiet tensorflowlite_jni_gms_client zaimportowany z AAR jako zależność w skrypcie 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)

Zainicjuj środowisko wykonawcze TensorFlow Lite

Przed wywołaniem natywnego interfejsu API TensorFlow Lite należy zainicjować środowisko wykonawcze TfLiteNative w kodzie Java/Kotlin.

Jawa

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlina

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Korzystając z interfejsu API zadań usług Google Play, TfLiteNative.initialize asynchronicznie ładuje środowisko wykonawcze TFLite z usług Google Play do procesu wykonawczego aplikacji. Użyj addOnSuccessListener() , aby upewnić się, że zadanie TfLite.initialize() zostało zakończone przed wykonaniem kodu uzyskującego dostęp do interfejsów API TensorFlow Lite. Po pomyślnym zakończeniu zadania możesz wywołać wszystkie dostępne natywne interfejsy API TFLite.

Implementacja kodu natywnego

Aby używać TensorFlow Lite w usługach Google Play z kodem natywnym, możesz wykonać jedną z następujących czynności:

  • zadeklaruj nowe funkcje JNI, aby wywoływać funkcje natywne z kodu Java
  • Wywołaj natywny interfejs API TensorFlow Lite z istniejącego natywnego kodu C.

Funkcje JNI:

Możesz zadeklarować nową funkcję JNI, aby środowisko wykonawcze TensorFlow Lite zadeklarowane w Javie/Kotlinie było dostępne dla twojego natywnego kodu w następujący sposób:

Jawa

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);
}
      

Kotlina

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
}
        

Dopasowanie następujących funkcji natywnych loadModel i 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

Następnie możesz wywołać funkcje C z kodu Java/Kotlin:

Jawa

tfLiteHandleTask.onSuccessTask(unused -> {
    TfLiteJni jni = new TfLiteJni();
    jni.loadModel(getAssets(), "add.bin");
    //...
});
    

Kotlina

tfLiteHandleTask.onSuccessTask {
    val jni = TfLiteJni()
    jni.loadModel(assets, "add.bin")
    // ...
}
      

TensorFlow Lite w kodzie C

Dołącz odpowiedni plik nagłówkowy API, aby dołączyć TfLite do API usług Google Play:

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

Następnie możesz użyć zwykłego interfejsu API TensorFlow Lite C:

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

TensorFlow Lite z natywnymi nagłówkami API usług Google Play udostępnia ten sam interfejs API, co zwykły interfejs API TensorFlow Lite C , z wyjątkiem funkcji, które są przestarzałe lub eksperymentalne. Na razie dostępne są funkcje i typy z nagłówków c_api.h , c_api_types.h i common.h . Należy pamiętać, że funkcje z nagłówka c_api_experimental.h nie są obsługiwane. Dokumentację można znaleźć w Internecie .

Możesz korzystać z funkcji specyficznych dla TensorFlow Lite w Usługach Google Play, włączając tflite.h .