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

1. مقدمة

657431be3173fa86.png android.png

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

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

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

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

إذا لم يكن التطبيق مثبّتًا على جهازك، يمكنك تنزيل الإصدار 4.1 أو إصدار أحدث من Android Studio وتثبيته أثناء تدريب نموذج 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. بعد التحميل، حدد "Open an Existing project" (فتح مشروع حالي) من هذه النافذة المنبثقة:

f3b8bea7e3b39376.png

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

d68b4d7189e6c1e4.png

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

60a77ef126c1373d.png

  1. اسمح الآن للعرض التوضيحي من Tensorflow بالوصول إلى الكاميرا:

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. بشكل افتراضي، يسرد جميع المهام في جميع الوحدات مما يجعل الأمر مربكًا بعض الشيء. يمكننا ترتيب قوائم المهام فقط من خلال النقر على الزر "تجميع حسب" على جانب لوحة المهام واختيار "Modules".

5d8fe7b102340208.png

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

8d0f14a039995b20.png

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

  1. انقر على TODO 1 في قائمة TODO أو افتح ملف MainActivity.kt وحدد موقع المهمة 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، نحتاج إلى تحويل إدخال الكاميرا 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" أو يمكنك النقر على قائمة المهام 5 ضمن قائمة "المهام" وإضافة الاعتمادية التالية:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. ارجع إلى ملف MainActivity.kt أو انقر على "قائمة المهام" 6 في قائمة "المهام". استبدل البدء البسيط لتطبيق FlowerModel بما يلي: احصل على مثال لقائمة التوافق مع وحدة معالجة الرسومات وأعِدّ وحدات معالجة الرسومات بناءً على ما إذا كانت إحدى وحدات معالجة الرسومات المتوافقة المُدرَجة. بخلاف ذلك، يمكنك بدء 4 سلاسل من وحدات المعالجة المركزية (CPU) لتشغيل النموذج بدلاً من ذلك:
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. الخطوات التالية

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