הוסף את Firebase לאפליקציית Android המופעלת על ידי TFLite

1. סקירה כללית

cd824ecfd05a2822.png

Firebase ML מאפשר לך לפרוס את הדגם שלך באוויר. זה מאפשר לך לשמור על גודל האפליקציה קטן ולהוריד רק את מודל ה-ML בעת הצורך, להתנסות במספר דגמים, או לעדכן את מודל ה-ML שלך מבלי שתצטרך לפרסם מחדש את האפליקציה כולה.

במעבדת קוד זה תמיר אפליקציית אנדרואיד באמצעות מודל TFLite סטטי לאפליקציה באמצעות מודל המוגש באופן דינמי מ-Firebase.

מה תלמד

  • פרוס דגמי TFLite ל-Firebase ML וגשת אליהם מהאפליקציה שלך
  • עקוב אחר משוב משתמשים כדי למדוד את דיוק המודל עם Firebase Analytics
  • ביצועי מודל פרופיל באמצעות Firebase Performance
  • בחר איזה מהדגמים הפרוסים מרובים נטען דרך Remote Config
  • ניסוי עם דגמים שונים באמצעות Firebase A/B Testing

מה אתה צריך

  • גרסת Android Studio האחרונה.
  • קוד לדוגמה.
  • מכשיר בדיקה עם 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 ( android_studio_folder.png ) מהורדת קוד לדוגמה ( קובץ > פתח > .../codelab-digitclassifier-android/start).

כעת אתה אמור לפתוח את פרויקט ההתחלה ב-Android Studio.

4. הפעל את אפליקציית המתנע

כעת, לאחר שייבאת את הפרויקט לאנדרואיד Studio, אתה מוכן להפעיל את האפליקציה בפעם הראשונה. חבר את מכשיר האנדרואיד שלך ולחץ על הפעל ( execute.png ) בסרגל הכלים של Android Studio.

האפליקציה אמורה להפעיל במכשיר שלך. בשלב זה, אם תנסה לצייר ספרה, האפליקציה אמורה להיות מסוגלת לזהות אותה.

6e36e1b947b395f2.png

5. צור פרוייקט מסוף Firebase

הוסף את Firebase לפרויקט

  1. עבור אל מסוף Firebase .
  2. בחר הוסף פרויקט .
  3. בחר או הזן שם פרויקט.
  4. בצע את שלבי ההגדרה הנותרים במסוף Firebase, ולאחר מכן לחץ על צור פרויקט (או הוסף Firebase, אם אתה משתמש בפרויקט קיים של Google).

6. הוסף את Firebase

  1. ממסך הסקירה הכללית של הפרויקט החדש שלך, לחץ על סמל אנדרואיד כדי להפעיל את זרימת העבודה של ההגדרה.
  2. הזן את שם החבילה של מעבדת הקוד: org.tensorflow.lite.examples.digitclassifier

הוסף קובץ google-services.json לאפליקציה שלך

לאחר רישום שם החבילה ובחירה באפשרות הבא, לחץ על הורד את google-services.json כדי להשיג את קובץ התצורה של Firebase Android ולאחר מכן העתק את הקובץ 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 בשלב זה. בחר קובץ > סנכרן פרויקט עם קבצי Gradle מסרגל הכלים של Android Studio.

7. הפעל את האפליקציה עם Firebase

כעת, לאחר שהגדרת את התוסף google-services עם קובץ ה-JSON שלך, אתה מוכן להפעיל את האפליקציה עם Firebase. חבר את מכשיר האנדרואיד שלך ולחץ על הפעל ( execute.png ) בסרגל הכלים של Android Studio.

האפליקציה אמורה להפעיל במכשיר שלך. בשלב זה, האפליקציה שלך עדיין צריכה להיבנות בהצלחה.

8. פרוס מודל ל-Firebase ML

פריסת מודל ל-Firebase ML שימושית משתי סיבות עיקריות:

  1. אנחנו יכולים לשמור על גודל התקנת האפליקציה קטן ולהוריד את הדגם רק במידת הצורך
  2. ניתן לעדכן את הדגם באופן שוטף ועם מחזור שחרור שונה מכל האפליקציה

לפני שנוכל להחליף את המודל הסטטי באפליקציה שלנו במודל שהורד באופן דינמי מ-Firebase, עלינו לפרוס אותו ל-Firebase ML. ניתן לפרוס את המודל דרך המסוף, או פרוגרמטית, באמצעות Firebase Admin SDK. בשלב זה נפרוס דרך המסוף.

כדי שהדברים יהיו פשוטים, נשתמש במודל TensorFlow Lite שכבר נמצא באפליקציה שלנו. ראשית, פתח את מסוף Firebase ולחץ על Machine Learning בחלונית הניווט השמאלית. לחץ על 'התחל' אם אתה פותח את הפעם הראשונה. לאחר מכן נווט אל "מותאם אישית" ולחץ על כפתור "הוסף דגם מותאם אישית".

כאשר תתבקש, תן לדגם שם תיאורי כמו mnist_v1 והעלה את הקובץ מספריית פרויקט codelab תחת start/app/src/main/assets/mnist.tflite . אז אתה יכול למחוק את הקובץ הזה מדגם TF Lite מפרויקט אנדרואיד.

3c3c50e6ef12b3b.png

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 נגדיר את המאזין onclick להתחבר לאירוע correct_inference ל-Firebase.

MainActivity.kt (onCreate)

// Setup YES button
yesButton?.setOnClickListener {
  Firebase.analytics.logEvent("correct_inference", null)
}

הפעל שוב את האפליקציה וצייר ספרה. לחץ על כפתור "כן" מספר פעמים כדי לשלוח משוב שהמסק היה מדויק.

ניתוח באגים

בדרך כלל, אירועים שנרשמו על ידי האפליקציה שלך נקבצים יחדיו על פני תקופה של כשעה אחת ומועלים יחד. גישה זו חוסכת את הסוללה במכשירי משתמשי הקצה ומפחיתה את השימוש בנתוני הרשת. עם זאת, למטרות אימות הטמעת הניתוח שלך (וכדי להציג את הניתוח שלך בדוח DebugView), אתה יכול להפעיל את מצב Debug במכשיר הפיתוח שלך כדי להעלות אירועים בהשהייה מינימלית.

כדי להפעיל את מצב ניפוי באגים של Analytics במכשיר אנדרואיד, בצע את הפקודות הבאות:

adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier

הפעל שוב את האפליקציה וצייר ספרה. לחץ על כפתור "כן" מספר פעמים כדי לשלוח משוב שהמסק היה מדויק. כעת תוכל להציג את אירועי היומן כמעט בזמן אמת דרך תצוגת ניפוי הבאגים במסוף Firebase. לחץ על Analytics > DebugView בסרגל הניווט הימני.

5276199a086721fd.png

11. נתח את הביצועים של המודל

ניטור ביצועים של Firebase הוא שירות שעוזר לך לקבל תובנות לגבי מאפייני הביצועים של יישומי iOS, אנדרואיד ואינטרנט שלך.

אתה משתמש ב-SDK לניטור ביצועים כדי לאסוף נתוני ביצועים מהאפליקציה שלך, ולאחר מכן לבדוק ולנתח את הנתונים האלה במסוף Firebase. ניטור ביצועים עוזר לך להבין היכן ומתי ניתן לשפר את הביצועים של האפליקציה שלך, כך שתוכל להשתמש במידע זה כדי לתקן בעיות ביצועים.

כאן אנו מוסיפים עקבות ביצועים סביב מסקנות והורדה

זה חשוב מכיוון שלמודלים גדולים יותר המשמשים בלמידה עמוקה יש פוטנציאל להיות מדויקים יותר, אך הם יכולים גם לקחת זמן רב יותר להחזיר תגובה. בניסוי שלנו אנו מנסים למצוא את האיזון הנכון בין דיוק ומהירות.

הוסף תלות בביצועי Firebase

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)
        }
    }
  }

הצג הודעות יומן עבור אירועי ביצועים

  1. אפשר רישום באגים עבור ניטור ביצועים בזמן הבנייה על ידי הוספת רכיב <meta-data> לקובץ AndroidManifest.xml של האפליקציה שלך, כך:

AndroidManifest.xml

<application>
    <meta-data
      android:name="firebase_performance_logcat_enabled"
      android:value="true" />
</application>
  1. בדוק את הודעות היומן שלך עבור הודעות שגיאה.
  2. ניטור ביצועים מתייג את הודעות היומן שלו באמצעות FirebasePerformance . באמצעות סינון logcat, אתה יכול להציג ספציפית מעקב אחר משך ורישום בקשות רשת HTTP/S על ידי הפעלת הפקודה הבאה:
adb logcat -s FirebasePerformance
  1. בדוק את סוגי היומנים הבאים שמציינים שניטור ביצועים רושם אירועי ביצועים:
  • Logging TraceMetric
  • Logging NetworkRequestMetric

12. פרוס מודל שני ל-Firebase ML

כשממציאים גרסה חדשה של המודל שלך, כמו אחת עם ארכיטקטורת מודל טובה יותר או גרסה שהוכשרה על מערך נתונים גדול יותר או מעודכן, אנו עשויים להתפתות להחליף את המודל הנוכחי שלנו בגרסה החדשה. עם זאת, מודל עם ביצועים טובים בבדיקה לא בהכרח מתפקד באותה מידה בייצור. לכן, בואו נעשה בדיקות A/B בייצור כדי להשוות את הדגם המקורי שלנו לדגם החדש.

אפשר Firebase Model Management API

בשלב זה, נאפשר ל-API לניהול מודלים של Firebase לפרוס גרסה חדשה של מודל TensorFlow Lite שלנו באמצעות קוד Python.

צור דלי לאחסון דגמי ה-ML שלך

במסוף Firebase שלך, עבור אל אחסון ולחץ על התחל. fbbea78f0eb3dc9f.png

עקוב אחר הדיאלוג כדי להגדיר את הדלי שלך.

19517c0d6d2aa14d.png

הפעל את Firebase ML API

עבור לדף Firebase ML API ב-Google Cloud Console ולחץ על הפעל.

2414fd5cced6c984.png בחר את אפליקציית Digit Classifier כאשר תתבקש.

אימון דגם חדש ופרסם ל-Firebase ML

כעת נאמן גרסה חדשה של המודל באמצעות מערך נתונים גדול יותר, ולאחר מכן נפרוס אותו באופן תוכניתי ישירות ממחברת ההדרכה באמצעות Firebase Admin SDK.

הורד את המפתח הפרטי עבור חשבון השירות

לפני שנוכל להשתמש ב-Firebase Admin SDK, נצטרך ליצור חשבון שירות. פתח את החלונית חשבונות שירות של מסוף Firebase על ידי לחיצה על קישור זה ולחץ על הלחצן כדי ליצור חשבון שירות חדש עבור Firebase Admin SDK. כאשר תתבקש, לחץ על הלחצן צור מפתח פרטי חדש. נשתמש במפתח חשבון השירות לאימות הבקשות שלנו מהמחברת של colab.

c3b95de1e5508516.png

כעת נוכל לאמן ולפרוס את המודל החדש.

  1. פתח את מחברת ה-Colab הזו וצור עותק שלה ב-Drive שלך.
  2. הפעל את התא הראשון "אימון מודל TensorFlow Lite משופר" על ידי לחיצה על כפתור ההפעלה משמאל לו. פעולה זו תכשיר דגם חדש ועשויה לקחת זמן מה.
  3. הפעלת התא השני תיצור הנחיה להעלאת קובץ. העלה את קובץ ה-json שהורדת מ-Firebase Console בעת יצירת חשבון השירות שלך.

71e847c6a85423b3.png

  1. הפעל את שני התאים האחרונים.

לאחר הפעלת המחברת של colab, אתה אמור לראות דגם שני במסוף Firebase. ודא שהדגם השני נקרא mnist_v2 .

c316683bb4d75d57.png

13. בחר דגם באמצעות Remote Config

כעת, כשיש לנו שני דגמים נפרדים, נוסיף פרמטר לבחירת הדגם להוריד בזמן הריצה. הערך של הפרמטר שהלקוח יקבל יקבע איזה דגם הלקוח מוריד.

הוסף כללי תצורה במסוף Firebase

ראשית, פתח את מסוף Firebase ולחץ על כפתור Remote Config בתפריט הניווט השמאלי. לאחר מכן, לחץ על כפתור "הוסף פרמטר".

תן שם לפרמטר החדש model_name ותן לו ערך ברירת מחדל של "mnist_v1" . על ידי הכנסת שם הדגם בפרמטר התצורה המרוחקת, נוכל לבדוק מספר דגמים מבלי להוסיף פרמטר חדש עבור כל דגם שאנו רוצים לבדוק. לחץ על פרסם שינויים כדי להחיל את העדכונים.

2949cb95c7214ca4.png

הוסף תלות של 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.")
        }
      }
  }

בדוק תצורה מרחוק

  1. לחץ על 98205811bbed9d74.png כפתור הפעלה .
  2. בדוק שאתה רואה את הודעת Toast שהורדת דגם mnist_v1.
  3. חזור אל Firebase Console, שנה את ערך ברירת המחדל ל-mnist_v2 ובחר פרסם שינויים כדי להחיל את העדכונים.
  4. הפעל מחדש את האפליקציה ובדוק לראות את הודעת ה-Toast שדגם mnist_v2 הורד הפעם.

14. יעילות מודל מבחן A/B

בדיקת A/B של Firebase עוזרת לך לייעל את חוויית האפליקציה שלך על ידי כך שהיא קלה להפעיל, לנתח ולהרחיב ניסויים במוצר ושיווק. לבסוף, אנו יכולים להשתמש בהתנהגות A/B Testing המובנית של Firebase כדי לראות איזה משני הדגמים שלנו מניב ביצועים טובים יותר.

עבור אל Analytics -> אירועים במסוף Firebase. אם אירוע correct_inference מופיע, סמן אותו כ"אירוע המרה", אם לא, אתה יכול ללכת ל-Analytics -> אירועי המרה וללחוץ על "צור אירוע המרה חדש" ולשים את correct_inference.

כעת עבור אל "תצורה מרחוק במסוף Firebase, בחר את כפתור "A/B test" מתפריט אפשרויות נוספות בפרמטר "model_name" שזה עתה הוספנו.

fad5ea36969d2aeb.png

בתפריט שלאחר מכן, קבל את שם ברירת המחדל.

d7c006669ace6e40.png

בחר את האפליקציה שלך בתפריט הנפתח ושנה את קריטריוני המיקוד ל-50% מהמשתמשים הפעילים.

cb72dcc7d2666bd3.png

אם הצלחת להגדיר את אירוע correct_inference כהמרה קודם לכן, השתמש באירוע זה כמדד העיקרי למעקב. אחרת, אם אינך רוצה לחכות עד שהאירוע יופיע ב-Analytics, תוכל להוסיף correct_inference manually .

1ac9c94fb3159271.png

לבסוף, במסך וריאנטים, הגדר את וריאנט קבוצת הבקרה שלך לשימוש mnist_v1 ואת קבוצת וריאנט A שלך להשתמש mnist_v2 .

e4510434f8da31b6.png

לחץ על כפתור סקירה בפינה השמאלית התחתונה.

מזל טוב, יצרת בהצלחה מבחן A/B עבור שני הדגמים הנפרדים שלך! בדיקת A/B נמצאת כעת במצב טיוטה וניתן להתחיל אותה בכל עת על ידי לחיצה על כפתור "התחל ניסוי".

למבט מקרוב על בדיקות A/B, עיין בתיעוד A/B Testing .

15. מזל טוב!

במעבדת הקוד הזה, למדת כיצד להחליף נכס tflite מאגד סטטי באפליקציה שלך במודל TFLite נטען דינמית מ-Firebase. למידע נוסף על TFLite ו-Firebase, עיין בדוגמאות אחרות של TFLite ובמדריכי ההתחלה של Firebase.

מה שכיסינו

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • ניטור ביצועי Firebase
  • תצורה מרחוק של Firebase
  • בדיקת A/B של Firebase

הצעדים הבאים

  • הטמעת Firebase ML Deployment באפליקציה שלך.

למד עוד

יש שאלה?

דווח על בעיות