TensorFlow Lite בממשק C API של Google Play Services (בטא)

בעזרת TensorFlow Lite בסביבת זמן הריצה של Google Play Services אפשר להריץ מודלים של למידת מכונה (ML) בלי לקבץ באופן סטטי את ספריות TensorFlow Lite באפליקציה. במדריך הזה מפורטות הוראות לשימוש ב-C APIs עבור שירותי Google Play.

לפני שאתם עובדים עם TensorFlow Lite ב-Google Play Services C API, חשוב לוודא שכלי ה-build של CMake מותקן.

עדכון תצורת ה-build

כדי לגשת ל-Play Services API עבור TensorFlow Lite, צריך להוסיף את יחסי התלות הבאים לקוד של פרויקט האפליקציה:

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

לאחר מכן, צריך להפעיל את התכונה Prefab כדי לגשת ל-C API מהסקריפט של CMake באמצעות עדכון הבלוק ל-Android בקובץ build.gradle של המודול:

buildFeatures {
  prefab = true
}

לבסוף, מוסיפים את החבילה tensorflowlite_jni_gms_client שיובאה מה-AAR כתלות בסקריפט ה-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)

הפעלת זמן הריצה של TensorFlow Lite

לפני שמפעילים את TensorFlow Lite Native API, צריך לאתחל את זמן הריצה TfLiteNative בקוד Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

באמצעות Google Play Services Task API, TfLiteNative.initialize טוענת באופן אסינכרוני את זמן הריצה של TFLite מ-Google Play Services לתהליך זמן הריצה של האפליקציה. משתמשים ב-addOnSuccessListener() כדי לוודא שהמשימה TfLite.initialize() הושלמה לפני הרצת קוד עם גישה לממשקי API של TensorFlow Lite. אחרי שהמשימה הושלמה, תוכלו להפעיל את כל ממשקי ה-API הזמינים של TFLite Native.

הטמעת קוד מקורי

כדי להשתמש ב-TensorFlow Lite בשירותי Google Play עם קוד ה-Native שלכם, תוכלו לבצע אחת מהפעולות הבאות:

  • הצהרה על פונקציות JNI חדשות כדי לקרוא לפונקציות מקומיות מקוד ה-Java
  • מפעילים את TensorFlow Lite Native API מקוד C ב-Native.

פונקציות JNI:

אפשר להצהיר על פונקציית JNI חדשה כדי שזמן הריצה של TensorFlow Lite שהוצהר ב-Java/Kotlin נגיש לקוד ה-Native באופן הבא:

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
}
        

התאמה לפונקציות המקוריות הבאות של loadModel ו-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

לאחר מכן אפשר לקרוא לפונקציות C מקוד 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 בקוד C

יש לכלול את קובץ כותרת ה-API המתאים כדי לכלול את TfLite עם Google Play Services API:

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

לאחר מכן אפשר להשתמש ב-TensorFlow Lite C API הרגיל:

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

הכותרות של TensorFlow Lite עם Google Play Services Native API מספקות את אותו API כמו TensorFlow Lite C API, לא כולל תכונות שהוצאו משימוש או ניסיוניות. נכון לעכשיו, הפונקציות והסוגים זמינים מהכותרות c_api.h, c_api_types.h ו-common.h. שימו לב: אין תמיכה בפונקציות מהכותרת c_api_experimental.h.

אפשר להשתמש בפונקציות ספציפיות ל-TensorFlow Lite עם Google Play Services על ידי הכללה של tflite.h.