צור ממשקי מודל באמצעות מטא נתונים

באמצעות מטא-נתונים של 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

  1. לוחצים לחיצה ימנית על המודול שבו רוצים להשתמש במודל TFLite, או לוחצים עליו. File, לאחר מכן New > Other > LiteRT Model

  2. בוחרים את המיקום של קובץ ה-TFLite. שימו לב שהכלים להגדיר בשמכם את התלות של המודול באמצעות קישור של מודל למידת מכונה את כל יחסי התלות שנוספו אוטומטית למודול של Android קובץ build.gradle.

    אופציונלי: מסמנים את התיבה השנייה לייבוא GPU של TensorFlow אם אתם רוצים להשתמש בהאצת GPU.

  3. לוחצים על Finish.

  4. המסך הבא יופיע לאחר שהייבוא יסתיים בהצלחה. כדי להתחיל באמצעות המודל, בחר 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"
}