إنشاء نموذج مخصّص للكشف عن العناصر ونشره باستخدام TensorFlow Lite (نظام التشغيل Android)

1. قبل البدء

في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية تدريب نموذج رصد عناصر مخصّصة باستخدام مجموعة من الصور التدريبية باستخدام TFLite model Maker، ثم انشر النموذج على تطبيق Android باستخدام TFLite Task Library. عليك تنفيذ ما يلي:

  • إنشاء تطبيق متوافق مع Android يرصد المكونات في صور وجبات
  • يمكنك دمج نموذج رصد عناصر TFLite المدربة مسبقًا والاطّلاع على الحد الأقصى لما يمكن أن يكتشفه النموذج.
  • يمكنك تدريب نموذج رصد العناصر المخصّصة لرصد مكوّنات الوجبة ومكوّناتها باستخدام مجموعة بيانات مخصّصة تُسمّى السلطة و"أداة إنشاء TFLite".
  • انشر النموذج المخصّص في تطبيق Android باستخدام مكتبة مهام TFLite.

في النهاية، ستنشئ شيئًا مماثلاً للصورة أدناه:

b9705235366ae162.png

المتطلبات الأساسية

تم تصميم هذا الدرس التطبيقي حول الترميز لمطوّري البرامج المتوافقة مع الأجهزة الجوّالة الذين يريدون اكتساب خبرة في ما يتعلق بتعلُّم الآلة. ويجب أن تكون على دراية بما يلي:

  • تطوير برامج Android باستخدام Kotlin و"استوديو Android"
  • بنية Python الأساسية

ما ستتعرّف عليه

  • كيفية تدريب نموذج اكتشاف كائنات مخصّصة باستخدام TFLite Maker Maker
  • كيفية نشر نموذج لاكتشاف عناصر TFLite باستخدام مكتبة مهام TFLite.

الأشياء التي تحتاج إليها

  • إصدار حديث من "استوديو Android" (الإصدار 4.2 أو الإصدارات الأحدث)
  • جهاز Android Studio Emulator أو جهاز فعلي يعمل بنظام التشغيل Android
  • نموذج الرمز
  • المعرفة الأساسية بتطوير نظام التشغيل Android بلغة Kotlin

2. اكتشاف الكائن

اكتشاف الكائنات هو مجموعة من مهام الرؤية الحاسوبية التي يمكنها اكتشاف الكائنات في الصورة الرقمية وتحديد موقعها. بالنسبة إلى صورة أو فيديو مضمّن، يمكن أن يتعرّف نموذج اكتشاف الكائنات على مجموعة من العناصر المعروفة التي قد تكون موجودة ويمكنه تقديم معلومات عن مواضعها داخل الصورة.

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

TensorFlow Lite

TensorFlow Lite هي مكتبة تعلُّم آلة تعمل عبر أنظمة أساسية متعددة مُحسَّنة لتشغيل نماذج تعلُم الآلة على الأجهزة الحافة، بما في ذلك أجهزة Android وiOS المحمولة.

TensorFlow Lite هو المحرك الأساسي المستخدم داخل ML Kit لتشغيل نماذج تعلُم الآلة. يتوفّر مكوّنان من المنظومة المتكاملة TensorFlow Lite لتسهيل تدريب نماذج تعلُّم الآلة ونشرها على الأجهزة الجوّالة، وهما:

  • أداة إنشاء النماذج هي مكتبة Python تسهِّل تدريب نماذج TensorFlow Lite باستخدام بياناتك الخاصة باستخدام بضعة أسطر من الرموز بدون الحاجة إلى خبرة في تعلُّم الآلة.
  • مكتبة مهام هي مكتبة من عدّة منصات تسهّل نشر نماذج TensorFlow Lite باستخدام بضعة أسطر من الرموز في تطبيقاتك المتوافقة مع الأجهزة الجوّالة.

يركز هذا الدرس التطبيقي على الترميز TFLite. لا يتم توضيح المفاهيم وقوالب الرموز التي لا تتعلّق بميزة TFLite والتعرّف على الكائنات، ويتم توفيرها لك فقط لنسخها ولصقها.

3- الإعداد

تنزيل الرمز

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

فك ضغط ملف zip الذي تم تنزيله. سيؤدي ذلك إلى تفريغ مجلد جذر (odml-pathways-main) يضم جميع الموارد التي تحتاجها. بالنسبة إلى هذا الدرس التطبيقي حول الترميز، ستحتاج إلى المصادر في الدليل الفرعي object-detection/codelab2/android فقط.

يحتوي الدليل الفرعي android في المستودع object-detection/codelab2/android على دليلَين:

  • Android_studio_folder.png Starter - الرمز الذي يتم استخدامه في هذا الدرس التطبيقي حول الترميز.
  • Android_studio_folder.pngنهائي - اكتمل رمز نموذج التطبيق المكتمل.

استيراد تطبيق إجراء التفعيل

لنبدأ باستيراد تطبيق إجراء التفعيل إلى "استوديو Android".

  1. افتح Android Studio واختَر استيراد مشروع (Gradle أو Eclipse ADT وغير ذلك)
  2. افتح مجلد starter من رمز المصدر الذي نزّلته سابقًا.

7c0f27882a2698ac.png

للتأكد من توفر جميع الاعتماديات على تطبيقك، يجب مزامنة مشروعك مع ملفات Excel عند انتهاء عملية الاستيراد.

  1. اختَر مزامنة المشروع مع ملفات Gradle ( b451ab2d04d835f9.png) من شريط أدوات "استوديو Android". استيراد start/app/build.gradle

تشغيل تطبيق إجراء التفعيل

الآن بعد أن قمت باستيراد المشروع إلى Android Studio، أصبحت مستعدًا لتشغيل التطبيق للمرة الأولى.

يمكنك توصيل جهاز Android عبر USB بالكمبيوتر أو بدء محاكي Android Studio والنقر على تشغيل ( تنفيذ) في شريط أدوات Android Studio.

4. فهم تطبيق إجراء التفعيل

وللحفاظ على بساطة هذا الدرس التطبيقي والتركيز على وحدات تعلُّم الآلة، يتضمّن التطبيق للمبتدئين بعض الرموز النموذجية التي تنفّذ بعض الإجراءات لك:

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

ستتفاعل غالبًا مع هذه الطرق في الهيكل الأساسي للتطبيق:

  • fun runObjectDetection(bitmap: Bitmap) يتم استدعاء هذه الطريقة عند اختيار صورة تم إعدادها مسبقًا أو التقاط صورة. bitmap هي الصورة المدخلة لاكتشاف الكائن. في وقت لاحق من هذا الدرس التطبيقي حول الترميز، ستضيف رمز اكتشاف الكائن إلى هذه الطريقة.
  • data class DetectionResult(val boundingBoxes: Rect, val text: String) هذه فئة من البيانات تمثّل نتيجة اكتشاف عنصر للتمثيل البصري. boundingBoxes هو المستطيل الذي يُحدِّد فيه العنصر، وtext هو سلسلة نتائج الاكتشاف المطلوب عرضها مع مربّع العنصر's.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<DetectionResult>): Bitmap ترسِل هذه الطريقة نتائج رصد العنصر في detectionResults على الإدخال bitmap وتعرض النسخة المعدَّلة منه.

في ما يلي مثال على مخرجات طريقة الأداة drawDetectionResult.

f6b1e6dad726e129.png

5. إضافة ميزة "رصد كائن الجهاز"

ستتمكّن الآن من إنشاء نموذج أولي من خلال دمج نموذج TFLite المدرّب مسبقًا والذي يمكنه اكتشاف الكائنات الشائعة في تطبيق إجراء التفعيل.

تنزيل نموذج اكتشاف الكائن TFLite المُدرَّب مسبقًا

هناك العديد من نماذج أداة رصد العناصر على TensorFlow Hub التي يمكنك استخدامها. بالنسبة إلى هذا الدرس التطبيقي، ستُنزِّل نموذج رصد الأغراض EticientDet-Lite الذي تم تدريبه على مجموعة بيانات COCO 2017، المُحسّن للتوافق مع TFLite، والذي تم تصميمه لتحسين أداء وحدة المعالجة المركزية (CPU) المتوافقة مع الأجهزة الجوّالة ووحدة معالجة الرسومات وEdge

بعد ذلك، استخدِم "مكتبة مهام TFLite" لدمج نموذج TFLite المُدرَّب مسبقًا في تطبيق بدء الاستخدام. وتسهِّل "مكتبة مهام TFLite" دمج نماذج تعلُّم الآلة المحسّنة للأجهزة الجوّالة في تطبيق متوافق مع الأجهزة الجوّالة. وتتوافق هذه الخدمة مع العديد من حالات استخدام تعلُّم الآلة الشائعة، بما في ذلك رصد الكائنات وتصنيف الصور وتصنيف النص. يمكنك تحميل نموذج TFLite وتشغيله باستخدام بضعة أسطر من الرمز.

إضافة النموذج إلى تطبيق إجراء التفعيل

  1. انسخ النموذج الذي نزّلته للتو إلى مجلد assets في تطبيق Starter. ويمكنك العثور على المجلد في لوحة تنقّل المشروع في "استوديو Android".

c2609599b7d22641.png

  1. حدِّد اسمًا للملف model.tflite.

C83e9397177c4561.png

تعديل تبعيات "مكتبة مهام Gradle"

انتقل إلى ملف app/build.gradle وأضِف هذا السطر إلى إعداد dependencies:

implementation 'org.tensorflow:tensorflow-lite-task-vision:0.3.1'

مزامنة مشروعك مع ملفات Gradle

للتأكّد من توفّر كل تبعيات تطبيقك، عليك في الوقت الحالي مزامنة مشروعك مع ملفات Excelle. اختَر مزامنة المشروع مع ملفات Gradle ( b451ab2d04d835f9.png) من شريط أدوات "استوديو Android".

(في حال إيقاف هذا الزر، تأكّد من استيراد Start/app/build.gradle فقط، وليس المستودع بالكامل).

إعداد ميزة اكتشاف العنصر على الجهاز وتشغيلها على الصورة

هناك 3 خطوات بسيطة فقط باستخدام 3 واجهات برمجة تطبيقات لتحميل نموذج اكتشاف العناصر وتشغيله:

  • إعداد صورة / ساحة مشاركات: TensorImage
  • إنشاء كائن أداة الرصد: ObjectDetector
  • ربط العنصرَين أعلاه: detect(image)

ويمكنك إجراء هذه المهام داخل الدالة runObjectDetection(bitmap: Bitmap)في الملف MainActivity.kt.

/**
* TFLite Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
    //TODO: Add object detection code here
}

الدالة فارغة الآن. انتقِل إلى الخطوات التالية لتنفيذ أداة رصد العنصر TFLite. أثناء ذلك، سيطلب منك "استوديو Android" إضافة عمليات الاستيراد اللازمة:

  • org.tensorflow.lite.support.image.TensorImage
  • org.tensorflow.lite.task.vision.detector.ObjectDetector

إنشاء كائن صورة

إن مصدر الصور التي ستستخدمها في هذا الدرس التطبيقي هو إمّا الكاميرا على الجهاز أو الصور المُعدَّة مسبقًا التي تختارها في واجهة مستخدم التطبيق. يتم فك ترميز صورة الإدخال بتنسيق Bitmap وتمريرها إلى الطريقة runObjectDetection.

توفّر TFLite واجهة برمجة تطبيقات بسيطة لإنشاء TensorImage من Bitmap. أضف الرمز أدناه إلى أعلى runObjectDetection(bitmap:Bitmap):

// Step 1: create TFLite's TensorImage object
val image = TensorImage.fromBitmap(bitmap)

إنشاء مثيل أداة رصد

تتّبع "مكتبة مهام TFLite" نمط تصميم المنشئ. وتُرسل الإعدادات إلى أداة إنشاء، ثم تكتسب أداة رصد منها. هناك خيارات متعدّدة لضبطها، بما في ذلك الإعدادات لضبط حساسية أداة رصد العنصر:

  • الحد الأقصى للنتائج (الحد الأقصى لعدد العناصر التي يجب أن يكتشفها النموذج)
  • الحد الأدنى للنتيجة (ما مدى الثقة في عرض أداة رصد العنصر)
  • القائمة المسموح بها/قائمة الحظر (السماح/رفض العناصر في قائمة محدّدة مسبقًا)

يمكنك إعداد مثيل أداة رصد العنصر من خلال تحديد اسم ملف نموذج TFLite وخيارات الضبط:

// Step 2: Initialize the detector object
val options = ObjectDetector.ObjectDetectorOptions.builder()
    .setMaxResults(5)
    .setScoreThreshold(0.5f)
    .build()
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "model.tflite", // must be same as the filename in assets folder
    options
)

صور الخلاصة الخاصة بأداة الرصد

عليك إضافة الرمز التالي إلى fun runObjectDetection(bitmap:Bitmap). وسيؤدي ذلك إلى نقل صورك إلى أداة الرصد.

// Step 3: feed given image to the model and print the detection result
val results = detector.detect(image)

عند الانتهاء، تعرض أداة الرصد قائمة Detection، يحتوي كل منها على معلومات حول العنصر الذي عثر عليه النموذج في الصورة. يتم وصف كل كائن باستخدام:

  • boundingBox: المستطيل الذي يعلن وجود كائن وموقعه في الصورة
  • categories: نوع الكائن ومدى موثوقية النموذج في نتيجة الرصد. يعرض النموذج فئات متعددة، بحيث تكون أكثرها ثقةً أولاً.
  • label: اسم فئة الكائن.
  • classificationConfidence:عائم يتراوح بين 0.0 إلى 1.0، مع 1.0 يمثل 100%

عليك إضافة الرمز التالي إلى fun runObjectDetection(bitmap:Bitmap). ويؤدي ذلك إلى استدعاء طريقة لطباعة نتائج اكتشاف الكائن إلى Logcat.

// Step 4: Parse the detection result and show it
debugPrint(results)

بعد ذلك، يمكنك إضافة هذه الطريقة debugPrint() إلى الصف MainActivity:

private fun debugPrint(results : List<Detection>) {
    for ((i, obj) in results.withIndex()) {
        val box = obj.boundingBox

        Log.d(TAG, "Detected object: ${i} ")
        Log.d(TAG, "  boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")

        for ((j, category) in obj.categories.withIndex()) {
            Log.d(TAG, "    Label $j: ${category.label}")
            val confidence: Int = category.score.times(100).toInt()
            Log.d(TAG, "    Confidence: ${confidence}%")
        }
    }
} 

أداة رصد العنصر جاهزة الآن. اجمَع التطبيق وشغِّله بالنقر على تشغيل ( تنفيذ) في شريط أدوات "استوديو Android". بعد ظهور التطبيق على الجهاز، انقر على أيٍّ من الصور المعدّة مسبقًا لتشغيل أداة رصد العنصر. بعد ذلك، يُرجى الاطّلاع على نافذة Logcat*(* 16bd6ea224cf8cf1.png*)* داخل IDE، ومن المفترض أن يظهر لك ما يلي:

D/TFLite-ODT: Detected object: 0 
D/TFLite-ODT:   boundingBox: (0.0, 15.0) - (2223.0,1645.0)
D/TFLite-ODT:     Label 0: dining table
D/TFLite-ODT:     Confidence: 77%
D/TFLite-ODT: Detected object: 1 
D/TFLite-ODT:   boundingBox: (702.0, 3.0) - (1234.0,797.0)
D/TFLite-ODT:     Label 0: cup
D/TFLite-ODT:     Confidence: 69%

ستوضح لك هذه الأداة أن أداة الرصد شاهدت كائنين. الْخِيَارُ الْأَوَّلْ هُوَ:

  • هناك عنصر داخل المستطيل رقم (0، 15) – (2223، 1645)
  • التصنيف هو طاولة طعام.
  • النموذج واثق من أن الأول هو طاولة طعام (77%)

من الناحية الفنية هذا هو كل ما تحتاجه لكي تعمل مكتبة المهام في TFLite: لقد حصلت على كل ذلك في الوقت الحالي. تهانينا.

من ناحية أخرى، ما زلت في نقطة البداية. عليك الآن الاستفادة من النتائج التي تم اكتشافها في واجهة المستخدم من خلال المعالجة اللاحقة للنتائج التي تم اكتشافها.

6- رسم نتيجة الاكتشاف على الصورة المدخلة

في الخطوات السابقة، طُبعت نتيجة الاكتشاف على logcat: بسيطة وسريعة. في هذه الخطوة، ستستفيد من طريقة استخدام الأداة التي تم تنفيذها من قبل في تطبيق إجراء التفعيل، من أجل:

  • رسم مربّع حدّ على صورة
  • رسم اسم فئة ونسبة مئوية داخل المربع المحيط
  1. استبدِل طلب debugPrint(results) بمقتطف الرمز التالي:
val resultToDisplay = results.map {
    // Get the top-1 category and craft the display text
    val category = it.categories.first()
    val text = "${category.label}, ${category.score.times(100).toInt()}%"

    // Create a data object to display the detection result
    DetectionResult(it.boundingBox, text)
}
// Draw the detection result on the bitmap and show it.
val imgWithResult = drawDetectionResult(bitmap, resultToDisplay)
runOnUiThread {
    inputImageView.setImageBitmap(imgWithResult)
}
  1. الآن انقر على تشغيل ( تنفيذ) في شريط أدوات "استوديو Android".
  2. بعد تحميل التطبيق، انقر على إحدى الصور المعدّة مسبقًا للاطّلاع على نتيجة الاكتشاف.

هل تريد تجربة صورتك الخاصة؟ انقر على الزر التقاط صورة والتقط بعض صور العناصر من حولك.

8b024362b15096a6.png

7- تدريب نموذج اكتشاف الكائن المخصص

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

إليك مجموعة بيانات تحتوي على الصور والتصنيفات والتي يمكنك استخدامها للتدرّب على تدريب نموذجك المخصّص. وقد تم إنشاؤها باستخدام صور من فتح مجموعة بيانات الصور V4.

Colaboratory

بعد ذلك، انتقِل إلى Google Colab لتدريب النموذج المخصّص.

سيستغرق التدريب على النموذج المخصّص 30 دقيقة تقريبًا.

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

8- دمج نموذج TFLite المخصّص في تطبيق Android

الآن بعد أن درَّبت نموذجًا لاكتشاف السلاح، ادمجه وحوِّل تطبيقك من أداة رصد أشياء شائعة إلى مرصد سلطات على وجه التحديد.

  1. انسخ نموذج TFLite للسلطة إلى مجلد assets. تسمية النموذج الجديد salad.tflite.

91e8d37c4f78eddb.png

  1. افتح ملف MainActivity.kt وابحث عن رمز إعداد ObjectDetector.
  2. استبدال نموذج EfficientDet-Lite (model.tflite) بنموذج السلطة "salad.tflite"
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "salad.tflite", // must be same as the filename in assets folder
    options
)
  1. انقر على تشغيل ( تنفيذ) في شريط أدوات "استوديو Android" لإعادة تشغيل التطبيق باستخدام النموذج الجديد. وها هي! يمكن للتطبيق التعرّف الآن على الجبنة أو السلطة أو المخبوزات.

b9705235366ae162.png

9- تهانينا.

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

المواضيع التي تناولناها

  • كيفية العثور على نماذج رصد TFLite المدرّبة مسبقًا في TensorFlow Hub
  • طريقة دمج نماذج رصد الاعتراضات في تطبيقك المتوافق مع Android باستخدام "مكتبة مهام TFLite"
  • كيفية تدريب نموذج رصد الكائنات المخصّص باستخدام TFLite Maker Maker

الخطوات التالية

  • استخدام Firebase لتحسين نشر نموذج TFLite
  • جمع بيانات التدريب لتدريب نموذجك الخاص
  • تطبيق ميزة "رصد العناصر" في تطبيقك المتوافق مع Android

مزيد من المعلومات