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

التعرّف على الزهور باستخدام TensorFlow Lite على Android

لمحة عن هذا الدرس التطبيقي حول الترميز

subjectتاريخ التعديل الأخير: أبريل 7, 2025
account_circleتأليف: Hoi Lam (revamping author), Yash Katariya (original author)

1. مقدمة

657431be3173fa86.png android.png

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

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

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

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

المُعطيات

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

ما ستبنيه

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

f11c2821f2c8311d.png

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

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

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

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

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

استنساخ مستودع Git

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

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

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

cd TFLClassify

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

android.png

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

إذا لم يكن مثبّتًا، انتقِل إلى تثبيت AndroidStudio 4.1 أو إصدار أحدث.

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

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

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

f3b8bea7e3b39376.png

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

d68b4d7189e6c1e4.png

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

5d8fe7b102340208.png

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

8d0f14a039995b20.png

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

  1. انقر على TODO 1 في قائمة TODO أو افتح ملف 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 في قائمة TODO. استبدِل عملية الإعداد البسيطة لنموذج 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. الخطوات التالية

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