בעזרת 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
.