Google Play Hizmetleri çalışma zamanındaki LiteRT, LiteRT kitaplıklarını uygulamanıza statik olarak eklemeden makine öğrenimi (ML) modellerini çalıştırmanıza olanak tanır. Bu kılavuzda, Google Play Hizmetleri için C veya C++ API'lerinin nasıl kullanılacağıyla ilgili talimatlar verilmektedir.
Google Play Hizmetleri C API'sinde veya C++ API'sinde LiteRT ile çalışmadan önce CMake derleme aracının yüklü olduğundan emin olun.
Derleme yapılandırmanızı güncelleme
(1) LiteRT için Play Hizmetleri API'ye erişmek üzere uygulama projenizin koduna aşağıdaki bağımlılıkları ekleyin:
implementation "com.google.android.gms:play-services-tflite-java:16.4.0"
Paket adı -java
ile bitse de bu paketin C ve C++ API'lerini de içerdiğini unutmayın.
(2) Ardından, modülünüzün build.gradle dosyasının android bloğunu güncelleyerek CMake komut dosyanızdan C API'ye erişmek için Prefab özelliğini etkinleştirin:
buildFeatures {
prefab = true
}
(3) [Yalnızca C++ API] C++ API'yi kullanıyorsanız tflite-java-extract-cpp-sdk.gradle dosyasını projenize, app
dizininize kopyalayın ve uygulamanızın gradle komut dosyasının (ör. app/build.gradle
) başına aşağıdakileri ekleyin:
apply from: 'tflite-java-extract-cpp-sdk.gradle'
Bu, play-services-tflite-java
için C++ SDK'sını AAR dosyasından otomatik olarak paketten çıkaran Gradle kodunu içerir.
(4) [Yalnızca C++ API] C++ API'yi kullanıyorsanız uygulamanızın CMake yapılandırma dosyasını (genellikle CMakeLists.txt
) içeren dizini bulun. Bu dizin genellikle app/src/main/cpp
dizininizdir. Ardından Findtflite_cc_api.cmake dosyasını projenize, söz konusu dizinin yeni bir Modules
alt dizinine kopyalayın.
Bu, önceki adımda Gradle komut dosyası tarafından paketten çıkarılan C++ SDK'sını bulan kodu içerir.
(5) Son olarak, tensorflowlite_jni_gms_client
paketini ve C++ API için tflite_cc_api
paketini de CMake komut dosyanıza bağımlı olarak eklemeniz gerekir. Her iki paket de AAR'dan içe aktarılır:
C
``` find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG) # Play Hizmetleri'nde TFLite'nin kullanımını etkinleştirmek için C/C++ derleyici işaretlerini ayarlayın (uygulama ile birlikte paketlenmiş normal TFLite yerine). add_compile_definitions(TFLITE_IN_GMSCORE) add_compile_definitions(TFLITE_WITH_STABLE_ABI) target_link_libraries(tflite-jni # JNI lib hedefiniz tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client android # hedefiniz için diğer bağımlılıklar log) ```C++
``` # Play Hizmetleri C API'sinde (tensorflowlite_jni_gms_client) TFLite bağımlılığını ayarlayın. find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG) # Play Hizmetleri C++ API'sinde (tflite_cc_api) TFLite bağımlılığını ayarlayın. list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Modules") find_package(tflite_cc_api REQUIRED MODULE) include_directories(${tflite_cc_api_INCLUDE_DIR}) add_subdirectory(${tflite_cc_api_DIR} tflite_cc_api_build) # Play Hizmetleri'nde TFLite'nin kullanımını etkinleştirmek için C/C++ derleyici işaretlerini ayarlayın (uygulamayla birlikte paketlenmiş normal TFLite yerine). add_compile_definitions(TFLITE_IN_GMSCORE) add_compile_definitions(TFLITE_WITH_STABLE_ABI) target_link_libraries(tflite-jni # your JNI lib target tflite_cc_api::tflite_cc_api tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client android # other deps for your target log) ```LiteRT çalışma zamanını başlatma
LiteRT Native API'yi çağırmadan önce Java veya Kotlin kodunuzda TfLiteNative
çalışma zamanını başlatmanız gerekir.
Java
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
Kotlin
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
Google Play Hizmetleri Task API'yi kullanan TfLiteNative.initialize
, TFLite çalışma zamanını Google Play Hizmetleri'nden uygulamanızın çalışma zamanı sürecine asenkron olarak yükler. LiteRT API'lerine erişen kodu yürütmeden önce TfLite.initialize()
görevinin tamamlandığından emin olmak için addOnSuccessListener()
'ü kullanın. Görev başarıyla tamamlandıktan sonra mevcut tüm TFLite Native API'leri çağırabilirsiniz.
Yerel kod uygulaması
Google Play Hizmetleri'nde C/C++ kodunuzla LiteRT'yi kullanmak için aşağıdakilerden birini (veya ikisini birden) yapabilirsiniz:
- Java kodunuzdan C veya C++ işlevlerini çağırmak için yeni JNI işlevleri tanımlayın
- Mevcut C veya C++ kodunuzdan LiteRT Native API'yi çağırabilirsiniz.
JNI işlevleri
C/C++ kodunda tanımlanan LiteRT çalışma zamanının Java/Kotlin kodunuz tarafından erişilebilir olmasını sağlamak için aşağıdaki gibi yeni JNI işlevleri tanımlayabilirsiniz:
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); // For example. }
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 // For example. }
Aşağıdaki loadModel
ve runInference
C veya C++ işlevleriyle eşleştirme:
#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
Ardından, C/C++ işlevlerinizi Java/Kotlin kodunuzdan çağırabilirsiniz:
Java
tfLiteHandleTask.onSuccessTask(unused -> { TfLiteJni jni = new TfLiteJni(); jni.loadModel(getAssets(), "add.bin"); //... });
Kotlin
tfLiteHandleTask.onSuccessTask { val jni = TfLiteJni() jni.loadModel(assets, "add.bin") // ... }
Yerel kodda LiteRT
LiteRT'yi Google Play Hizmetleri API'sine dahil etmek için uygun API başlık dosyasını ekleyin:
C
``` #include "tensorflow/lite/c/c_api.h" ```C++
``` #include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/model_builder.h" ```Ardından, normal LiteRT C veya C++ API'sini kullanabilirsiniz: