TensorFlow Lite trong API C của Dịch vụ Google Play (Beta)

Với TensorFlow Lite trong thời gian chạy của Dịch vụ Google Play, bạn có thể chạy các mô hình học máy (ML) mà không cần nhóm tĩnh các thư viện TensorFlow Lite vào ứng dụng của mình. Hướng dẫn này đưa ra hướng dẫn về cách sử dụng các API C cho Dịch vụ Google Play.

Trước khi làm việc với TensorFlow Lite trong API C của Dịch vụ Google Play, hãy đảm bảo bạn đã cài đặt công cụ xây dựng CMake.

Cập nhật cấu hình bản dựng

Thêm các phần phụ thuộc sau vào mã dự án ứng dụng để truy cập vào API Dịch vụ Play cho TensorFlow Lite:

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

Sau đó, hãy bật tính năng Prefab để truy cập vào API C từ tập lệnh CMake bằng cách cập nhật khối android của tệp build.gradle của mô-đun:

buildFeatures {
  prefab = true
}

Cuối cùng, bạn cần thêm gói tensorflowlite_jni_gms_client đã nhập từ AAR làm phần phụ thuộc trong tập lệnh 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)

Khởi chạy môi trường thời gian chạy TensorFlow Lite

Trước khi gọi API gốc TensorFlow Lite, bạn phải khởi chạy thời gian chạy TfLiteNative trong mã Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Bằng cách sử dụng API Tasks của Dịch vụ Google Play, TfLiteNative.initialize sẽ tải không đồng bộ môi trường thời gian chạy TFLite từ Dịch vụ Google Play vào quy trình thời gian chạy của ứng dụng. Sử dụng addOnSuccessListener() để đảm bảo tác vụ TfLite.initialize() hoàn tất trước khi thực thi mã truy cập vào API TensorFlow Lite. Sau khi hoàn tất thành công tác vụ, bạn có thể gọi tất cả các API gốc TFLite hiện có.

Triển khai mã gốc

Để sử dụng TensorFlow Lite trong dịch vụ Google Play với mã gốc, bạn có thể thực hiện một trong những thao tác sau:

  • khai báo các hàm JNI mới để gọi các hàm gốc từ mã Java của bạn
  • Gọi API gốc TensorFlow Lite từ mã C gốc hiện có.

Các hàm JNI:

Bạn có thể khai báo hàm JNI mới để làm cho thời gian chạy TensorFlow Lite được khai báo trong Java/Kotlin có thể truy cập được vào mã gốc của bạn như sau:

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
}
        

So khớp các hàm gốc loadModelrunInference sau:

#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

Sau đó, bạn có thể gọi các hàm C từ mã 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 trong mã C

Bao gồm tệp tiêu đề API thích hợp để đưa TfLite vào với API Dịch vụ Google Play:

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

Sau đó, bạn có thể sử dụng API TensorFlow Lite C thông thường:

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

TensorFlow Lite với các tiêu đề API gốc của Dịch vụ Google Play cung cấp API giống như API TensorFlow Lite C thông thường, ngoại trừ các tính năng không dùng nữa hoặc đang trong giai đoạn thử nghiệm. Hiện tại, bạn đã có thể sử dụng các hàm và kiểu từ tiêu đề c_api.h, c_api_types.hcommon.h. Xin lưu ý rằng các hàm từ tiêu đề c_api_experimental.h không được hỗ trợ.

Bạn có thể sử dụng các hàm dành riêng cho TensorFlow Lite với Dịch vụ Google Play bằng cách thêm tflite.h.