באמצעות מטא-נתונים של LiteRT, מפתחים יכולים ליצור קוד wrapper להפעלת שילוב ב-Android. לרוב המפתחים, הממשק הגרפי של Android Studio ML Model Binding הכי קל לשימוש. אם נדרשת התאמה אישית נוספת או אם משתמשים בשורת הפקודה השימוש בכלי זמין גם ב-LiteRT Codegen.
שימוש בקישור מודלים של למידת מכונה ב-Android Studio
במודלים של LiteRT ששופרו באמצעות מטא-נתונים,
מפתחים יכולים להשתמש ב-Android Studio ML Model Binding כדי להגדיר באופן אוטומטי
הגדרות לפרויקט וליצור מחלקות wrapper לפי המודל
מטא-נתונים. קוד ה-wrapper מבטל את הצורך לקיים אינטראקציה ישירות עם
ByteBuffer
במקום זאת, מפתחים יכולים ליצור אינטראקציה עם מודל LiteRT
עם אובייקטים שמוקלדים, כמו Bitmap
ו-Rect
.
ייבוא של מודל LiteRT ב-Android Studio
לוחצים לחיצה ימנית על המודול שבו רוצים להשתמש במודל TFLite, או לוחצים עליו.
File
, לאחר מכןNew
>Other
>LiteRT Model
בוחרים את המיקום של קובץ ה-TFLite. שימו לב שהכלים להגדיר בשמכם את התלות של המודול באמצעות קישור של מודל למידת מכונה את כל יחסי התלות שנוספו אוטומטית למודול של Android קובץ
build.gradle
.אופציונלי: מסמנים את התיבה השנייה לייבוא GPU של TensorFlow אם אתם רוצים להשתמש בהאצת GPU.
לוחצים על
Finish
.המסך הבא יופיע לאחר שהייבוא יסתיים בהצלחה. כדי להתחיל באמצעות המודל, בחר Kotlin או Java, מעתיקים ומדביקים את הקוד קטע בנושא
Sample Code
. אפשר לחזור למסך הזה בלחיצה כפולה מודל ה-TFLite בספרייהml
ב-Android Studio.
האצת תהליך ההסקה של המודל
קישור מודלים של למידת מכונה מאפשר למפתחים להאיץ את הקוד באמצעות את מספר המשתמשים שקיבלו הרשאה ואת מספר השרשורים.
שלב 1. בודקים את קובץ המודול build.gradle
שמכיל את הדברים הבאים
של תלות:
dependencies {
...
// TFLite GPU delegate 2.3.0 or above is required.
implementation 'com.google.ai.edge.litert:litert-gpu:2.3.0'
}
שלב 2. זיהוי אם ה-GPU שרץ במכשיר תואם ל-GPU של TensorFlow להעניק גישה, אם לא מריצים את המודל באמצעות מספר תהליכונים של המעבד (CPU):
Kotlin
import org.tensorflow.lite.gpu.CompatibilityList import org.tensorflow.lite.gpu.GpuDelegate val compatList = CompatibilityList() val options = if(compatList.isDelegateSupportedOnThisDevice) { // if the device has a supported GPU, add the GPU delegate Model.Options.Builder().setDevice(Model.Device.GPU).build() } else { // if the GPU is not supported, run on 4 threads Model.Options.Builder().setNumThreads(4).build() } // Initialize the model as usual feeding in the options object val myModel = MyModel.newInstance(context, options) // Run inference per sample code
Java
import org.tensorflow.lite.support.model.Model import org.tensorflow.lite.gpu.CompatibilityList; import org.tensorflow.lite.gpu.GpuDelegate; // Initialize interpreter with GPU delegate Model.Options options; CompatibilityList compatList = CompatibilityList(); if(compatList.isDelegateSupportedOnThisDevice()){ // if the device has a supported GPU, add the GPU delegate options = Model.Options.Builder().setDevice(Model.Device.GPU).build(); } else { // if the GPU is not supported, run on 4 threads options = Model.Options.Builder().setNumThreads(4).build(); } MyModel myModel = new MyModel.newInstance(context, options); // Run inference per sample code
יצירת ממשקי מודלים באמצעות מחולל קוד LiteRT
במודל LiteRT ששופרו באמצעות מטא-נתונים,
מפתחים יכולים להשתמש במחולל קוד wrapper של Android LiteRT
קוד wrapper ספציפי לפלטפורמה. קוד ה-wrapper מבטל את הצורך באינטראקציה
ישירות מול ByteBuffer
. במקום זאת, המפתחים יכולים להשתמש ב-TensorFlow
מודל Lite עם אובייקטים שמוקלדים, כמו Bitmap
ו-Rect
.
התועלת של מחולל הקוד תלויה בשלמותו של
רשומת המטא-נתונים של מודל LiteRT. יש לעיין בקטע <Codegen usage>
בשדות הרלוונטיים של
metadata_schema.fbs,
כדי לראות איך הכלי ליצירת קוד מנתח כל שדה.
יצירת קוד wrapper
יהיה עליך להתקין את הכלים הבאים בטרמינל:
pip install tflite-support
בסיום התהליך, אפשר להשתמש במחולל הקוד באמצעות התחביר הבא:
tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
--package_name=org.tensorflow.lite.classify \
--model_class_name=MyClassifierModel \
--destination=./classify_wrapper
הקוד שיתקבל ימוקם בספריית היעד. אם אתם באמצעות Google Colab או שלט רחוק אחר הסביבה, אולי יהיה קל יותר לדחוס את התוצאה בקובץ ZIP ולהוריד אותו לפרויקט Android Studio:
# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/
# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')
באמצעות הקוד שנוצר
שלב 1: מייבאים את הקוד שנוצר
מחלצים את הקוד שנוצר, אם יש צורך, במבנה של ספרייה. השורש של
ההנחה היא שהקוד שנוצר הוא SRC_ROOT
.
פותחים את פרויקט Android Studio שבו רוצים להשתמש ב-LiteRT
ולייבא את המודול שנוצר על ידי: And File -> חדש -> ייבוא מודול ->
בחירה באפשרות SRC_ROOT
בהמשך לדוגמה שלמעלה, הספרייה והמודול שיובא ייקראו
classify_wrapper
שלב 2: מעדכנים את קובץ build.gradle
של האפליקציה
במודול האפליקציה שיצרוך את מודול הספרייה שנוצר:
בקטע android, מוסיפים את הפרטים הבאים:
aaptOptions {
noCompress "tflite"
}
בקטע 'יחסי תלות', מוסיפים את הפרטים הבאים:
implementation project(":classify_wrapper")
שלב 3: שימוש במודל
// 1. Initialize the model
MyClassifierModel myImageClassifier = null;
try {
myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
// Error reading the model
}
if(null != myImageClassifier) {
// 2. Set the input with a Bitmap called inputBitmap
MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
inputs.loadImage(inputBitmap));
// 3. Run the model
MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);
// 4. Retrieve the result
Map<String, Float> labeledProbability = outputs.getProbability();
}
האצת תהליך ההסקה של המודל
הקוד שנוצר מאפשר למפתחים להאיץ את הקוד שלהם באמצעות משתמשים שקיבלו הרשאה ואת מספר שרשורים. אפשר להגדיר את הערכים האלה כשמאתחלים את אובייקט המודל, מכיוון שנדרשים שלושה :
Context
: ההקשר של הפעילות או השירות ב-Android- (אופציונלי)
Device
: בעל הרשאה להאצה באמצעות TFLite. מוצרים לדוגמה: GPUDelegate - (אופציונלי)
numThreads
: מספר השרשורים ששימשו להפעלת המודל – ברירת המחדל היא 1.
לדוגמה, כדי להשתמש בהענקת גישה ל-GPU ובשלושה שרשורים לכל היותר, אפשר לאתחל כך נראה המודל:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
// Error reading the model
}
פתרון בעיות
אם מופיע הכיתוב 'Java.io.FileNotFound מפרסמים': לא ניתן לפתוח את הקובץ הזה file descriptor, הוא כנראה דחוס יש להזין את השורות הבאות בקטע android במודול האפליקציה שמשתמש במודול הספרייה:
aaptOptions {
noCompress "tflite"
}