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

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

استخدام ميزة ربط نموذج تعلُّم الآلة في Android Studio

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

استيراد نموذج TensorFlow Lite إلى "استوديو Android"

  1. انقر بزر الماوس الأيمن على الوحدة التي تريد استخدام نموذج TFLite أو انقر على File ثم على New > Other > TensorFlow Lite Model.

  2. اختَر موقع ملف TFLite. يُرجى العِلم أنّ هذه الأداة ستضبط تبعية الوحدة نيابةً عنك من خلال ربط نموذج تعلُّم الآلة وكل العناصر التابعة التي يتم إدراجها تلقائيًا في ملف build.gradle الخاص بوحدة Android.

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

  3. انقر على Finish

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

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

توفّر "عملية ربط نموذج تعلُّم الآلة" طريقة للمطوّرين لتسريع الرموز الخاصة بهم من خلال استخدام المفوَّضين وعدد سلاسل المحادثات.

الخطوة 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 إذا لم يتم تشغيل النموذج باستخدام سلاسل وحدة المعالجة المركزية (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 المُحسَّن بالبيانات الوصفية، يمكن للمطوّرين استخدام منشئ رموز برنامج تضمين 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 الذي تريد فيه استخدام النموذج البسيط لـ TensorFlow واستيراد الوحدة التي تم إنشاؤها من خلال: وملف -> جديد -> وحدة الاستيراد -> اختَر SRC_ROOT

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

الخطوة 2: تعديل ملف "build.gradle" الخاص بالتطبيق

في وحدة التطبيق التي ستستخدم وحدة المكتبة التي تم إنشاؤها:

ضمن قسم Android، أضِف ما يلي:

aaptOptions {
   noCompress "tflite"
}

ضمن قسم التبعيات، أضف ما يلي:

implementation project(":classify_wrapper")

الخطوة الثالثة: استخدام النموذج

// 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: عدد سلاسل المحادثات المستخدَمة لتشغيل النموذج، والعدد التلقائي هو واحد.

على سبيل المثال، لاستخدام تفويض GPU وما يصل إلى ثلاث سلاسل محادثات، يمكنك إعداد النموذج على النحو التالي:

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

تحديد المشاكل وحلّها

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

aaptOptions {
   noCompress "tflite"
}