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

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

השתמש ב-Android Studio ML Binding Model

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

ייבא דגם TensorFlow Lite ב-Android Studio

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

  2. בחר את המיקום של קובץ TFLite שלך. שים לב שהכלים יגדיר את התלות של המודול בשמך עם כריכת ML Model וכל התלות יוכנסו אוטומטית לקובץ build.gradle של מודול האנדרואיד שלך.

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

  3. לחץ על Finish .

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

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

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

שלב 1. בדוק את קובץ module 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 delegate, אם לא הפעל את הדגם באמצעות שרשורי CPU מרובים:

קוטלין

    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 משופר עם מטא נתונים , מפתחים יכולים להשתמש במחולל קוד העטיפה של TensorFlow Lite Android כדי ליצור קוד עטיפה ספציפי לפלטפורמה. קוד העטיפה מסיר את הצורך באינטראקציה ישירה עם ByteBuffer . במקום זאת, מפתחים יכולים ליצור אינטראקציה עם מודל TensorFlow Lite עם אובייקטים מוקלדים כגון Bitmap ו- Rect .

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

צור קוד עטיפה

תצטרך להתקין את הכלים הבאים במסוף שלך:

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 של האפליקציה

במודול האפליקציה שיצרוך את מודול הספרייה שנוצר:

תחת קטע אנדרואיד, הוסף את הדברים הבאים:

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 או NNAPIDelegate
  • (אופציונלי) numThreads : מספר השרשורים המשמשים להפעלת המודל - ברירת המחדל היא אחד.

לדוגמה, כדי להשתמש בנציג NNAPI ועד שלושה אשכולות, אתה יכול לאתחל את המודל כך:

try {
    myImageClassifier = new MyClassifierModel(this, Model.Device.NNAPI, 3);
} catch (IOException io){
    // Error reading the model
}

פתרון תקלות

אם אתה מקבל 'java.io.FileNotFoundException: לא ניתן לפתוח קובץ זה כמתאר קובץ; זה כנראה שגיאה דחוסה, הכנס את השורות הבאות מתחת לקטע אנדרואיד של מודול האפליקציה שישתמש במודול הספרייה:

aaptOptions {
   noCompress "tflite"
}