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

באמצעות המטא-נתונים של TensorFlow Lite, מפתחים יכולים ליצור קוד wrapper כדי להפעיל שילוב ב-Android. לרוב המפתחים, הממשק הגרפי של Android Studio ML Model Binding הוא הכי קל לשימוש. אם אתם צריכים לבצע התאמה אישית נוספת או אם אתם משתמשים בכלי שורת הפקודה, תוכלו למצוא גם את TensorFlow Lite Codegen.

שימוש בקישור מודלים של Android Studio ML

במודלים של TensorFlow Lite עם מטא-נתונים, המפתחים יכולים להשתמש בקישור של מודל למידת מכונה ב-Android Studio כדי להגדיר אוטומטית את ההגדרות לפרויקט וליצור מחלקות wrapper על סמך המטא-נתונים של המודל. קוד wrapper מבטל את הצורך באינטראקציה ישירה עם ByteBuffer. במקום זאת, מפתחים יכולים להשתמש במודל TensorFlow Lite עם אובייקטים מוקלדים כמו Bitmap ו-Rect.

ייבוא מודל של TensorFlow Lite ב-Android Studio

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

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

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

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

  4. המסך הבא יופיע לאחר שהייבוא יסתיים בהצלחה. כדי להתחיל להשתמש במודל, בוחרים ב-Kotlin או ב-Java, מעתיקים ומדביקים את הקוד בקטע Sample Code. כדי לחזור למסך הזה, לוחצים לחיצה כפולה על מודל TFLite בספרייה ml ב-Android Studio.

האצת הסקת המודל

קישור מודלים של ML מאפשר למפתחים להאיץ את הקוד באמצעות שימוש בהענקת גישה ובמספר ה-threads.

שלב 1. בודקים את קובץ המודול build.gradle שמכיל את התלות הבאה:

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
    }

שלב 2. בודקים אם ה-GPU שפועל במכשיר תואם לבעל גישה ל-TensorFlow GPU, אם לא מריצים את המודל באמצעות מספר שרשורים של מעבד (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
      

יצירת ממשקי מודלים באמצעות מחולל קוד ב-TensorFlow Lite

במודל TensorFlow Lite עם מטא-נתונים, המפתחים יכולים להשתמש במחולל קודי wrapper של TensorFlow Lite כדי ליצור קוד wrapper לפלטפורמה ספציפית. קוד ה-wrapper מבטל את הצורך לבצע אינטראקציה ישירות עם ByteBuffer. במקום זאת, מפתחים יכולים להשתמש במודל TensorFlow Lite עם אובייקטים מוקלדים כמו Bitmap ו-Rect.

התועלת של מחולל הקוד תלויה בשלמות של רשומת המטא-נתונים של מודל TensorFlow Lite. עיינו בקטע <Codegen usage> בשדות הרלוונטיים ב-metadata_schema.fbs, כדי לראות איך הכלי Codegen מנתח כל שדה.

יצירת קוד 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 שבו רוצים להשתמש במודל TensorFlow lite ומייבאים את המודול שנוצר על ידי: וקובץ -> חדש -> ייבוא מודול -> בוחרים באפשרות 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();
}

האצת הסקת המודל

הקוד שנוצר מאפשר למפתחים להאיץ את הקוד שלהם באמצעות הענקת גישה ומספר ה-threads. אפשר להגדיר את הפרמטרים האלה כשמאתחלים את אובייקט המודל עקב שלושה פרמטרים:

  • 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הבא': לא ניתן לפתוח את הקובץ הזה בתור מתאר קובץ. סביר להניח שהוא דחוס', הוסיפו את השורות הבאות בקטע android של מודול האפליקציה שישתמש במודול הספרייה:

aaptOptions {
   noCompress "tflite"
}