1. قبل البدء
ML Kit هي حزمة تطوير برامج (SDK) للأجهزة الجوّالة توفّر خبرة Google في تعلُّم الآلة على الأجهزة لتطبيقات Android وiOS. يمكنك استخدام واجهات برمجة التطبيقات Vision وNatural Language API الفعّالة والسهلة الاستخدام لحلّ التحديات الشائعة في تطبيقاتك أو إنشاء تجارب جديدة تمامًا للمستخدمين. وتستند جميعها إلى أفضل نماذج الذكاء الاصطناعي من Google، وهي متاحة لك بدون أي تكلفة.
يتم تشغيل واجهات برمجة التطبيقات في ML Kit على الجهاز فقط، ما يتيح استخدامها في حالات الاستخدام في الوقت الفعلي، مثل معالجة بث مباشر من الكاميرا. ويعني ذلك أيضًا أنّ الوظيفة متاحة بلا اتصال بالإنترنت.
سيرشدك هذا الدرس التطبيقي حول الترميز إلى خطوات بسيطة لإضافة ميزة "اكتشاف الأجسام وتتبُّعها" (ODT) لصورة معيّنة إلى تطبيق Android الحالي. يُرجى العِلم أنّ هذا الدرس التطبيقي يتّخذ بعض الاختصارات لتسليط الضوء على استخدام ميزة "اكتشاف الأجسام وتتبُّعها" في ML Kit.
التطبيق الذي ستصممه
في هذا الدرس التطبيقي حول الترميز، ستُنشئ تطبيق Android باستخدام ML Kit. سيستخدم تطبيقك واجهة برمجة التطبيقات Object Detection and Tracking API من ML Kit لرصد الأجسام في صورة معيّنة.وفي النهاية، من المفترض أن يظهر لك شيء مشابه للصورة على يسار الصفحة. |
ما ستتعرّف عليه
- كيفية دمج حزمة تطوير البرامج (SDK) لـ ML Kit في تطبيق Android
- واجهة برمجة التطبيقات لرصد الأجسام وتتبُّعها في حزمة ML Kit
المتطلبات
- أحدث إصدار من "استوديو Android" (الإصدار 4.1.2 أو إصدار أحدث)
- محاكي Android Studio أو جهاز Android
- نموذج الرمز البرمجي
- معرفة أساسية بتطوير تطبيقات Android باستخدام لغة Kotlin
يركز هذا الدرس التطبيقي على ML Kit. يتم تجاهل المفاهيم غير ذات الصلة ووحدات الرموز البرمجية، ويتم توفيرها لك لنسخها ولصقها بسهولة.
2. الإعداد
تنزيل الرمز
انقر على الرابط التالي لتنزيل كل الرموز البرمجية لهذا الدرس التطبيقي حول الترميز:
فكِّ ضغط ملف ZIP الذي تم تنزيله. سيؤدي ذلك إلى فك ضغط مجلد جذر (mlkit-android-main
) يحتوي على جميع الموارد التي ستحتاج إليها. في هذا الدليل التعليمي حول الرموز البرمجية، لن تحتاج سوى إلى المصادر في الدليل الفرعي object-detection
.
يحتوي الدليل الفرعي object-detection في مستودع mlkit-android على دليلَين:
- starter: الرمز البرمجي الأوّلي الذي تستند إليه في هذا الدرس التطبيقي حول الترميز
- final: الرمز المكتمل لنموذج التطبيق المكتمل
3- إضافة ML Kit Object Detection and Tracking API إلى المشروع
استيراد التطبيق إلى "استوديو Android"
لنبدأ باستيراد التطبيق المبدئي إلى Android Studio.
افتح Android Studio، واختَر Import Project (استيراد المشروع) (Gradle أو Eclipse ADT أو غير ذلك)، ثم اختَر مجلد starter
من رمز المصدر الذي نزّلته سابقًا.
إضافة التبعيات لميزة "اكتشاف الأجسام وتتبُّعها" في ML Kit
تسمح لك ملحقّات ML Kit بدمج حزمة SDK لـ ML Kit ODT في تطبيقك. أضِف الأسطر التالية إلى نهاية ملف app/build.gradle
في مشروعك:
build.gradle
dependencies {
// ...
implementation 'com.google.mlkit:object-detection:16.2.4'
}
مزامنة مشروعك مع ملفات Gradle
للتأكّد من توفّر جميع التبعيات لتطبيقك، عليك مزامنة مشروعك مع ملفات Gradle في هذه المرحلة.
اختَر مزامنة المشروع مع ملفات Gradle ( ) من شريط أدوات "استوديو Android".
(إذا كان هذا الزر غير مفعّل، تأكَّد من استيراد starter/app/build.gradle
فقط، وليس المستودع بأكمله.)
4. تشغيل التطبيق النموذجي
بعد استيراد المشروع إلى Android Studio وإضافة التبعيات لميزة "رصد الأجسام وتتبُّعها" في ML Kit، أصبحت مستعدًا لتشغيل التطبيق للمرة الأولى.
وصِّل جهاز Android عبر USB بالجهاز المضيف، أو ابدأ محاكي Android Studio، ثم انقر على تشغيل ( ) في شريط أدوات Android Studio.
تشغيل التطبيق واستكشافه
من المفترض أن يتم تشغيل التطبيق على جهاز Android. يحتوي على بعض الرموز البرمجية المتكررة التي تتيح لك التقاط صورة أو اختيار صورة مُعدّة مسبقًا وإرسالها إلى مسار معالجة لرصد الأجسام وتتبُّعها، وهو المسار الذي ستُنشئه في هذا الدليل التعليمي حول الرموز البرمجية. لنطّلِع على التطبيق قليلاً قبل كتابة الرمز البرمجي.
أولاً، يتوفّر زر ( ) في أسفل الصفحة لإجراء ما يلي:
- فتح تطبيق الكاميرا المدمج في جهازك أو المحاكي
- التقاط صورة في تطبيق الكاميرا
- تلقّي الصورة التي تم التقاطها في تطبيق التشغيل
- عرض الصورة
جرِّب الزر التقاط صورة واتّبِع التعليمات لالتقاط صورة، ثم اقبل الصورة واطّلِع على عرضها داخل تطبيق التشغيل.
كرِّر ذلك بضع مرات لمعرفة كيفية عملها:
ثانيًا، تتوفّر 3 صور مُعدّة مسبقًا يمكنك الاختيار من بينها. يمكنك استخدام هذه الصور لاحقًا لاختبار رمز رصد الأجسام إذا كنت تستخدم محاكي Android.
اختَر صورة من الصور الثلاث المُعدّة مسبقًا. تأكَّد من ظهور الصورة في العرض الأكبر:
5- إضافة ميزة "رصد الأجسام" على الجهاز فقط
في هذه الخطوة، ستضيف الوظيفة إلى التطبيق المبدئي لرصد الأجسام في الصور. كما رأيت في الخطوة السابقة، يحتوي التطبيق المبدئي على رمز نموذجي لالتقاط الصور باستخدام تطبيق الكاميرا على الجهاز. تتوفّر أيضًا 3 صور مُعدّة مسبقًا في التطبيق يمكنك تجربة ميزة "اكتشاف الأجسام" عليها إذا كنت تشغّل الدرس التطبيقي على محاكي Android.
عند اختيار صورة، إما من الصور المُعدّة مسبقًا أو من خلال التقاط صورة باستخدام تطبيق الكاميرا، يفكّ رمز النموذج النصي هذا الصورة إلى مثيل Bitmap
، ويعرضها على الشاشة ويُطلِب طريقة runObjectDetection
مع الصورة.
في هذه الخطوة، ستضيف رمزًا إلى طريقة runObjectDetection
لرصد الأجسام.
إعداد ميزة "اكتشاف الأجسام" على الجهاز وتشغيلها على صورة
هناك 3 خطوات بسيطة فقط باستخدام 3 واجهات برمجة تطبيقات لإعداد ML Kit ODT:
- تجهيز صورة:
InputImage
- أنشئ عنصر أداة رصد:
ObjectDetection.getClient(options)
- ربط الكائنَين أعلاه:
process(image)
يمكنك إجراء ذلك داخل الدالة runObjectDetection(bitmap: Bitmap)
في الملف MainActivity.kt
.
/**
* ML Kit Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
}
في الوقت الحالي، الوظيفة فارغة. انتقِل إلى الخطوات التالية لتنفيذ ML Kit ODT. أثناء إنشاء التطبيق، سيطلب منك Android Studio إضافة عمليات الاستيراد اللازمة:
com.google.mlkit.vision.common.InputImage
com.google.mlkit.vision.objects.ObjectDetection
com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions
الخطوة 1: إنشاء InputImage
توفّر ML Kit واجهة برمجة تطبيقات بسيطة لإنشاء 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 نمط تصميم "أداة الإنشاء". ستُرسل الإعدادات إلى أداة الإنشاء، ثم ستحصل على كاشف منها. هناك 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}")
}
}
}
أنت الآن جاهز لقبول الصور لرصدها.
لنبدأ بتشغيل ورشة رموز البرامج بالنقر على رمز التشغيل ( ) في شريط أدوات "استوديو Android". جرِّب اختيار صورة مُعدّة مسبقًا أو التقاط صورة، ثم اطّلِع على نافذة logcat( ) داخل IDE.
من المفترض أن يظهر لك ما يلي:
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،كانت السلطة).
من الناحية الفنية، هذا كل ما تحتاجه لتشغيل ميزة "اكتشاف الأجسام" في ML Kit. تهانينا!
من ناحية واجهة المستخدم، ما زلت في المرحلة التي بدأت فيها، ولكن يمكنك الاستفادة من النتائج التي تم رصدها على واجهة المستخدم، مثل رسم مربّع الحدود لتوفير تجربة أفضل. لننتقل إلى الخطوة التالية، وهي معالجة النتائج التي تم رصدها بعد اكتمالها.
6- معالجة نتائج رصد المحتوى بعد اكتمالها
في الخطوات السابقة، يمكنك طباعة النتيجة التي تم رصدها في logcat: وهي عملية بسيطة وسريعة.
في هذا القسم، ستستفيد من النتيجة في الصورة:
- رسم مربّع الحدود على الصورة
- رسم اسم الفئة ونسبة الثقة داخل مربّع الحدود
التعرّف على أدوات المساعدة في العروض المرئية
هناك بعض الرموز البرمجية النموذجية داخل ورشة رموز البرامج لمساعدتك في عرض نتيجة الكشف بشكل مرئي. يمكنك الاستفادة من هذه الأدوات لتسهيل رمز التصور:
data class BoxWithText(val box: Rect, val text: String)
هذه فئة بيانات لتخزين نتيجة رصد الأجسام من أجل العرض المرئي.box
هو المربّع المحيط الذي يقع فيه الجسم، وtext
هو سلسلة نتيجة رصد الأجسام التي يتم عرضها مع المربّع المحيط للجسم.fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap
ترسم هذه الطريقة نتائج رصد الأجسام فيdetectionResults
على الإدخالbitmap
وتُرجع النسخة المعدَّلة منه.
في ما يلي مثال على ناتج طريقة الأداة drawDetectionResult
:
عرض نتيجة رصد أدوات تعلُّم الآلة
استخدِم أدوات العروض المرئية لرسم نتيجة ميزة "التعرّف على الأجسام" من ML Kit فوق صورة الإدخال.
انتقِل إلى المكان الذي تتصل فيه بـ 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
في ML Kit وإنشاء قائمة بعناصرBoxWithText
لعرض نتيجة العروض المرئية. - بعد ذلك، يمكنك رسم نتيجة الكشف فوق صورة الإدخال باستخدام طريقة الأداة
drawDetectionResult
وعرضها على الشاشة.
تشغيله
الآن، انقر على تشغيل ( ) في شريط أدوات "استوديو Android".
بعد تحميل التطبيق، اضغط على الزر الذي يحمل رمز الكاميرا، ثم وجِّه الكاميرا إلى جسم معيّن، والتقط صورة، واقبل الصورة (في تطبيق "الكاميرا")، أو يمكنك النقر بسهولة على أي صور مُعدّة مسبقًا. من المفترض أن تظهر لك نتائج رصد الوجوه. اضغط على الزر مرة أخرى أو اختَر صورة أخرى لتكرار الإجراء مرّتين أو ثلاث مرات للاستفادة من أحدث إصدار من ML Kit ODT.
7- تهانينا!
إذا كنت قد استخدمت أدوات تعلُّم الآلة لإضافة إمكانات ميزة "اكتشاف الأجسام" إلى تطبيقك:
- 3 خطوات باستخدام 3 واجهات برمجة تطبيقات
- إنشاء صورة إدخال
- إنشاء أداة رصد
- إرسال الصورة إلى أداة الكشف
هذا كل ما عليك فعله لبدء استخدام التطبيق.
أثناء المتابعة، قد تحتاج إلى تحسين النموذج: كما يمكنك ملاحظة أنّ النموذج التلقائي لا يمكنه التعرّف إلا على 5 فئات، ولا يمكنه حتى التعرّف على السكين والشوكة والقنينة. يمكنك الاطّلاع على ورشة رموز البرمجة الأخرى في مسار التعلّم "تعلُّم الآلة على الجهاز" - "اكتشاف الأجسام" للتعرّف على كيفية تدريب نموذج مخصّص.
المواضيع التي تناولناها
- كيفية إضافة ميزتَي "رصد الأجسام وتتبُّعها" من ML Kit إلى تطبيق Android
- كيفية استخدام ميزتَي رصد الأجسام وتتبُّعها على الجهاز في ML Kit لرصد الأجسام في الصور
الخطوات التالية
- استكشِف المزيد باستخدام ML Kit ODT مع المزيد من الصور والفيديوهات المباشرة لتجربة دقة الرصد والتصنيف والأداء
- اطّلِع على مسار تعلُّم ميزة "رصد الأجسام" في ميزة "تعلُّم الآلة على الجهاز" للتعرّف على كيفية تدريب نموذج مخصّص.
- تطبيق ML Kit ODT في تطبيق Android الخاص بك