TensorFlow Lite w interfejsie Google Play Services C API (beta)

TensorFlow Lite w środowisku wykonawczym Usług Google Play pozwala na uruchamianie modeli systemów uczących się (ML) bez statycznego grupowania bibliotek TensorFlow Lite w aplikację. Ten przewodnik zawiera instrukcje, jak używać interfejsów API typu C w usługach Google Play.

Zanim zaczniesz korzystać z TensorFlow Lite w interfejsie Google Play Services C API, upewnij się, że masz zainstalowane narzędzie do kompilacji CMake.

Aktualizowanie konfiguracji kompilacji

Dodaj te zależności do kodu projektu aplikacji, aby uzyskać dostęp do interfejsu Play Services API 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 C API ze skryptu CMake. Aby to zrobić, zaktualizuj blok Androida w pliku build.gradle modułu:

buildFeatures {
  prefab = true
}

Na koniec dodaj 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)

Inicjowanie środowiska wykonawczego TensorFlow Lite

Przed wywołaniem interfejsu TensorFlow Lite Native API musisz zainicjować środowisko wykonawcze TfLiteNative w kodzie Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Korzystając z interfejsu Google Play Services Task API, TfLiteNative.initialize asynchronicznie wczytuje środowisko wykonawcze TFLite z Usług Google Play do procesu wykonawczego aplikacji. Użyj addOnSuccessListener(), aby mieć pewność, że zadanie TfLite.initialize() zostanie ukończone, zanim uruchomisz kod uzyskujący dostęp do interfejsów API TensorFlow Lite. Po ukończeniu zadania możesz wywołać wszystkie dostępne interfejsy TFLite Native API.

Implementacja kodu natywnego

Aby korzystać z TensorFlow Lite w usługach Google Play za pomocą kodu natywnego, wykonaj jedną z tych czynności:

  • zadeklarować nowe funkcje JNI do wywoływania funkcji natywnych z kodu Java;
  • Wywołaj TensorFlow Lite Native API z istniejącego natywnego kodu C.

Funkcje JNI:

Możesz zadeklarować nową funkcję JNI, aby środowisko wykonawcze TensorFlow Lite zadeklarowane w języku Java/Kotlin było dostępne dla kodu natywnego w ten sposób:

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
}
        

Pasuje do tych 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 w kodzie 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 w kodzie C

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

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

Możesz wtedy 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 nagłówkami natywnego interfejsu API usług Google Play udostępnia ten sam interfejs API co zwykły TensorFlow Lite C API, z wyjątkiem funkcji, które zostały wycofane lub eksperymentalne. Obecnie dostępne są funkcje i typy z nagłówków c_api.h, c_api_types.h i common.h. Pamiętaj, że funkcje z nagłówka c_api_experimental.h nie są obsługiwane.

W Usługach Google Play możesz używać funkcji specyficznych dla TensorFlow Lite, dodając tflite.h.