1. قبل البدء
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية تدريب نموذج رصد عناصر مخصّصة باستخدام مجموعة من الصور التدريبية باستخدام TFLite model Maker، ثم انشر النموذج على تطبيق Android باستخدام TFLite Task Library. عليك تنفيذ ما يلي:
- إنشاء تطبيق متوافق مع Android يرصد المكونات في صور وجبات
- يمكنك دمج نموذج رصد عناصر TFLite المدربة مسبقًا والاطّلاع على الحد الأقصى لما يمكن أن يكتشفه النموذج.
- يمكنك تدريب نموذج رصد العناصر المخصّصة لرصد مكوّنات الوجبة ومكوّناتها باستخدام مجموعة بيانات مخصّصة تُسمّى السلطة و"أداة إنشاء TFLite".
- انشر النموذج المخصّص في تطبيق Android باستخدام مكتبة مهام TFLite.
في النهاية، ستنشئ شيئًا مماثلاً للصورة أدناه:
المتطلبات الأساسية
تم تصميم هذا الدرس التطبيقي حول الترميز لمطوّري البرامج المتوافقة مع الأجهزة الجوّالة الذين يريدون اكتساب خبرة في ما يتعلق بتعلُّم الآلة. ويجب أن تكون على دراية بما يلي:
- تطوير برامج 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
على دليلَين:
- Starter - الرمز الذي يتم استخدامه في هذا الدرس التطبيقي حول الترميز.
- نهائي - اكتمل رمز نموذج التطبيق المكتمل.
استيراد تطبيق إجراء التفعيل
لنبدأ باستيراد تطبيق إجراء التفعيل إلى "استوديو Android".
- افتح Android Studio واختَر استيراد مشروع (Gradle أو Eclipse ADT وغير ذلك)
- افتح مجلد
starter
من رمز المصدر الذي نزّلته سابقًا.
للتأكد من توفر جميع الاعتماديات على تطبيقك، يجب مزامنة مشروعك مع ملفات Excel عند انتهاء عملية الاستيراد.
- اختَر مزامنة المشروع مع ملفات Gradle ( ) من شريط أدوات "استوديو 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
.
5. إضافة ميزة "رصد كائن الجهاز"
ستتمكّن الآن من إنشاء نموذج أولي من خلال دمج نموذج TFLite المدرّب مسبقًا والذي يمكنه اكتشاف الكائنات الشائعة في تطبيق إجراء التفعيل.
تنزيل نموذج اكتشاف الكائن TFLite المُدرَّب مسبقًا
هناك العديد من نماذج أداة رصد العناصر على TensorFlow Hub التي يمكنك استخدامها. بالنسبة إلى هذا الدرس التطبيقي، ستُنزِّل نموذج رصد الأغراض EticientDet-Lite الذي تم تدريبه على مجموعة بيانات COCO 2017، المُحسّن للتوافق مع TFLite، والذي تم تصميمه لتحسين أداء وحدة المعالجة المركزية (CPU) المتوافقة مع الأجهزة الجوّالة ووحدة معالجة الرسومات وEdge
بعد ذلك، استخدِم "مكتبة مهام TFLite" لدمج نموذج TFLite المُدرَّب مسبقًا في تطبيق بدء الاستخدام. وتسهِّل "مكتبة مهام TFLite" دمج نماذج تعلُّم الآلة المحسّنة للأجهزة الجوّالة في تطبيق متوافق مع الأجهزة الجوّالة. وتتوافق هذه الخدمة مع العديد من حالات استخدام تعلُّم الآلة الشائعة، بما في ذلك رصد الكائنات وتصنيف الصور وتصنيف النص. يمكنك تحميل نموذج TFLite وتشغيله باستخدام بضعة أسطر من الرمز.
إضافة النموذج إلى تطبيق إجراء التفعيل
- انسخ النموذج الذي نزّلته للتو إلى مجلد
assets
في تطبيق Starter. ويمكنك العثور على المجلد في لوحة تنقّل المشروع في "استوديو Android".
- حدِّد اسمًا للملف
model.tflite
.
تعديل تبعيات "مكتبة مهام Gradle"
انتقل إلى ملف app/build.gradle
وأضِف هذا السطر إلى إعداد dependencies
:
implementation 'org.tensorflow:tensorflow-lite-task-vision:0.3.1'
مزامنة مشروعك مع ملفات Gradle
للتأكّد من توفّر كل تبعيات تطبيقك، عليك في الوقت الحالي مزامنة مشروعك مع ملفات Excelle. اختَر مزامنة المشروع مع ملفات Gradle ( ) من شريط أدوات "استوديو 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*(* *)* داخل 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
: بسيطة وسريعة. في هذه الخطوة، ستستفيد من طريقة استخدام الأداة التي تم تنفيذها من قبل في تطبيق إجراء التفعيل، من أجل:
- رسم مربّع حدّ على صورة
- رسم اسم فئة ونسبة مئوية داخل المربع المحيط
- استبدِل طلب
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)
}
- الآن انقر على تشغيل ( ) في شريط أدوات "استوديو Android".
- بعد تحميل التطبيق، انقر على إحدى الصور المعدّة مسبقًا للاطّلاع على نتيجة الاكتشاف.
هل تريد تجربة صورتك الخاصة؟ انقر على الزر التقاط صورة والتقط بعض صور العناصر من حولك.
7- تدريب نموذج اكتشاف الكائن المخصص
في الخطوة السابقة، دمجت نموذجًا مدرّبًا مسبقًا لكائن TFLite مع تطبيق Android ولاحظت أنّه بإمكانها رصد العناصر الشائعة، مثل البول أو طاولات الطعام في نماذج الصور. ومع ذلك، يتمثل هدفك في اكتشاف مكونات الأطباق في الصورة، لذلك فإن اكتشاف الأشياء العامة لا يناسب حالة الاستخدام. تريد تدريب نموذج اكتشاف كائنات مخصّصة باستخدام مجموعة بيانات التدريب باستخدام المكوّنات التي نريد اكتشافها.
إليك مجموعة بيانات تحتوي على الصور والتصنيفات والتي يمكنك استخدامها للتدرّب على تدريب نموذجك المخصّص. وقد تم إنشاؤها باستخدام صور من فتح مجموعة بيانات الصور V4.
Colaboratory
بعد ذلك، انتقِل إلى Google Colab لتدريب النموذج المخصّص.
سيستغرق التدريب على النموذج المخصّص 30 دقيقة تقريبًا.
إذا كنت في عجلة من أمرك، يمكنك تنزيل نموذج سبق لنا تدريبه لك على مجموعة البيانات المقدمة، والمتابعة إلى الخطوة التالية.
8- دمج نموذج TFLite المخصّص في تطبيق Android
الآن بعد أن درَّبت نموذجًا لاكتشاف السلاح، ادمجه وحوِّل تطبيقك من أداة رصد أشياء شائعة إلى مرصد سلطات على وجه التحديد.
- انسخ نموذج TFLite للسلطة إلى مجلد
assets
. تسمية النموذج الجديدsalad.tflite
.
- افتح ملف
MainActivity.kt
وابحث عن رمز إعدادObjectDetector
. - استبدال نموذج 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
)
- انقر على تشغيل ( ) في شريط أدوات "استوديو Android" لإعادة تشغيل التطبيق باستخدام النموذج الجديد. وها هي! يمكن للتطبيق التعرّف الآن على الجبنة أو السلطة أو المخبوزات.
9- تهانينا.
لقد استخدمت TFLite لتدريب نموذج مخصّص وإضافة إمكانيات رصد الكائنات إلى تطبيقك، وهذا كل ما تحتاج إليه لإعداده وتشغيله.
المواضيع التي تناولناها
- كيفية العثور على نماذج رصد TFLite المدرّبة مسبقًا في TensorFlow Hub
- طريقة دمج نماذج رصد الاعتراضات في تطبيقك المتوافق مع Android باستخدام "مكتبة مهام TFLite"
- كيفية تدريب نموذج رصد الكائنات المخصّص باستخدام TFLite Maker Maker
الخطوات التالية
- استخدام Firebase لتحسين نشر نموذج TFLite
- جمع بيانات التدريب لتدريب نموذجك الخاص
- تطبيق ميزة "رصد العناصر" في تطبيقك المتوافق مع Android