احتفِل بالزهور مع TensorFlow Lite على Android.

1. مقدمة

657431be3173fa86.png android.png

ملاحظة: يتطلّب هذا الدرس العملي استخدام جهاز فعلي للاختبار.

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

يستخدم هذا الدرس التطبيقي حول الترميز TensorFlow Lite لتشغيل نموذج التعرّف على الصور على جهاز Android.

تثبيت الإصدار 4.1 من "استوديو Android" أو إصدار أحدث

إذا لم يكن مثبّتًا لديك، يمكنك تنزيل الإصدار 4.1 من "استوديو Android" أو إصدار أحدث وتثبيته أثناء تدريب نموذج TensorFlow Lite.

أهداف الدورة التعليمية

  • كيفية تدريب مصنّف صور مخصّص باستخدام TensorFlow Lite Model Maker
  • كيفية استخدام "استوديو Android" لاستيراد نموذج TensorFlow Lite لدمج النموذج المخصّص في تطبيق Android باستخدام CameraX
  • كيفية استخدام وحدة معالجة الرسومات على هاتفك لتسريع النموذج

ما ستنشئه

تطبيق كاميرا بسيط يشغّل برنامج TensorFlow للتعرّف على الصور من أجل تحديد الزهور.

f11c2821f2c8311d.png

الترخيص: مجاني للاستخدام

2. تدريب أداة للتعرّف على الزهور باستخدام Colab

قبل بدء تدريب النموذج، ابدأ بتنزيل وتثبيت الإصدار 4.1 من "استوديو Android" أو إصدار أحدث.

افتح Colab الذي يوضّح كيفية تدريب مصنّف باستخدام Keras للتعرّف على الزهور باستخدام ميزة "التعلّم القائم على نقل المهام" في TensorFlow Lite.

3- إعداد دليل العمل

إنشاء نسخة طبق الأصل من مستودع Git

سيؤدي الأمر التالي إلى استنساخ مستودع Git الذي يحتوي على الملفات المطلوبة لهذا الدرس التطبيقي العملي:

git clone https://github.com/hoitab/TFLClassify.git

بعد ذلك، انتقِل إلى الدليل الذي استنسخت فيه المستودع. ستعمل على هذا التطبيق خلال بقية هذا الدرس التطبيقي حول الترميز:

cd TFLClassify

4. إعداد تطبيق Android الأساسي

android.png

تثبيت الإصدار 4.1 من "استوديو Android" أو إصدار أحدث

إذا لم يكن مثبّتًا لديك، يُرجى تثبيت الإصدار 4.1 أو إصدار أحدث من "استوديو Android".

فتح المشروع باستخدام "استوديو Android"

افتح مشروعًا باستخدام "استوديو Android" باتّباع الخطوات التالية:

  1. افتح "استوديو Android" 7f2480ded53a193b.png. بعد تحميله، اختَر "فتح مشروع حالي" من هذه النافذة المنبثقة:

f3b8bea7e3b39376.png

  1. في أداة اختيار الملفات، اختَر TFLClassify/build.gradle من دليل العمل.
  1. ستظهر لك نافذة منبثقة بعنوان "مزامنة Gradle" في المرة الأولى التي تفتح فيها المشروع، وستسألك عن استخدام برنامج Gradle المغلّف. انقر على "موافق".

d68b4d7189e6c1e4.png

  1. فعِّل "وضع مطوّر البرامج" و"تصحيح أخطاء الجهاز عبر USB" على هاتفك إذا لم يسبق لك إجراء ذلك. يجب إكمال عملية الإعداد مرة واحدة فقط. اتّبِع هذه التعليمات.
  2. بعد أن يصبح كل من مشروعك وهاتفك جاهزًا، يمكنك تشغيله على جهاز حقيقي من خلال النقر على TFL_Classify.start ثم على زر التشغيل 86934b7b01ad7565.png في شريط الأدوات:

60a77ef126c1373d.png

  1. الآن، اسمح لتطبيق Tensorflow Demo بالوصول إلى الكاميرا:

b63cba02bb36b7e3.png

  1. ستظهر لك الشاشة التالية على هاتفك مع أرقام عشوائية بدلاً من المكان الذي ستظهر فيه النتائج الفعلية.

82c603596afa35f1.png

5- إضافة TensorFlow Lite إلى تطبيق Android

  1. اختَر الوحدة start في "مستكشف المشاريع" على يمين الصفحة:

cede7f2b8b23c1a7.png

  1. انقر بزر الماوس الأيمن على وحدة start أو انقر على File، ثم New > Other > TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. اختَر موقع النموذج الذي نزّلت منه النموذج المخصّص المدرَّب FlowerModel.tflite في وقت سابق.

cfee18cc6674a408.png

  1. انقر على Finish.
  2. سيظهر لك ما يلي في النهاية. تم استيراد FlowerModel.tflite بنجاح، ويعرض معلومات عالية المستوى حول النموذج، بما في ذلك الإدخال / الإخراج بالإضافة إلى بعض نماذج الرموز البرمجية لمساعدتك في البدء.

82840065f0d59def.png

6. اختياري: الاطّلاع على قائمة المهام الكاملة

تسهّل قائمة المهام التنقّل إلى الموقع الجغرافي الدقيق الذي تحتاج إلى تعديل الدرس التطبيقي حول الترميز فيه. يمكنك أيضًا استخدامها في مشروع Android لتذكير نفسك بالعمل المستقبلي. يمكنك إضافة عناصر قائمة المهام باستخدام تعليقات التعليمات البرمجية وكتابة الكلمة الرئيسية TODO. للوصول إلى قائمة المهام، يمكنك اتّباع الخطوات التالية:

  1. يمكنك الاطّلاع على قائمة المهام لمعرفة ما سنفعله. لإجراء ذلك، اختَر من شريط القوائم العلوي View > Tool Windows > TODO

5de29b413574f25c.png

  1. بشكلٍ تلقائي، يتم إدراج جميع المهام التي يجب تنفيذها في جميع الوحدات، ما يجعلها مربكة بعض الشيء. يمكننا فرز مهام TODO التي تبدأ بـ "ابدأ" فقط من خلال النقر على زر "تجميع حسب" على جانب لوحة TODO واختيار Modules

5d8fe7b102340208.png

  1. وسِّع جميع العناصر ضمن وحدات البدء:

8d0f14a039995b20.png

7. تشغيل النموذج المخصّص باستخدام TensorFlow Lite

  1. انقر على TODO 1 في قائمة المهام أو افتح ملف MainActivity.kt وابحث عن TODO 1، ثم ابدأ النموذج بإضافة هذا السطر:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. داخل طريقة التحليل في CameraX Analyzer، علينا تحويل إدخال الكاميرا ImageProxy إلى Bitmap وإنشاء عنصر TensorImage لعملية الاستدلال.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. عالِج الصورة ونفِّذ العمليات التالية على النتيجة:
  • رتِّب النتائج تنازليًا حسب الاحتمالية ضمن السمة score، مع عرض الاحتمالية الأعلى أولاً.
  • يتم أخذ أهم k نتائج كما هو محدّد بالثابت MAX_RESULT_DISPLAY. يمكنك اختياريًا تغيير قيمة هذا المتغيّر للحصول على نتائج أكثر أو أقل.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. حوِّل النتائج التي تمّ ترتيبها وفلترتها إلى عناصر بيانات Recognition جاهزة للاستهلاك من خلال RecyclerView باستخدام ربط البيانات:
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. علِّق على الأسطر التالية أو احذفها، وهي التي تساعد في إنشاء النتائج الوهمية التي نراها من قبل:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. شغِّل التطبيق على جهاز حقيقي من خلال النقر على TFL_Classify.start ثم على زر التشغيل 86934b7b01ad7565.png في شريط الأدوات:

60a77ef126c1373d.png

  1. ستظهر لك الشاشة التالية على هاتفك مع أرقام عشوائية بدلاً من النتائج الفعلية:

f11c2821f2c8311d.png

8. اختياري: تسريع الاستنتاج باستخدام أداة تفويض وحدة معالجة الرسومات

يتوافق TensorFlow Lite مع العديد من أدوات تسريع الأجهزة لتسريع الاستدلال على جهازك الجوّال. وحدة معالجة الرسومات هي إحدى أدوات التسريع التي يمكن أن يستفيد منها TensorFlow Lite من خلال آلية تفويض، وهي سهلة الاستخدام إلى حدّ كبير.

  1. افتح ملف build.gradle ضمن الوحدة start أو يمكنك النقر على TODO 5 ضمن قائمة TODO وإضافة التبعية التالية:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. ارجع إلى ملف MainActivity.kt أو انقر على TODO 6 في قائمة المهام. استبدِل عملية بدء flowerModel البسيطة بما يلي: احصل على مثيل لقائمة وحدات معالجة الرسومات المتوافقة، وابدأ وحدة معالجة الرسومات استنادًا إلى ما إذا كانت إحدى وحدات معالجة الرسومات المتوافقة المُدرَجة. بخلاف ذلك، ابدأ 4 سلاسل لوحدة المعالجة المركزية لتشغيل النموذج بدلاً من ذلك:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. غيِّر أداة تهيئة النموذج لاستخدام هذا الإعداد عن طريق إضافة options إلى إدخال الطريقة:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}

  1. شغِّل التطبيق على جهاز حقيقي من خلال النقر على TFL_Classify.start ثم على زر التشغيل 86934b7b01ad7565.png في شريط الأدوات:

60a77ef126c1373d.png

9- ما هي الخطوات التالية؟

في ما يلي بعض الروابط لمزيد من المعلومات: