1. نظرة عامة
يمكّنك Firebase ML من نشر النموذج الخاص بك عبر الهواء. يسمح لك هذا بالحفاظ على حجم التطبيق صغيرًا وتنزيل نموذج ML فقط عند الحاجة، أو تجربة نماذج متعددة، أو تحديث نموذج ML الخاص بك دون الحاجة إلى إعادة نشر التطبيق بالكامل.
في هذا الدرس التطبيقي حول التعليمات البرمجية، ستقوم بتحويل تطبيق Android باستخدام نموذج TFLite ثابت إلى تطبيق باستخدام نموذج يتم تقديمه ديناميكيًا من Firebase.
ما ستتعلمه
- انشر نماذج TFLite على Firebase ML وقم بالوصول إليها من تطبيقك
- تتبع تعليقات المستخدمين لقياس دقة النموذج باستخدام Firebase Analytics
- أداء نموذج الملف الشخصي عبر أداء Firebase
- حدد أيًا من النماذج المنشورة المتعددة يتم تحميله من خلال Remote Config
- قم بتجربة نماذج مختلفة عبر اختبار Firebase A/B
ماذا ستحتاج
- أحدث إصدار من أندرويد ستوديو .
- عينة من الرموز.
- جهاز اختبار يعمل بنظام Android 5.0+ وخدمات Google Play 9.8 أو أحدث، أو محاكي مع خدمات Google Play 9.8 أو أحدث
- في حالة استخدام جهاز، كابل اتصال.
كيف ستستخدم هذا البرنامج التعليمي؟
كيف تقيم تجربتك في إنشاء تطبيقات Android؟
2. احصل على نموذج التعليمات البرمجية
استنساخ مستودع GitHub من سطر الأوامر.
$ git clone https://github.com/FirebaseExtended/codelab-digitclassifier-android.git
إذا لم يكن git مثبتًا لديك، فيمكنك أيضًا تنزيل نموذج المشروع من صفحة GitHub الخاصة به أو بالنقر فوق هذا الرابط .
3. قم باستيراد تطبيق البداية
من Android Studio، حدد دليل codelab-digitclassifier-android
( ) من تنزيل نموذج التعليمات البرمجية ( File > Open > .../codelab-digitclassifier-android/start).
يجب أن يكون لديك الآن مشروع البداية مفتوحًا في Android Studio.
4. قم بتشغيل تطبيق البداية
الآن بعد أن قمت باستيراد المشروع إلى Android Studio، أنت جاهز لتشغيل التطبيق لأول مرة. قم بتوصيل جهاز Android الخاص بك، ثم انقر فوق تشغيل ( ) في شريط أدوات Android Studio.
يجب أن يتم تشغيل التطبيق على جهازك. في هذه المرحلة، إذا حاولت رسم رقم، فمن المفترض أن يكون التطبيق قادرًا على التعرف عليه.
5. إنشاء مشروع وحدة تحكم Firebase
أضف Firebase إلى المشروع
- انتقل إلى وحدة تحكم Firebase .
- حدد إضافة مشروع .
- حدد أو أدخل اسم المشروع.
- اتبع خطوات الإعداد المتبقية في وحدة تحكم Firebase، ثم انقر فوق إنشاء مشروع (أو إضافة Firebase، إذا كنت تستخدم مشروع Google موجودًا).
6. أضف Firebase
- من شاشة النظرة العامة لمشروعك الجديد، انقر فوق أيقونة Android لبدء سير عمل الإعداد.
- أدخل اسم حزمة Codelab:
org.tensorflow.lite.examples.digitclassifier
أضف ملف google-services.json إلى تطبيقك
بعد تسجيل اسم الحزمة وتحديد التالي، انقر فوق تنزيل google-services.json للحصول على ملف تكوين Firebase Android ثم انسخ ملف google-services.json إلى دليل app
في مشروعك. بعد تنزيل الملف، يمكنك تخطي الخطوات التالية الموضحة في وحدة التحكم (لقد تم تنفيذها لك بالفعل في مشروع build-android-start).
أضف البرنامج المساعد لخدمات جوجل إلى التطبيق الخاص بك
يستخدم المكوّن الإضافي google-services ملف google-services.json لتهيئة تطبيقك لاستخدام Firebase. أضف السطر التالي إلى كتلة plugins
الموجودة أعلى ملف build.gradle.kts في دليل app
الخاص بمشروعك:
app/build.gradle.kts
id("com.google.gms.google-services")
ثم أضف السطر التالي إلى كتلة plugins
لملف build.gradle.kts الخاص بك في المشروع:
المشروع/build.gradle.kts
id("com.google.gms.google-services") version "4.3.15" apply false
مزامنة مشروعك مع ملفات gradle
للتأكد من أن جميع التبعيات متاحة لتطبيقك، يجب عليك مزامنة مشروعك مع ملفات gradle في هذه المرحلة. حدد ملف > مزامنة المشروع مع ملفات Gradle من شريط أدوات Android Studio.
7. قم بتشغيل التطبيق باستخدام Firebase
الآن بعد أن قمت بتكوين المكون الإضافي google-services
باستخدام ملف JSON الخاص بك، فأنت جاهز لتشغيل التطبيق باستخدام Firebase. قم بتوصيل جهاز Android الخاص بك، ثم انقر فوق تشغيل ( ) في شريط أدوات Android Studio.
يجب أن يتم تشغيل التطبيق على جهازك. في هذه المرحلة، يجب أن يتم إنشاء تطبيقك بنجاح.
8. نشر نموذج على Firebase ML
يعد نشر نموذج في Firebase ML مفيدًا لسببين رئيسيين:
- يمكننا الحفاظ على حجم تثبيت التطبيق صغيرًا وتنزيل النموذج فقط إذا لزم الأمر
- يمكن تحديث النموذج بانتظام وبدورة إصدار مختلفة عن التطبيق بأكمله
قبل أن نتمكن من استبدال النموذج الثابت في تطبيقنا بنموذج تم تنزيله ديناميكيًا من Firebase، نحتاج إلى نشره في Firebase ML. يمكن نشر النموذج إما عبر وحدة التحكم، أو برمجيًا، باستخدام Firebase Admin SDK. في هذه الخطوة سوف نقوم بالنشر عبر وحدة التحكم.
لتبسيط الأمور، سنستخدم نموذج TensorFlow Lite الموجود بالفعل في تطبيقنا. أولاً، افتح Firebase Console وانقر على Machine Learning في لوحة التنقل اليمنى. انقر فوق "البدء" إذا كنت تفتح هذه المرة الأولى. ثم انتقل إلى "مخصص" وانقر على زر "إضافة نموذج مخصص".
عندما يُطلب منك ذلك، قم بتسمية النموذج باسم وصفي مثل mnist_v1
وقم بتحميل الملف من دليل مشروع codelab ضمن start/app/src/main/assets/mnist.tflite
. ثم يمكنك حذف ملف نموذج TF Lite هذا من مشروع Android.
9. قم بتنزيل النموذج من Firebase ML
قد يكون اختيار وقت تنزيل النموذج البعيد من Firebase إلى تطبيقك أمرًا صعبًا نظرًا لأن نماذج TFLite يمكن أن تنمو بشكل كبير نسبيًا. من الناحية المثالية، نريد تجنب تحميل النموذج على الفور عند تشغيل التطبيق، لأنه إذا تم استخدام نموذجنا لميزة واحدة فقط ولم يستخدم المستخدم هذه الميزة مطلقًا، فسنكون قد قمنا بتنزيل كمية كبيرة من البيانات دون سبب. يمكننا أيضًا تعيين خيارات التنزيل مثل جلب النماذج فقط عند الاتصال بشبكة wifi. إذا كنت تريد التأكد من أن النموذج متاح حتى بدون اتصال بالشبكة، فمن المهم أيضًا تجميعه بدون التطبيق كنسخة احتياطية.
من أجل التبسيط، سنقوم بإزالة النموذج المجمع الافتراضي ونقوم دائمًا بتنزيل نموذج من Firebase عند بدء تشغيل التطبيق. بهذه الطريقة، عند تشغيل التعرف على الأرقام، يمكنك التأكد من تشغيل الاستدلال باستخدام النموذج المقدم من Firebase.
في ملف app/build.gradle.kts، أضف تبعية Firebase Machine Learning
app/build.gradle.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
ثم أضف منطقًا لتنزيل النموذج من Firebase.
سنقوم باستبدال digitClassifier.initialize(loadModelFile())
بـ downloadModel("mnist_v1")
وتنفيذ هذه الطريقة.
MainActivity.kt
private fun downloadModel(modelName: String): Task<CustomModel> {
val conditions = CustomModelDownloadConditions.Builder()
.requireWifi()
.build()
return FirebaseModelDownloader.getInstance()
.getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
.addOnCompleteListener {
val model = it.result
if (model == null) {
showToast("Failed to get model file.")
} else {
showToast("Downloaded remote model: $modelName")
digitClassifier.initialize(model)
}
}
.addOnFailureListener {
showToast("Model download failed for $modelName, please check your connection.")
}
}
أعد تشغيل تطبيقك وارسم رقمًا في مصنف الأرقام. بمجرد انتهاء التنزيل، يجب أن تشاهد رسالة Toast تفيد بتنزيل النموذج البعيد وسجل يشير إلى أنه يتم استخدام النموذج الجديد.
10. تتبع ملاحظات المستخدم والتحويل لقياس دقة النموذج
يوفر لك Google Analytics for Firebase طريقة لفهم الطريقة التي يتحرك بها المستخدمون عبر تطبيقك، وأين ينجحون وأين يتعثرون ثم يعودون. ويمكن استخدامه أيضًا لفهم الأجزاء الأكثر استخدامًا في تطبيقك.
سنقوم بقياس دقة النموذج من خلال تتبع تعليقات المستخدمين على تنبؤات النموذج. إذا قام المستخدم بالنقر فوق "نعم"، فسوف يشير ذلك إلى أن التنبؤ كان دقيقًا.
يمكننا تسجيل حدث Analytics لتتبع دقة نموذجنا. أولاً، يجب علينا إضافة Analytics إلى التبعية قبل استخدامها في المشروع:
أضف تبعية Firebase Analytics
app/build.gradle.kts
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
أحداث السجل
بعد ذلك، في وظيفة onCreate
، سنقوم بتعيين أداة الاستماع عند النقر لتسجيل حدث correct_inference
في Firebase.
MainActivity.kt (onCreate)
// Setup YES button
yesButton?.setOnClickListener {
Firebase.analytics.logEvent("correct_inference", null)
}
قم بتشغيل التطبيق مرة أخرى وارسم رقمًا. اضغط على الزر "نعم" عدة مرات لإرسال تعليقات تفيد بأن الاستدلال كان دقيقًا.
تحليلات التصحيح
بشكل عام، يتم تجميع الأحداث التي يسجلها تطبيقك معًا خلال فترة ساعة تقريبًا ويتم تحميلها معًا. يحافظ هذا الأسلوب على بطارية أجهزة المستخدمين النهائيين ويقلل من استخدام بيانات الشبكة. ومع ذلك، لأغراض التحقق من صحة تنفيذ التحليلات (ولعرض التحليلات الخاصة بك في تقرير DebugView)، يمكنك تمكين وضع التصحيح على جهاز التطوير الخاص بك لتحميل الأحداث بأقل قدر من التأخير.
لتمكين وضع Analytics Debug على جهاز Android، قم بتنفيذ الأوامر التالية:
adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier
قم بتشغيل التطبيق مرة أخرى وارسم رقمًا. اضغط على الزر "نعم" عدة مرات لإرسال تعليقات تفيد بأن الاستدلال كان دقيقًا. يمكنك الآن عرض أحداث السجل في الوقت الفعلي تقريبًا عبر عرض تصحيح الأخطاء في وحدة تحكم Firebase. انقر على Analytics > DebugView من شريط التنقل الأيسر.
11. تحليل أداء النموذج
إن Firebase Performance Monitoring عبارة عن خدمة تساعدك في التعرف على خصائص الأداء لتطبيقات iOS وAndroid وتطبيقات الويب.
يمكنك استخدام SDK لمراقبة الأداء لجمع بيانات الأداء من تطبيقك، ثم مراجعة تلك البيانات وتحليلها في وحدة تحكم Firebase. تساعدك مراقبة الأداء على فهم أين ومتى يمكن تحسين أداء تطبيقك حتى تتمكن من استخدام تلك المعلومات لإصلاح مشكلات الأداء.
نضيف هنا آثار الأداء حول الاستدلال والتنزيل
وهذا أمر مهم لأن النماذج الأكبر المستخدمة في التعلم العميق لديها القدرة على أن تكون أكثر دقة، ولكنها قد تستغرق أيضًا وقتًا أطول لإرجاع الاستجابة. نحاول في تجربتنا إيجاد التوازن الصحيح بين الدقة والسرعة.
أضف تبعية أداء Firebase
المشروع/build.gradle.kts
plugins {
// ...
// Add the dependency for the Performance Monitoring plugin
id("com.google.firebase.firebase-perf") version "1.4.2" apply false
}
app/build.gradle.kts
plugins {
// ...
// Add the Performance Monitoring plugin
id("com.google.firebase.firebase-perf")
}
// ...
dependencies {
// ...
// Add the dependency for the Performance Monitoring library
implementation("com.google.firebase:firebase-perf")
}
إضافة آثار مخصصة
في الدالة setupDigitClassifier()
قم بإنشاء downloadTrace جديد، وابدأ تشغيله مباشرة قبل تنزيل النموذج. ثم قم بإضافة مستمع onsuccess لإيقاف التتبع.
في الدالة classifyDrawing()
قم بإنشاء classifyTrace جديد، وابدأ تشغيله مباشرة قبل التصنيف. ثم أوقف التتبع في مستمع النجاح.
MainActivity.kt
class MainActivity : AppCompatActivity() {
// ...
private val firebasePerformance = FirebasePerformance.getInstance()
// ...
private fun setupDigitClassifier() {
// Add these lines to create and start the trace
val downloadTrace = firebasePerformance.newTrace("download_model")
downloadTrace.start()
downloadModel("mnist_v1")
// Add these lines to stop the trace on success
.addOnSuccessListener {
downloadTrace.stop()
}
}
// ...
private fun classifyDrawing() {
val bitmap = drawView?.getBitmap()
if ((bitmap != null) && (digitClassifier.isInitialized)) {
// Add these lines to create and start the trace
val classifyTrace = firebasePerformance.newTrace("classify")
classifyTrace.start()
digitClassifier
.classifyAsync(bitmap)
.addOnSuccessListener { resultText ->
// Add this line to stop the trace on success
classifyTrace.stop()
predictedTextView?.text = resultText
}
.addOnFailureListener { e ->
predictedTextView?.text = getString(
R.string.tfe_dc_classification_error_message,
e.localizedMessage
)
Log.e(TAG, "Error classifying drawing.", e)
}
}
}
عرض رسائل السجل لأحداث الأداء
- قم بتمكين تسجيل تصحيح الأخطاء لمراقبة الأداء في وقت الإنشاء عن طريق إضافة عنصر
<meta-data>
إلى ملفAndroidManifest.xml
الخاص بتطبيقك، كما يلي:
AndroidManifest.xml
<application>
<meta-data
android:name="firebase_performance_logcat_enabled"
android:value="true" />
</application>
- تحقق من رسائل السجل الخاصة بك بحثًا عن أي رسائل خطأ.
- تقوم مراقبة الأداء بوضع علامة على رسائل السجل الخاصة بها باستخدام
FirebasePerformance
. باستخدام تصفية logcat، يمكنك على وجه التحديد عرض تتبع المدة وتسجيل طلبات شبكة HTTP/S عن طريق تشغيل الأمر التالي:
adb logcat -s FirebasePerformance
- تحقق من أنواع السجلات التالية التي تشير إلى أن مراقبة الأداء تقوم بتسجيل أحداث الأداء:
-
Logging TraceMetric
-
Logging NetworkRequestMetric
12. نشر نموذج ثانٍ على Firebase ML
عند التوصل إلى إصدار جديد من النموذج الخاص بك، مثل الإصدار الذي يتمتع ببنية نموذجية أفضل أو الذي تم تدريبه على مجموعة بيانات أكبر أو محدثة، قد نشعر بالرغبة في استبدال نموذجنا الحالي بالإصدار الجديد. ومع ذلك، فإن النموذج الذي يؤدي أداءً جيدًا في الاختبار لا يؤدي بالضرورة أداءً جيدًا بنفس القدر في الإنتاج. لذلك، دعونا نقوم بإجراء اختبار A/B في الإنتاج لمقارنة نموذجنا الأصلي والنموذج الجديد.
تفعيل واجهة برمجة تطبيقات إدارة نماذج Firebase
في هذه الخطوة، سنقوم بتمكين Firebase Model Management API لنشر إصدار جديد من نموذج TensorFlow Lite الخاص بنا باستخدام كود Python.
قم بإنشاء دلو لتخزين نماذج ML الخاصة بك
في وحدة تحكم Firebase الخاصة بك، انتقل إلى التخزين وانقر على البدء.
اتبع الحوار لإعداد الدلو الخاص بك.
تمكين Firebase ML API
انتقل إلى صفحة Firebase ML API على Google Cloud Console وانقر على "تمكين".
حدد تطبيق Digit Classifier عندما يُطلب منك ذلك.
تدريب نموذج جديد ونشره على Firebase ML
سنقوم الآن بتدريب إصدار جديد من النموذج باستخدام مجموعة بيانات أكبر، وسنقوم بعد ذلك بنشره برمجيًا مباشرةً من دفتر التدريب باستخدام Firebase Admin SDK.
قم بتنزيل المفتاح الخاص لحساب الخدمة
قبل أن نتمكن من استخدام Firebase Admin SDK، سنحتاج إلى إنشاء حساب خدمة. افتح لوحة حسابات الخدمة في وحدة تحكم Firebase بالنقر فوق هذا الرابط ثم انقر فوق الزر لإنشاء حساب خدمة جديد لـ Firebase Admin SDK. عندما يُطلب منك ذلك، انقر فوق الزر "إنشاء مفتاح خاص جديد". سنستخدم مفتاح حساب الخدمة لمصادقة طلباتنا من دفتر colab.
الآن يمكننا تدريب ونشر النموذج الجديد.
- افتح دفتر ملاحظات colab هذا واعمل نسخة منه ضمن Drive الخاص بك.
- قم بتشغيل الخلية الأولى "تدريب نموذج TensorFlow Lite المحسّن" من خلال النقر على زر التشغيل الموجود على يسارها. سيؤدي هذا إلى تدريب نموذج جديد وقد يستغرق بعض الوقت.
- سيؤدي تشغيل الخلية الثانية إلى إنشاء مطالبة بتحميل الملف. قم بتحميل ملف json الذي قمت بتنزيله من Firebase Console عند إنشاء حساب الخدمة الخاص بك.
- قم بتشغيل الخليتين الأخيرتين.
بعد تشغيل دفتر colab، يجب أن تشاهد نموذجًا ثانيًا في وحدة تحكم Firebase. تأكد من تسمية النموذج الثاني mnist_v2
.
13. حدد نموذجًا عبر Remote Config
الآن بعد أن أصبح لدينا نموذجان منفصلان، سنضيف معلمة لتحديد النموذج الذي سيتم تنزيله في وقت التشغيل. ستحدد قيمة المعلمة التي يتلقاها العميل النموذج الذي سيقوم بتنزيله.
أضف قواعد التكوين في وحدة تحكم Firebase
أولاً، افتح وحدة تحكم Firebase وانقر على زر Remote Config في قائمة التنقل اليسرى. ثم انقر على زر "إضافة معلمة".
قم بتسمية المعلمة الجديدة model_name
وأعطها القيمة الافتراضية "mnist_v1"
. من خلال وضع اسم النموذج في معلمة التكوين عن بعد، يمكننا اختبار نماذج متعددة دون إضافة معلمة جديدة لكل نموذج نريد اختباره. انقر فوق نشر التغييرات لتطبيق التحديثات.
أضف تبعية Firebase RemoteConfig
app/build.gradle.kts
implementation("com.google.firebase:firebase-config-ktx")
تكوين Firebase Remote Config
MainActivity.kt
private fun configureRemoteConfig() {
remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
minimumFetchIntervalInSeconds = 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)
}
طلب واستخدام التكوين
أنشئ طلب جلب للتكوين وأضف معالج إكمال لالتقاط معلمات التكوين واستخدامها.
MainActivity.kt
private fun setupDigitClassifier() {
configureRemoteConfig()
remoteConfig.fetchAndActivate()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val modelName = remoteConfig.getString("model_name")
val downloadTrace = firebasePerformance.newTrace("download_model")
downloadTrace.start()
downloadModel(modelName)
.addOnSuccessListener {
downloadTrace.stop()
}
} else {
showToast("Failed to fetch model name.")
}
}
}
اختبار التكوين عن بعد
- انقر على زر التشغيل .
- تأكد من ظهور رسالة Toast التي تفيد بتنزيل نموذج mnist_v1.
- ارجع إلى Firebase Console، وقم بتغيير القيمة الافتراضية إلى mnist_v2 وحدد نشر التغييرات لتطبيق التحديثات.
- أعد تشغيل التطبيق وتحقق من رؤية رسالة Toast التي تفيد بتنزيل نموذج mnist_v2 هذه المرة.
14. فعالية نموذج اختبار أ/ب
يساعدك اختبار Firebase A/B على تحسين تجربة تطبيقك من خلال تسهيل تشغيل تجارب المنتجات والتسويق وتحليلها وتوسيع نطاقها. أخيرًا، يمكننا استخدام سلوك اختبار A/B المدمج في Firebase لمعرفة أي من النموذجين لدينا يحقق أداءً أفضل.
انتقل إلى التحليلات -> الأحداث في وحدة تحكم Firebase. إذا كان حدث correct_inference
ظاهرًا، فضع علامة عليه باعتباره "حدث تحويل"، وإذا لم يكن الأمر كذلك، فيمكنك الانتقال إلى Analytics -> أحداث التحويل والنقر على "إنشاء حدث تحويل جديد" وإدراج correct_inference.
انتقل الآن إلى "Remote Config" في وحدة تحكم Firebase، وحدد زر "اختبار A/B" من قائمة المزيد من الخيارات في المعلمة "model_name" التي أضفناها للتو.
في القائمة التالية، قم بقبول الاسم الافتراضي.
حدد تطبيقك من القائمة المنسدلة وقم بتغيير معايير الاستهداف إلى 50% من المستخدمين النشطين.
إذا تمكنت من تعيين حدث correct_inference
كتحويل سابقًا، فاستخدم هذا الحدث كمقياس أساسي لتتبعه. بخلاف ذلك، إذا كنت لا تريد الانتظار حتى يظهر الحدث في Analytics، فيمكنك إضافة correct_inference
manually
.
أخيرًا، في شاشة المتغيرات، قم بتعيين متغير مجموعة التحكم الخاصة بك لاستخدام mnist_v1
ومجموعة البديل A لاستخدام mnist_v2
.
انقر فوق الزر "مراجعة" في الزاوية اليمنى السفلية.
تهانينا، لقد نجحت في إنشاء اختبار أ/ب للنموذجين المنفصلين لديك! اختبار A/B حاليًا في حالة مسودة ويمكن البدء به في أي وقت بالنقر فوق الزر "بدء التجربة".
لإلقاء نظرة فاحصة على اختبار A/B، راجع وثائق اختبار A/B .
15. تهانينا!
في هذا الدرس التطبيقي حول التعليمات البرمجية، تعلمت كيفية استبدال أصول tflite المجمعة بشكل ثابت في تطبيقك بنموذج TFLite الذي تم تحميله ديناميكيًا من Firebase. لمعرفة المزيد حول TFLite وFirebase، قم بإلقاء نظرة على نماذج TFLite الأخرى وأدلة بدء استخدام Firebase.
ما قمنا بتغطيته
- TensorFlow لايت
- فايربيس مل
- تحليلات Firebase
- مراقبة أداء Firebase
- التكوين عن بعد لـ Firebase
- اختبار Firebase A/B
الخطوات التالية
- قم بتنفيذ Firebase ML Deployment في تطبيقك.