إنشاء واجهات نموذجية باستخدام البيانات الوصفية

باستخدام TensorFlow Lite Metadata ، يمكن للمطورين إنشاء رمز مجمّع لتمكين التكامل على Android. بالنسبة لمعظم المطورين ، تعد الواجهة الرسومية لـ Android Studio ML Model Binding هي الأسهل في الاستخدام. إذا كنت بحاجة إلى مزيد من التخصيص أو كنت تستخدم أدوات سطر الأوامر ، فإن TensorFlow Lite Codegen متاح أيضًا.

استخدم Android Studio ML Model Binding

بالنسبة لنماذج TensorFlow Lite المحسّنة بالبيانات الوصفية ، يمكن للمطورين استخدام Android Studio ML Model Binding لتكوين الإعدادات تلقائيًا للمشروع وإنشاء فئات مجمعة بناءً على البيانات الوصفية للنموذج. يزيل رمز المجمع الحاجة إلى التفاعل مباشرة مع ByteBuffer . بدلاً من ذلك ، يمكن للمطورين التفاعل مع نموذج TensorFlow Lite باستخدام كائنات مكتوبة مثل Bitmap و Rect .

قم باستيراد نموذج TensorFlow Lite في Android Studio

  1. انقر بزر الماوس الأيمن فوق الوحدة التي ترغب في استخدام نموذج TFLite أو انقر فوق File ، ثم New > Other > TensorFlow Lite Model انقر بزر الماوس الأيمن فوق القوائم للوصول إلى وظيفة استيراد TensorFlow Lite

  2. حدد موقع ملف TFLite الخاص بك. لاحظ أن الأدوات ستقوم بتهيئة تبعية الوحدة نيابة عنك مع ربط ML Model وإدراج جميع التبعيات تلقائيًا في ملف build.gradle الخاص بوحدة Android.

    اختياري: حدد خانة الاختيار الثانية لاستيراد TensorFlow GPU إذا كنت تريد استخدام تسريع GPU. حوار الاستيراد لنموذج TFLite

  3. انقر فوق Finish .

  4. ستظهر الشاشة التالية بعد نجاح الاستيراد. لبدء استخدام النموذج ، حدد Kotlin أو Java ، وانسخ الكود والصقه تحت قسم Sample Code . يمكنك العودة إلى هذه الشاشة بالنقر المزدوج على نموذج TFLite أسفل دليل ml في Android Studio. صفحة تفاصيل النموذج في Android Studio

تسريع الاستدلال بالنموذج

يوفر ML Model Binding طريقة للمطورين لتسريع التعليمات البرمجية الخاصة بهم من خلال استخدام المفوضين وعدد الخيوط.

الخطوة 1. تحقق من ملف build.gradle للوحدة النمطية الذي يحتوي على التبعية التالية:

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

الخطوة 2. اكتشف ما إذا كانت وحدة معالجة الرسومات التي تعمل على الجهاز متوافقة مع مفوض وحدة معالجة الرسومات TensorFlow ، إذا لم يتم تشغيل النموذج باستخدام مؤشرات ترابط متعددة لوحدة المعالجة المركزية:

كوتلن

    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
      

جافا

    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 ، لترى كيف تحلل أداة codegen كل حقل.

إنشاء رمز المجمّع

ستحتاج إلى تثبيت الأدوات التالية في جهازك الطرفي:

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 أو بيئة بعيدة أخرى ، فقد يكون من الأسهل ضغط النتيجة في أرشيف مضغوط وتنزيله إلى مشروع 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 واستورد الوحدة النمطية التي تم إنشاؤها بواسطة: And File -> New -> Import Module -> حدد SRC_ROOT

باستخدام المثال أعلاه ، سيتم تسمية الدليل والوحدة النمطية المستوردة classify_wrapper .

الخطوة الثانية: قم بتحديث ملف 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 أو NNAPIDelegate
  • (اختياري) numThreads : عدد الخيوط المستخدمة لتشغيل النموذج - الافتراضي هو واحد.

على سبيل المثال ، لاستخدام مفوض NNAPI وما يصل إلى ثلاثة مؤشرات ترابط ، يمكنك تهيئة النموذج مثل هذا:

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

استكشاف الأخطاء وإصلاحها

إذا حصلت على 'java.io.FileNotFoundException: لا يمكن فتح هذا الملف كواصف ملف ؛ من المحتمل أن يكون الخطأ مضغوطًا ، أدخل الأسطر التالية ضمن قسم android في وحدة التطبيق التي ستستخدم وحدة المكتبة:

aaptOptions {
   noCompress "tflite"
}