1. بررسی اجمالی
Firebase ML شما را قادر می سازد تا مدل خود را در هوا پخش کنید. این به شما امکان می دهد اندازه برنامه را کوچک نگه دارید و فقط در صورت نیاز مدل ML را دانلود کنید، چندین مدل را آزمایش کنید یا مدل ML خود را بدون نیاز به انتشار مجدد کل برنامه به روز کنید.
در این کد لبه شما یک برنامه اندروید را با استفاده از یک مدل TFLite ثابت به یک برنامه با استفاده از مدلی که به صورت پویا از Firebase ارائه می شود، تبدیل می کنید.
چیزی که یاد خواهید گرفت
- مدل های TFLite را در Firebase ML مستقر کنید و از برنامه خود به آنها دسترسی داشته باشید
- بازخورد کاربران را برای اندازهگیری دقت مدل با Firebase Analytics دنبال کنید
- عملکرد مدل نمایه از طریق Firebase Performance
- انتخاب کنید که کدام یک از چندین مدل مستقر شده از طریق Remote Config بارگیری شود
- مدل های مختلف را از طریق Firebase A/B Testing آزمایش کنید
آنچه شما نیاز دارید
- آخرین نسخه اندروید استودیو .
- کد نمونه
- یک دستگاه آزمایشی با Android نسخه 5.0 و بالاتر و خدمات Google Play نسخه 9.8 یا بالاتر، یا شبیه ساز با خدمات Google Play نسخه 9.8 یا بالاتر
- در صورت استفاده از دستگاه، کابل اتصال.
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را در ساخت برنامه های اندروید چگونه ارزیابی می کنید؟
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. برنامه استارتر را اجرا کنید
اکنون که پروژه را به اندروید استودیو وارد کرده اید، برای اولین بار آماده اجرای برنامه هستید. دستگاه اندروید خود را وصل کنید و روی Run کلیک کنید ( )در نوار ابزار Android Studio.
برنامه باید روی دستگاه شما راه اندازی شود. در این مرحله، اگر سعی کنید یک رقم بکشید، برنامه باید بتواند آن را تشخیص دهد.
5. پروژه کنسول Firebase را ایجاد کنید
Firebase را به پروژه اضافه کنید
- به کنسول Firebase بروید.
- افزودن پروژه را انتخاب کنید.
- نام پروژه را انتخاب یا وارد کنید.
- مراحل راهاندازی باقیمانده را در کنسول Firebase دنبال کنید، سپس روی ایجاد پروژه (یا افزودن Firebase، اگر از یک پروژه Google موجود استفاده میکنید) کلیک کنید.
6. Firebase را اضافه کنید
- از صفحه نمای کلی پروژه جدید خود، روی نماد Android کلیک کنید تا گردش کار راه اندازی شود.
- نام بسته کد لبه را وارد کنید:
org.tensorflow.lite.examples.digitclassifier
فایل google-services.json را به برنامه خود اضافه کنید
پس از ثبت نام بسته و انتخاب Next، روی Download google-services.json کلیک کنید تا فایل پیکربندی Android Firebase خود را دریافت کنید و سپس فایل google-services.json را در فهرست app
در پروژه خود کپی کنید. پس از دانلود فایل، می توانید مراحل بعدی نشان داده شده در کنسول را رد کنید (آنها قبلاً برای شما در پروژه build-android-start انجام شده اند).
افزونه google-services را به برنامه خود اضافه کنید
افزونه 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 خود در پروژه اضافه کنید:
project/build.gradle.kts
id("com.google.gms.google-services") version "4.3.15" apply false
پروژه خود را با فایل های gradle همگام سازی کنید
برای اطمینان از اینکه همه وابستگی ها برای برنامه شما در دسترس هستند، باید پروژه خود را با فایل های gradle در این مرحله همگام کنید. File > Sync Project with Gradle Files را از نوار ابزار Android Studio انتخاب کنید.
7. برنامه را با Firebase اجرا کنید
اکنون که افزونه google-services
را با فایل JSON خود پیکربندی کرده اید، آماده اجرای برنامه با Firebase هستید. دستگاه اندروید خود را وصل کنید و روی Run کلیک کنید ( )در نوار ابزار Android Studio.
برنامه باید روی دستگاه شما راه اندازی شود. در این مرحله، برنامه شما همچنان باید با موفقیت ساخته شود.
8. یک مدل را در Firebase ML مستقر کنید
استقرار یک مدل در Firebase ML به دو دلیل اصلی مفید است:
- ما می توانیم اندازه نصب برنامه را کوچک نگه داریم و فقط در صورت نیاز مدل را دانلود کنیم
- مدل را می توان به طور منظم و با چرخه انتشار متفاوت از کل برنامه به روز کرد
قبل از اینکه بتوانیم مدل ایستا را در برنامه خود با یک مدل بارگیری پویا از Firebase جایگزین کنیم، باید آن را در Firebase ML مستقر کنیم. این مدل را می توان از طریق کنسول یا به صورت برنامه نویسی با استفاده از Firebase Admin SDK مستقر کرد. در این مرحله از طریق کنسول مستقر میشویم.
برای ساده نگه داشتن کارها، از مدل TensorFlow Lite استفاده می کنیم که از قبل در برنامه ما وجود دارد. ابتدا کنسول Firebase را باز کنید و روی Machine Learning در پنل ناوبری سمت چپ کلیک کنید. اگر برای اولین بار این را باز می کنید، روی «شروع به کار» کلیک کنید. سپس به "Custom" بروید و روی دکمه "Add custom model" کلیک کنید.
هنگامی که از شما خواسته شد، یک نام توصیفی مانند mnist_v1
به مدل بدهید و فایل را از فهرست راهنمای پروژه codelab در زیر start/app/src/main/assets/mnist.tflite
آپلود کنید. سپس می توانید این فایل مدل TF Lite را از پروژه اندروید حذف کنید.
9. مدل را از Firebase ML دانلود کنید
انتخاب زمان دانلود مدل از راه دور از Firebase در برنامه شما می تواند مشکل باشد زیرا مدل های TFLite می توانند نسبتاً بزرگ شوند. در حالت ایدهآل، میخواهیم از بارگیری مدل بلافاصله هنگام راهاندازی برنامه جلوگیری کنیم، زیرا اگر مدل ما فقط برای یک ویژگی استفاده شود و کاربر هرگز از آن ویژگی استفاده نکند، بدون دلیل حجم قابل توجهی از دادهها را دانلود کردهایم. همچنین میتوانیم گزینههای دانلود مانند واکشی مدلها را هنگام اتصال به وایفای تنظیم کنیم. اگر میخواهید مطمئن شوید که مدل حتی بدون اتصال به شبکه نیز در دسترس است، مهم است که آن را بدون برنامه بهعنوان پشتیبان نیز همراه کنید.
برای سادگی، مدل پیشفرض همراه را حذف میکنیم و همیشه با شروع برنامه، مدلی را از 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 راهی را برای شما فراهم می کند تا بفهمید کاربران چگونه در برنامه شما حرکت می کنند، کجا موفق می شوند و کجا گیر می کنند و به عقب برمی گردند. همچنین می توان از آن برای درک قسمت های پرکاربرد برنامه خود استفاده کرد.
ما دقت مدل را با ردیابی بازخورد کاربران در مورد پیشبینیهای مدل اندازهگیری میکنیم. اگر کاربر روی "YES" کلیک کند، نشان می دهد که پیش بینی دقیق بوده است.
ما می توانیم یک رویداد 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
شنونده onclick را برای ثبت رویداد correct_inference
روی Firebase تنظیم می کنیم.
MainActivity.kt (onCreate)
// Setup YES button
yesButton?.setOnClickListener {
Firebase.analytics.logEvent("correct_inference", null)
}
دوباره برنامه را اجرا کنید و یک رقم بکشید. دکمه «بله» را چند بار فشار دهید تا بازخورد درستی استنباط ارسال شود.
تجزیه و تحلیل اشکال زدایی
به طور کلی، رویدادهای ثبتشده توسط برنامه شما در مدت تقریباً یک ساعت با هم جمع میشوند و با هم آپلود میشوند. این رویکرد باعث صرفه جویی در باتری دستگاه های کاربران نهایی و کاهش مصرف داده های شبکه می شود. با این حال، به منظور تأیید اجرای تجزیه و تحلیل خود (و برای مشاهده تجزیه و تحلیل خود در گزارش DebugView)، می توانید حالت Debug را در دستگاه توسعه خود فعال کنید تا رویدادها را با حداقل تاخیر بارگذاری کند.
برای فعال کردن حالت Analytics Debug در دستگاه اندرویدی، دستورات زیر را اجرا کنید:
adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier
دوباره برنامه را اجرا کنید و یک رقم بکشید. دکمه «بله» را چند بار فشار دهید تا بازخورد درستی استنباط ارسال شود. اکنون می توانید رویدادهای گزارش را در زمان واقعی از طریق نمای اشکال زدایی در کنسول Firebase مشاهده کنید. روی Analytics > DebugView از نوار ناوبری سمت چپ کلیک کنید.
11. عملکرد مدل را تجزیه و تحلیل کنید
Firebase Performance Monitoring سرویسی است که به شما کمک می کند تا در مورد ویژگی های عملکرد iOS، Android و برنامه های وب خود اطلاعاتی کسب کنید.
شما از Performance Monitoring SDK برای جمعآوری دادههای عملکرد از برنامه خود استفاده میکنید، سپس آن دادهها را در کنسول Firebase بررسی و تجزیه و تحلیل میکنید. نظارت بر عملکرد به شما کمک می کند تا بفهمید عملکرد برنامه شما کجا و چه زمانی می تواند بهبود یابد تا بتوانید از آن اطلاعات برای رفع مشکلات عملکرد استفاده کنید.
در اینجا ما ردیابی perf را در اطراف استنتاج و دانلود اضافه می کنیم
این مهم است، زیرا مدلهای بزرگتر مورد استفاده در یادگیری عمیق، پتانسیل دقیقتر بودن را دارند، اما همچنین ممکن است زمان بیشتری طول بکشد تا پاسخ را برگردانند. در آزمایش خود ما در تلاش هستیم تا تعادل مناسب بین دقت و سرعت را پیدا کنیم.
وابستگی Firebase Performance را اضافه کنید
project/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 جدید ایجاد کنید و درست قبل از دانلود مدل آن را شروع کنید. سپس یک شنونده موفق اضافه کنید که ردیابی را متوقف می کند.
در تابع 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 Model Management API را فعال کنید
در این مرحله، API مدیریت مدل Firebase را فعال میکنیم تا نسخه جدیدی از مدل TensorFlow Lite را با استفاده از کد پایتون اجرا کند.
یک سطل برای ذخیره مدل های ML خود ایجاد کنید
در کنسول Firebase خود، به Storage بروید و روی شروع کار کلیک کنید.
گفتگو را دنبال کنید تا سطل خود را راه اندازی کنید.
Firebase ML API را فعال کنید
به صفحه Firebase ML API در Google Cloud Console بروید و روی Enable کلیک کنید.
در صورت درخواست، برنامه Digit Classifier را انتخاب کنید.
یک مدل جدید آموزش دهید و در Firebase ML منتشر کنید
اکنون نسخه جدیدی از مدل را با استفاده از مجموعه داده بزرگتر آموزش خواهیم داد و سپس آن را به صورت برنامه نویسی مستقیماً از نوت بوک آموزشی با استفاده از Firebase Admin SDK اجرا خواهیم کرد.
کلید خصوصی را برای حساب سرویس بارگیری کنید
قبل از اینکه بتوانیم از Firebase Admin SDK استفاده کنیم، باید یک حساب سرویس ایجاد کنیم. با کلیک بر روی این لینک ، پنل Service Accounts کنسول Firebase را باز کنید و روی دکمه ایجاد یک حساب سرویس جدید برای Firebase Admin SDK کلیک کنید. وقتی از شما خواسته شد، روی دکمه Generate New Private Key کلیک کنید. ما از کلید حساب سرویس برای احراز هویت درخواستهایمان از دفترچه یادداشت colab استفاده میکنیم.
اکنون می توانیم مدل جدید را آموزش و اجرا کنیم.
- این دفترچه یادداشت colab را باز کنید و یک کپی از آن در Drive خودتان تهیه کنید.
- با کلیک بر روی دکمه پخش در سمت چپ آن، اولین سلول "Train an advanced TensorFlow Lite model" را اجرا کنید. این یک مدل جدید را آموزش می دهد و ممکن است کمی طول بکشد.
- اجرای سلول دوم، یک اعلان آپلود فایل ایجاد می کند. هنگام ایجاد حساب سرویس خود، فایل json را که از کنسول Firebase دانلود کرده اید آپلود کنید.
- دو سلول آخر را اجرا کنید.
پس از اجرای نوت بوک colab، باید مدل دوم را در کنسول Firebase مشاهده کنید. مطمئن شوید که مدل دوم mnist_v2
نام دارد.
13. یک مدل را از طریق Remote Config انتخاب کنید
اکنون که دو مدل مجزا داریم، یک پارامتر برای انتخاب مدلی که در زمان اجرا دانلود کنیم اضافه می کنیم. مقدار پارامتری که مشتری دریافت می کند تعیین می کند که مشتری کدام مدل را دانلود کند.
قوانین پیکربندی را در کنسول Firebase اضافه کنید
ابتدا کنسول Firebase را باز کرده و روی دکمه Remote Config در منوی ناوبری سمت چپ کلیک کنید. سپس بر روی دکمه "افزودن پارامتر" کلیک کنید.
پارامتر جدید را model_name
نامگذاری کنید و مقدار پیش فرض "mnist_v1"
را به آن بدهید. با قرار دادن نام مدل در پارامتر remote config، میتوانیم چندین مدل را بدون افزودن پارامتر جدید برای هر مدلی که میخواهیم آزمایش کنیم، آزمایش کنیم. برای اعمال بهروزرسانیها، روی انتشار تغییرات کلیک کنید.
وابستگی 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 برگردید، مقدار پیشفرض را به mnist_v2 تغییر دهید و برای اعمال بهروزرسانیها، Publish Changes را انتخاب کنید.
- برنامه را مجددا راه اندازی کنید و بررسی کنید تا پیام Toast را ببینید که مدل mnist_v2 این بار دانلود شده است.
14. اثربخشی مدل تست A/B
Firebase A/B Testing به شما کمک میکند تا با آسانکردن اجرای، تجزیه و تحلیل و مقیاسبندی آزمایشهای محصول و بازاریابی، تجربه برنامه خود را بهینه کنید. در نهایت، میتوانیم از رفتار تست A/B داخلی Firebase استفاده کنیم تا ببینیم کدام یک از دو مدل ما عملکرد بهتری دارند.
به Analytics -> Events در کنسول Firebase بروید. اگر رویداد correct_inference
نشان داده میشود، آن را بهعنوان «رویداد تبدیل» علامتگذاری کنید، اگر نه، میتوانید به Analytics -> رویدادهای تبدیل بروید و روی «ایجاد یک رویداد تبدیل جدید» کلیک کنید و correct_inference.
اکنون به "Remote Config در کنسول Firebase" بروید، دکمه "A/B test" را از منوی گزینه های بیشتر در پارامتر "model_name" که به تازگی اضافه کردیم، انتخاب کنید.
در منوی زیر، نام پیش فرض را بپذیرید.
برنامه خود را در منوی کشویی انتخاب کنید و معیارهای هدف را به 50 درصد از کاربران فعال تغییر دهید.
اگر قبلاً توانستید رویداد correct_inference
را به عنوان تبدیل تنظیم کنید، از این رویداد به عنوان معیار اصلی برای ردیابی استفاده کنید. در غیر این صورت، اگر نمیخواهید منتظر بمانید تا رویداد در Analytics نشان داده شود، میتوانید correct_inference
manually
اضافه کنید.
در نهایت، در صفحه Variants، نوع گروه کنترل خود را برای استفاده از mnist_v1
و گروه Variant A خود را برای استفاده از mnist_v2
تنظیم کنید.
روی دکمه Review در گوشه سمت راست پایین کلیک کنید.
تبریک می گویم، شما با موفقیت یک تست A/B برای دو مدل جداگانه خود ایجاد کردید! تست A/B در حال حاضر در حالت پیشنویس است و میتواند در هر زمان با کلیک کردن روی دکمه "شروع آزمایش" شروع شود.
برای نگاهی دقیق تر به تست A/B، مستندات تست A/B را بررسی کنید.
15. تبریک می گویم!
در این کد لبه، یاد گرفتید که چگونه یک دارایی tflite با بستهبندی ثابت را در برنامه خود با یک مدل TFLite بارگذاری شده پویا از Firebase جایگزین کنید. برای کسب اطلاعات بیشتر در مورد TFLite و Firebase، به سایر نمونه های TFLite و راهنمای شروع Firebase نگاهی بیندازید.
آنچه را پوشش داده ایم
- TensorFlow Lite
- Firebase ML
- تجزیه و تحلیل Firebase
- نظارت بر عملکرد Firebase
- Firebase Remote Config
- تست Firebase A/B
مراحل بعدی
- Firebase ML Deployment را در برنامه خود پیاده کنید.