رصد العناصر في الصور باستخدام حزمة تعلُّم الآلة: Android

1. قبل البدء

حزمة ML Kit هي حزمة تطوير برامج (SDK) للأجهزة الجوّالة توفّر خبرة Google في مجال تعلُّم الآلة على الأجهزة لتطبيقات Android وiOS. يمكنك الاستفادة من واجهات برمجة التطبيقات الفعّالة والسهلة الاستخدام في الوقت ذاته لحلّ المشاكل الشائعة في تطبيقاتك أو إنشاء تجارب جديدة للمستخدمين. وتستند جميع هذه النماذج إلى نماذج تعلُّم الآلة الأفضل في فئتها من Google، والتي يتم توفيرها لك بدون أي تكلفة.

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

سيرشدك هذا الدرس التطبيقي حول الترميز خلال خطوات بسيطة لإضافة ميزة "رصد الكائنات" وتتبّعها (ODT) لصورة معيّنة إلى تطبيق Android الحالي. يُرجى العلم أنّ هذا الدرس التطبيقي حول الترميز يستخدم بعض الاختصارات لتسليط الضوء على استخدام حزمة تعلّم الآلة المخصّصة للأفراد أو الحِزم.

ما الذي ستنشئه

في هذا الدرس التطبيقي حول الترميز، ستنشئ تطبيق Android باستخدام ML Kit. سيستخدم تطبيقك واجهة برمجة التطبيقات لميزة ML Kit Detection and Tracking API لرصد العناصر في صورة معيّنة.وفي النهاية، من المفترض أن تظهر لك صورة مشابهة للصورة على اليسار.

المعلومات التي ستطّلع عليها

  • كيفية دمج حزمة تطوير البرامج (SDK) لحزمة تعلّم الآلة في تطبيق Android
  • واجهة برمجة التطبيقات الخاصة برصد العناصر وتتبُّعها في ML Kit

المتطلبات

  • إصدار حديث من "استوديو Android" (الإصدار 4.1.2 أو الإصدارات الأحدث)
  • محاكي "استوديو Android" أو جهاز Android فعلي
  • نموذج الرمز
  • معرفة أساسية بتطوير تطبيقات Android باستخدام لغة Kotlin

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

2. الإعداد

تنزيل الرمز

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

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

يحتوي الدليل الفرعي "اكتشاف الكائنات" في مستودع mlkit-android على دليلين:

  • android_studio_مجلد.pngإجراء التفعيل: بدء الرمز البرمجي الذي اعتمدته في هذا الدرس التطبيقي حول الترميز
  • android_studio_مجلد.pngأخير: رمز برمجي مكتمل لنموذج التطبيق المكتمل.

3- إضافة واجهة برمجة التطبيقات لميزة ML Kit Detection and Tracking API إلى المشروع

استيراد التطبيق إلى "استوديو Android"

لنبدأ باستيراد تطبيق المبتدئين إلى "استوديو Android".

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

7c0f27882a2698ac.png

إضافة الموارد الاعتمادية لرصد عناصر حزمة تعلُّم الآلة وتتبُّعها

تتيح لك تبعيات ML Kit إمكانية دمج ML Kit ODT SDK في تطبيقك. أضِف الأسطر التالية إلى نهاية ملف app/build.gradle لمشروعك:

build.gradle

dependencies {
  // ...
  implementation 'com.google.mlkit:object-detection:16.2.4'
}

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

وللتأكد من أن جميع التبعيات متاحة لتطبيقك، يجب عليك مزامنة مشروعك مع ملفات Gradle في هذه المرحلة.

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

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

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

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

وصِّل جهاز Android بمضيفك عبر USB، أو ابدأ تشغيل محاكي "استوديو Android"، وانقر على تشغيل ( التنفيذ.png) في شريط أدوات "استوديو Android".

تشغيل التطبيق واستكشافه

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

أولاً، يتوفّر زر ( c6d965d639c3646.png) في الأسفل لإجراء ما يلي:

  • إظهار تطبيق الكاميرا المدمج في جهازك/المحاكي
  • التقاط صورة داخل تطبيق الكاميرا
  • تلقّي الصورة التي تم التقاطها في تطبيق إجراء التفعيل
  • عرض الصورة

جرِّب الزر التقاط صورة، ثم اتّبِع التعليمات لالتقاط صورة، ثم اقبل الصورة ولاحظها عندما تظهر داخل تطبيق التفعيل.

كرِّر ذلك بضع مرات لمعرفة طريقة عملها:

9ec541980dbe2d31.png 8312dde41425ba4b.png fa8492bfc1914ff0.png

ثانيًا، تتوفّر 3 صور مُعدّة مسبقًا يمكنك الاختيار من بينها. يمكنك استخدام هذه الصور لاحقًا لاختبار رمز رصد الكائنات إذا كنت تعمل على محاكي Android.

اختَر صورة من الصور الثلاث المُعدّة مسبقًا. يمكنك ملاحظة أنّ الصورة تظهر في العرض الأكبر:

1dd41b3ec978f1d9.png

5- إضافة ميزة "رصد العناصر على الجهاز فقط"

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

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

في هذه الخطوة، ستتم إضافة رمز إلى طريقة runObjectDetection لرصد العناصر.

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

هناك 3 خطوات بسيطة فقط مع 3 واجهات برمجة تطبيقات لإعداد حزمة تعلّم الآلة التي يتم إعدادها تلقائيًا:

  • إعداد صورة: InputImage
  • إنشاء كائن أداة رصد: ObjectDetection.getClient(options)
  • اربط العنصرَين أعلاه: process(image)

يمكنك تحقيق ذلك داخل الدالة runObjectDetection(bitmap: Bitmap) في الملف MainActivity.kt.

/**
 * ML Kit Object Detection Function
 */
private fun runObjectDetection(bitmap: Bitmap) {
}

الدالة فارغة في الوقت الحالي. الانتقال إلى الخطوات التالية لاستخدام حزمة تعلُّم الآلة في الدوام بالإضافة إلى ذلك، سيطلب منك Android Studio إضافة عمليات الاستيراد اللازمة:

  • com.google.mlkit.vision.common.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

الخطوة 1: إنشاء إدخال صورة

توفّر حزمة تعلّم الآلة واجهة برمجة تطبيقات بسيطة لإنشاء InputImage من Bitmap. بعد ذلك، يمكنك إضافة InputImage إلى واجهات برمجة تطبيقات ML Kit.

// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)

أضِف الرمز أعلاه إلى أعلى runObjectDetection(bitmap:Bitmap).

الخطوة 2: إنشاء مثيل أداة رصد

تتبع ML Kit Builder Design Pattern. ستنقل الإعدادات إلى أداة الإنشاء، ثم ستحصل على أداة كشف منها. هناك 3 خيارات لضبطها (تُستخدم الخيارات التي تظهر بالرمز الغامق في هذا الدرس التطبيقي حول الترميز):

  • وضع الكاشف (صورة واحدة أو مصدر بيانات)
  • وضع الرصد (اكتشاف عناصر متعددة واحد أو أكثر)
  • وضع التصنيف (تشغيل أو إيقاف)

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

// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
   .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
   .enableMultipleObjects()
   .enableClassification()
   .build()
val objectDetector = ObjectDetection.getClient(options)

الخطوة 3: خلاصة صور إلى أداة الرصد

إنّ رصد العناصر وتصنيفها هو معالجة غير متزامنة:

  • يتم إرسال صورة إلى أداة الرصد (عبر "process()").
  • تعمل أداة الكشف عليها بجدية كبيرة.
  • وتُعلمك أداة الرصد بالنتيجة من خلال معاودة الاتصال.

يفعل الرمز التالي ذلك بالضبط (انسخه وألحقه بالرمز الحالي داخل fun runObjectDetection(bitmap:Bitmap)):

// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
   .addOnSuccessListener {
       // Task completed successfully
        debugPrint(it)
   }
   .addOnFailureListener {
       // Task failed with an exception
       Log.e(TAG, it.message.toString())
   }

عند الانتهاء، سيصلك إشعار إليك من أداة الرصد بما يلي:

  • إجمالي عدد العناصر التي تم رصدها. يتم وصف كل كائن يتم رصده بما يلي:
  • trackingId: عدد صحيح تستخدمه لتتبُّعه على مستوى اللقطات المختلفة (لا يُستخدم في هذا الدرس التطبيقي حول الترميز)
  • boundingBox: المربع المحيط بالكائن.
  • labels: قائمة بالتصنيفات للعنصر الذي تم رصده (فقط عند تفعيل التصنيف):
  • index (الحصول على فهرس هذا التصنيف)
  • text (احصل على نص هذا التصنيف بما في ذلك "السلع الأزياء"، و"الطعام"، و"السلع المنزلية"، و"المكان"، و"نبات")
  • confidence ( القيمة العائمة بين 0.0 و1.0 و1.0 تعني 100%)

من المحتمل أنّك لاحظت أنّ الرمز يُجري نوعًا من معالجة printf للنتيجة التي تم رصدها في debugPrint().

إضافته إلى صف واحد (MainActivity):

private fun debugPrint(detectedObjects: List<DetectedObject>) {
   detectedObjects.forEachIndexed { index, detectedObject ->
       val box = detectedObject.boundingBox

       Log.d(TAG, "Detected object: $index")
       Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
       Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
       detectedObject.labels.forEach {
           Log.d(TAG, " categories: ${it.text}")
           Log.d(TAG, " confidence: ${it.confidence}")
       }
   }
}

أنت الآن جاهز لقبول الصور لاكتشافها!

لنبدأ الدرس التطبيقي حول الترميز بالنقر على تشغيل ( التنفيذ.png) في شريط أدوات "استوديو Android". يمكنك تجربة اختيار صورة تم إعدادها مسبقًا أو التقاط صورة، ثم الاطّلاع على نافذة Logcat( 16bd6ea224cf8cf1.png) داخل بيئة التطوير المتكاملة.

من المفترض أن يظهر لك محتوى مشابه لما يلي:

D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection:  categories: Food
D/MLKit Object Detection:  confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection:  categories: Home good
D/MLKit Object Detection:  confidence: 0.75390625

...وهو ما يعني أن أداة الكشف رصدت 3 كائنات:

  • الفئتان هي طعام ومنزل جيد.
  • لا توجد فئة تم إرجاعها للصف الثاني لأنها فئة غير معروفة.
  • لا يتم استخدام trackingId (لأن هذا هو وضع رصد الصورة الواحدة).
  • الموضع داخل مستطيل boundingBox (على سبيل المثال، (481، 2021) – (2426، 3376))
  • أداة الكشف متأكّدة تمامًا من أنّ العنصر الأول هو الطعام (ثقة بنسبة 90%، هو سلطة).

من الناحية الفنية، أنت الآن بحاجة إلى تفعيل ميزة "رصد الكائنات في مجموعة أدوات تعلُّم الآلة". تهانينا!

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

6- المعالجة اللاحقة لنتائج الرصد

وفي الخطوات السابقة، يمكنك طباعة النتيجة التي تم رصدها في logcat بطريقة بسيطة وسريعة.

في هذا القسم، ستستخدم النتيجة في الصورة:

  • رسم مربّع الإحاطة على الصورة
  • رسم اسم الفئة والثقة داخل مربع الإحاطة

فهم برامج الخدمات المرئية

يتضمّن الدرس التطبيقي حول الترميز بعض الرموز النموذجية لمساعدتك في عرض نتيجة الرصد. استفد من هذه الأدوات لجعل التعليمة البرمجية لمؤثرات العرض بسيطة:

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

في ما يلي مثال على ناتج طريقة الأداة المساعدة drawDetectionResult:

58c6f1d4ddb00dfa.png

عرض نتيجة رصد أدوات تعلُّم الآلة

استخدِم أدوات العرض لرسم نتيجة رصد كائن "مجموعة أدوات تعلُّم الآلة" أعلى صورة الإدخال.

انتقِل إلى مكان الاتصال بـ debugPrint() وأضِف مقتطف الرمز التالي أسفله:

// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
    var text = "Unknown"

    // We will show the top confident detection result if it exist
    if (obj.labels.isNotEmpty()) {
        val firstLabel = obj.labels.first()
        text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
    }
    BoxWithText(obj.boundingBox, text)
}

// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)

// Show the detection result on the app screen
runOnUiThread {
    inputImageView.setImageBitmap(visualizedResult)
}
  • عليك البدء بتحليل DetectedObject لمجموعة أدوات تعلُّم الآلة وإنشاء قائمة بكائنات BoxWithText لعرض نتيجة التصور.
  • بعد ذلك، ترسم نتيجة الاكتشاف أعلى صورة الإدخال باستخدام طريقة الأداة المساعدة drawDetectionResult وتعرضها على الشاشة.

التشغيل

انقر الآن على تشغيل ( التنفيذ.png) في شريط أدوات "استوديو Android".

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

a03109cb30d5014d.png

7. تهانينا

لقد استخدمت حزمة تعلّم الآلة لإضافة إمكانات رصد العناصر إلى تطبيقك:

  • 3 خطوات باستخدام 3 واجهات برمجة تطبيقات
  • إنشاء صورة إدخال
  • إنشاء أداة رصد
  • إرسال الصورة إلى أداة الرصد

هذا كل ما تحتاجه لتشغيله.

أثناء المتابعة، قد ترغب في تحسين النموذج: فالنموذج الافتراضي لا يمكنه التعرف على سوى 5 فئات - النموذج لا يعرف حتى السكين والشوكة والزجاجة. يمكنك الاطّلاع على درس تطبيقي آخر حول الترميز ضمن المسار التعليمي لتعلُّم الآلة - رصد العناصر على الجهاز فقط لمعرفة كيفية تدريب نموذج مخصّص.

النقاط التي تناولناها

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

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

  • استكشِف المزيد من خلال حزمة ML Kit ODT التي تضم المزيد من الصور والفيديوهات المباشرة لرصد التجارب ورصدها دقة التصنيف والأداء
  • اطّلِع على المسار التعليمي لتعلُّم الآلة على الجهاز فقط لمعرفة كيفية تدريب نموذج مخصّص.
  • تطبيق حزمة "تعلُّم الآلة" باستمرار في تطبيقك على Android

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