1. قبل البدء
في الدرس التطبيقي الأول حول الترميز في هذه السلسلة، أنشأت تطبيقًا بسيطًا جدًا يستخدم ميزة "تصنيف الصور" لتحليل محتوى صورة. لقد أرسلت إليها صورة لزهرة أقحوان، فأخبرتك أنّها رأت أشياء مثل بتلة أو السماء. بعد ذلك، في Codelab الثاني، انتقلت إلى Python لتدريب نموذج جديد ومخصّص يتعرّف على خمسة أنواع مختلفة من الزهور.
في هذا الدرس التطبيقي حول الترميز، ستحدّث التطبيق من الدرس التطبيقي الأول باستخدام النموذج من الدرس التطبيقي الثاني.
يمكنك الحصول على رمز المصدر الكامل لهذا الدرس التطبيقي حول الترميز من خلال استنساخ مستودع هذا. ستظهر لك أدلة فرعية لنظامَي التشغيل Android وiOS. يتوفّر رمز الدرس العملي السابق باسم ImageClassifierStep1 إذا أردت متابعته. يتوفّر الرمز البرمجي المكتمل لهذا الدرس التطبيقي حول الترميز باسم ImageClassifierStep2.
المتطلبات الأساسية
- يجب أن تكون قد أكملت أول درسَين تطبيقيَين حول الترميز في مسار التعلّم هذا.
ما ستنشئه وما ستتعلمه
- دمج نموذج مخصّص تم تدريبه في الدرس التطبيقي السابق في تطبيق Android أو iOS
المتطلبات
- "استوديو Android"، متاح على developer.android.com/studio لجزء Android من المختبر
- Xcode، المتوفّر في Apple App Store، لجزء iOS من المختبر
2. الحصول على التطبيق النموذجي
عليك أولاً الحصول على التطبيق من برنامج Build your first Computer Vision App on Android or iOS Codelab. إذا كنت قد اجتزت الدرس التطبيقي، سيُطلق عليه اسم ImageClassifierStep1. إذا كنت لا تريد إجراء التجربة، يمكنك استنساخ الإصدار النهائي من المستودع.
افتحه في استوديو Android، وأجرِ أي تحديثات تحتاج إليها، وعندما يصبح جاهزًا، شغِّل التطبيق للتأكّد من أنّه يعمل. ينبغي أن تظهر لك على النحو التالي:

إنّه تطبيق بسيط جدًا، لكنّه يعرض بعض الوظائف الفعّالة جدًا باستخدام القليل من الرموز البرمجية. ومع ذلك، إذا أردت أن يتم التعرّف على هذه الزهرة كأقحوان وليس كزهرة فقط، عليك تعديل التطبيق لاستخدام النموذج المخصّص من الدرس التطبيقي حول الترميز "إنشاء نموذج مخصّص لمصنِّف الصور".
3- تعديل ملف build.gradle لاستخدام "نماذج حزمة تعلّم الآلة المخصّصة"
- باستخدام "استوديو Android"، ابحث عن ملف
build.gradleعلى مستوى التطبيق. أسهل طريقة للقيام بذلك هي في "مستكشف المشاريع". تأكَّد من اختيار Android في أعلى الصفحة، وسيظهر لك مجلد برامج نصية Gradle في أسفل الصفحة. - افتح الملف الخاص بالوحدة، والذي يتضمّن اسم تطبيقك متبوعًا بـ .app كما هو موضّح هنا (Module: ImageClassifierStep1.app):

- في أسفل الملف، ابحث عن إعدادات التبعيات. من المفترض أن يظهر لك السطر التالي:
implementation 'com.google.mlkit:image-labeling:17.0.1'
قد يختلف رقم الإصدار. يمكنك دائمًا العثور على أحدث رقم إصدار من موقع حزمة تعلّم الآلة الإلكتروني على: https://developers.google.com/ml-kit/vision/image-labeling/android
- استبدِل ذلك بالمرجع إلى مكتبة تصنيف الصور المخصّصة. يمكن العثور على رقم الإصدار لهذا النموذج على الرابط: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
- بالإضافة إلى ذلك، ستضيف نموذج .tflite الذي أنشأته في الدرس التطبيقي السابق. لا تريد أن يتم ضغط هذا النموذج عندما يجمع استوديو Android تطبيقك، لذا احرص على استخدام هذا الإعداد في قسم Android من ملف
build.gradleنفسه:
aaptOptions{
noCompress "tflite"
}
تأكَّد من عدم تضمينه في أي إعداد آخر. يجب أن يكون مضمّنًا مباشرةً ضمن العلامة android. وفي ما يلي مثال لذلك:

4. إضافة نموذج TFLite
في الدرس التطبيقي حول الترميز السابق، أنشأت نموذجك المخصّص ونزّلته باسم model.tflite.
في مشروعك، ابحث عن مجلد مواد العرض الذي يحتوي حاليًا على flower1.jpg. انسخ النموذج إلى هذا المجلد على النحو التالي:
- انقر بزر الماوس الأيمن على المجلد Assets في "استوديو Android". في القائمة التي تظهر، انقر على العرض في Finder. ("العرض في المستكشف" على نظام التشغيل Windows و"العرض في الملفات" على نظام التشغيل Linux)

- سيتم نقلك إلى الدليل في نظام الملفات. انسخ الملف
model.tfliteإلى هذا الدليل بجانبflower1.jpg.

سيتم تعديل استوديو Android لعرض كلا الملفين في مجلد مواد العرض:

أنت الآن جاهز لتعديل الرمز.
5- تعديل الرمز للنموذج المخصّص
تتمثّل الخطوة الأولى في إضافة بعض الرموز لتحميل النموذج المخصّص.
- في ملف
MainActivity، أضِف ما يلي إلىonCreate، أسفل السطر الذي يظهر فيهsetContentView(R.layout.activity_main)مباشرةً.
سيتم استخدام LocalModel لإنشاء النموذج من مادة العرض model.tflite. إذا ظهرت رسالة خطأ في "استوديو Android" من خلال تحويل LocalModel إلى اللون الأحمر، اضغط على ALT + Enter لاستيراد المكتبة. من المفترض أن تتم إضافة عملية استيراد إلى com.google.mlkit.common.model.LocalModel.
val localModel = LocalModel.Builder()
.setAssetFilePath("model.tflite")
.build()
في السابق، كنت تستخدم النموذج التلقائي في معالج btn.setOnClickListener. تم إعدادها باستخدام الرمز التالي:
val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
عليك استبدالها لاستخدام النموذج المخصّص.
- إعداد عنصر خيارات مخصّصة:
val options = CustomImageLabelerOptions.Builder(localModel)
.setConfidenceThreshold(0.7f)
.setMaxResultCount(5)
.build()
يؤدي ذلك إلى استبدال الخيارات التلقائية بمجموعة مخصّصة. يضع حدّ الثقة معيارًا لجودة التوقعات التي سيتم عرضها. إذا رجعت إلى العيّنة في أعلى هذا الدرس التطبيقي حول الترميز، حيث كانت الصورة عبارة عن زهرة أقحوان، ستجد 4 توقّعات، كل منها يتضمّن قيمة بجانبه، مثل "السماء" بقيمة 0 .7632.
يمكنك فلترة النتائج ذات الجودة المنخفضة بشكل فعّال باستخدام حدّ ثقة عالٍ. على سبيل المثال، لن يؤدي ضبط هذا الخيار على 0.9 إلى عرض أي تصنيف بأولوية أقل من ذلك. يكون setMaxResultCount() مفيدًا في النماذج التي تحتوي على العديد من الفئات، ولكن بما أنّ هذا النموذج يحتوي على 5 فئات فقط، عليك تركه عند 5.
بعد أن أصبحت لديك خيارات لبرنامج وضع التصنيفات، يمكنك تغيير إنشاء مثيل لبرنامج وضع التصنيفات إلى:
val labeler = ImageLabeling.getClient(options)
سيتم تنفيذ بقية الرمز بدون تعديل. ننصحك بتجربة ذلك.

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

ويحددها على أنّها وردة.
قد تتساءل عن سبب استخدام كلمة ورود بدلاً من "وردة". يرجع ذلك إلى أنّ التصنيفات في مجموعة البيانات يتم تقديمها من خلال أسماء المجلدات، ولكنّ هذه الأسماء غير متسقة بعض الشيء، إذ يتم استخدام صيغة المفرد أحيانًا (مثل "أقحوان") وصيغة الجمع أحيانًا أخرى (مثل "ورود"). لا تخلط بين هذه الميزة ومحاولة النموذج عدّ العناصر في الصورة، فالميزة أبسط بكثير من ذلك، ويمكنها فقط تحديد أنواع الزهور.
6. تنزيل تطبيق "ابدأ" على iOS
- يجب أولاً الحصول على التطبيق من الدرس التطبيقي الأول حول الترميز. إذا كنت قد أتممت الدرس التطبيقي، سيُطلق عليه اسم ImageClassifierStep1. إذا كنت لا تريد إجراء التجربة، يمكنك استنساخ الإصدار النهائي من المستودع. يُرجى العِلم أنّ حِزم Pod وملف .xcworkspace غير متوفّرة في مستودع الرموز، لذا قبل الانتقال إلى الخطوة التالية، احرص على تنفيذ الأمر "pod install" من الدليل نفسه الذي يتضمّن ملف .xcproject.
- افتح
ImageClassifierStep1.xcworkspaceفي Xcode. يُرجى العِلم أنّه يجب استخدام .xcworkspace وليس .xcproject لأنّك ربطت حزمة تعلّم الآلة باستخدام وحدات pods، وستحمّل مساحة العمل هذه الوحدات.
في بقية هذا الدرس التطبيقي، سأشغّل التطبيق في محاكي iPhone الذي من المفترض أن يتوافق مع أهداف الإصدار من الدرس التطبيقي. إذا كنت تريد استخدام جهازك الخاص، قد تحتاج إلى تغيير هدف الإصدار في إعدادات مشروعك ليتوافق مع إصدار iOS.
شغِّلها وسيظهر لك ما يلي:

لاحظ التصنيفات العامة جدًا: بتلة وزهرة وسماء. تم تدريب النموذج الذي أنشأته في الدرس التطبيقي السابق حول الترميز على رصد 5 أنواع من الزهور، بما في ذلك هذا النوع، وهو الأقحوان.
في بقية هذا الدرس التطبيقي، ستتعرّف على الخطوات اللازمة لترقية تطبيقك باستخدام النموذج المخصّص.
7. استخدام لوحات مصنّف الصور المخصّص في حزمة تعلّم الآلة
استخدم التطبيق الأول ملفًا مضغوطًا للحصول على مكتبات ونموذج أداة تصنيف الصور الأساسية في حزمة تعلّم الآلة. عليك تعديل ذلك لاستخدام مكتبات تصنيف الصور المخصّصة.
- ابحث عن الملف المسمّى
podfileفي دليل مشروعك. افتحه، وسيظهر لك شيء مشابه لما يلي:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- غيِّر بيان وحدة الإعلان من
ImageLabelingإلىImageLabelingCustom، على النحو التالي:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- بعد الانتهاء، استخدِم المحطة الطرفية للانتقال إلى الدليل الذي يحتوي على ملف podfile (بالإضافة إلى ملف .xcworkspace) وشغِّل
pod install.

بعد بضع لحظات، ستتم إزالة مكتبات MLKitImageLabeling وإضافة المكتبات المخصّصة. يمكنك الآن فتح ملف .xcworkspace لتعديل الرمز.
8. إضافة نموذج TFLite إلى Xcode
في الدرس التطبيقي السابق حول الترميز، أنشأت نموذجًا مخصّصًا ونزّلته باسم model.tflite. إذا لم يكن لديك هذا الرمز، ارجع إلى الدرس التطبيقي حول الترميز واكتبه، أو انتقِل إلى رمز Colab هنا. إذا لم يكن بإمكانك الوصول إلى Google Colab، يمكنك الاطّلاع على ورقة الملاحظات من خلال هذا الرابط: هذا
- بعد فتح مساحة العمل في Xcode، اسحب ملف model.tflite إلى مشروعك. يجب أن يكون في المجلد نفسه الذي يحتوي على بقية ملفاتك، مثل
ViewController.swiftأوMain.storyboard. - سيظهر مربّع حوار يتضمّن خيارات لإضافة الملف. تأكَّد من تحديد الإضافة إلى الاستهدافات، وإلا لن يتم تجميع النموذج مع التطبيق عند نشره على جهاز.
يُرجى العِلم أنّ الإدخال "الإضافة إلى الاستهدافات" سيحتوي على ImageClassifierStep1 إذا بدأت من ذلك وواصلت هذا الدرس التطبيقي خطوة بخطوة أو ImageClassifierStep2 (كما هو موضّح) إذا انتقلت إلى الرمز البرمجي المكتمل.

سيضمن ذلك إمكانية تحميل النموذج. ستتعرّف على كيفية إجراء ذلك في الخطوة التالية.
9- تعديل الرمز الخاص بالنموذج المخصّص
- افتح ملف
ViewController.swift. قد يظهر لك خطأ في "استيراد MLKitImageLabeling" في أعلى الملف. يرجع ذلك إلى أنّك أزلت مكتبات تصنيف الصور العامة عند تعديل ملف pod. يمكنك حذف هذا السطر واستبداله بما يلي:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
قد يكون من السهل قراءة هذه الرموز بسرعة والاعتقاد أنّها تكرّر الرمز نفسه. ولكنّها "شائعة" و"مخصّصة" في النهاية!
- بعد ذلك، عليك تحميل النموذج المخصّص الذي أضفته في الخطوة السابقة. ابحث عن الدالة
getLabels(). أسفل السطر الذي يظهر فيهvisionImage.orientation = image.imageOrientation، أضِف الأسطر التالية:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
- ابحث عن الرمز لتحديد خيارات ImageLabeler العامة. من المحتمل أن يظهر لك خطأ لأنّه تمت إزالة هذه المكتبات:
let options = ImageLabelerOptions()
استبدِلها بهذا الرمز لاستخدام CustomImageLabelerOptions، والذي يحدّد النموذج المحلي:
let options = CustomImageLabelerOptions(localModel: localModel)
...وهذا كل ما في الأمر. جرِّب تشغيل تطبيقك الآن. عند محاولة تصنيف الصورة، من المفترض أن تكون النتيجة أكثر دقة، وأن تخبرك بأنّك تنظر إلى أقحوانة باحتمالية كبيرة.

لنفترض أنّك أضفت صورة ثانية للزهرة، وأعدت تشغيل الطلب باستخدامها:

رصد التطبيق بنجاح أنّ هذه الصورة تتطابق مع التصنيف "ورود".
10. تهانينا!
لقد انتقلت الآن من إنشاء تطبيق يستخدم نموذجًا عامًا للتعرّف على محتوى صورة إلى إنشاء نموذج تعلُّم آلة خاص بك للتعرّف على أشياء معيّنة، مثل الزهور، ثم تعديل تطبيقك لاستخدام النموذج المخصّص.
بالطبع، يكون التطبيق الناتج محدودًا للغاية لأنّه يعتمد على مواد عرض الصور المجمَّعة. ومع ذلك، يعمل جزء تعلُّم الآلة بشكل جيد. يمكنك مثلاً استخدام AndroidX Camera لالتقاط لقطات من بث مباشر وتصنيفها لمعرفة الزهور التي يتعرّف عليها هاتفك.
من هنا، تصبح الإمكانيات لا حدود لها، وإذا كانت لديك بيانات خاصة بك لشيء آخر غير الزهور، ستتوفّر لديك الأسس اللازمة لإنشاء تطبيق يتعرّف عليها باستخدام "الرؤية الحاسوبية". هذه مجرد الخطوات الأولى في عالم أوسع بكثير، ونأمل أن تكون قد استمتعت بتنفيذها.