הוסף המלצות לאפליקציה שלך עם TensorFlow Lite ו-Firebase - iOS Codelab

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

ברוכים הבאים להמלצות עם TensorFlow Lite ומעבדת הקוד של Firebase. במעבדת קוד זה תלמד כיצד להשתמש ב-TensorFlow Lite וב-Firebase כדי לפרוס מודל המלצה לאפליקציה שלך. מעבד קוד זה מבוסס על דוגמה זו של TensorFlow Lite.

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

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

מה תלמד

  • שלב את Firebase Analytics באפליקציית אנדרואיד כדי לאסוף נתוני התנהגות משתמשים
  • ייצא את הנתונים האלה ל-Google Big Query
  • עבדו מראש את הנתונים והכשירו מודל המלצות TF Lite
  • פרוס את מודל TF Lite ב-Firebase ML וגשת אליו מהאפליקציה שלך
  • הפעל על הסקת מכשיר באמצעות המודל כדי להציע המלצות למשתמשים

מה אתה צריך

  • Xcode 11 (או יותר)
  • CocoaPods 1.9.1 (או יותר)

איך תשתמש במדריך זה?

קרא אותו רק עד הסוף קראו אותו והשלימו את התרגילים

איך תדרג את החוויה שלך בבניית אפליקציות ל-iOS?

טִירוֹן ביניים בקיא

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

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

  1. עבור אל מסוף Firebase .
  2. בחר צור פרויקט חדש ותן שם לפרויקט שלך "Firebase ML iOS Codelab".

3. קבל את הפרויקט לדוגמה

הורד את הקוד

התחל בשיבוט הפרויקט לדוגמה והפעלת pod update בספריית הפרויקט:

git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-ios.git
cd codelab-contentrecommendation-ios/start
pod install --repo-update

אם לא התקנת git, אתה יכול גם להוריד את הפרויקט לדוגמה מדף GitHub שלו או על ידי לחיצה על הקישור הזה . לאחר שהורדת את הפרויקט, הפעל אותו ב-Xcode ושחק עם ההמלצה כדי לקבל תחושה כיצד הוא עובד.

הגדר את Firebase

עקוב אחר התיעוד כדי ליצור פרויקט Firebase חדש. לאחר שקיבלת את הפרויקט שלך, הורד את קובץ GoogleService-Info.plist של הפרויקט ממסוף Firebase וגרור אותו לשורש פרויקט Xcode.

4a923d5c7ae0d8f3.png

הוסף את Firebase ל-Podfile שלך ​​והפעל את התקנת הפוד.

pod 'FirebaseAnalytics'
pod 'FirebaseMLModelDownloader', '9.3.0-beta'
pod 'TensorFlowLiteSwift'

בשיטת didFinishLaunchingWithOptions של AppDelegate שלך, ייבא את Firebase בחלק העליון של הקובץ

import FirebaseCore

והוסף קריאה כדי להגדיר את Firebase.

FirebaseApp.configure()

הפעל את הפרויקט שוב ​​כדי לוודא שהאפליקציה מוגדרת כהלכה ואינה קורסת בעת ההשקה.

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

4. הוסף את Firebase Analytics לאפליקציה

בשלב זה, תוסיף את Firebase Analytics לאפליקציה כדי לרשום נתוני התנהגות משתמשים (במקרה זה, אילו סרטים המשתמש אוהב). נתונים אלה ישמשו במצטבר בשלבים עתידיים כדי להכשיר את מודל ההמלצות.

הגדר את Firebase Analytics באפליקציה

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

הוסף את הקוד למטה כדי לרשום אירוע ניתוח כאשר המשתמש לוחץ כמו על סרט.

AllMoviesCollectionViewController.swift

import FirebaseAnalytics
//


override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//

if movie.liked == nil {
      movie.liked = true
      Analytics.logEvent(AnalyticsEventSelectItem, parameters: [AnalyticsParameterItemID: movie.id])
    } else {
      movie.liked?.toggle()
    }
       
}

5. בדוק את שילוב Analytics שלך

בשלב זה, ניצור אירועי Analytics באפליקציה ונוודא שהם נשלחים ל-Firebase Console.

הפעל רישום באגים של Analytics

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

כדי להפעיל מצב ניפוי באגים של Analytics במכשיר הפיתוח שלך, ציין את הארגומנט הבא של שורת הפקודה ב-Xcode:

-FIRDebugEnabled

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

אופציונלי: אשר אירועים של Analytics ב-Firebase Console

  1. עבור אל מסוף Firebase .
  2. בחר DebugView תחת Analytics
  3. ב-Xcode, בחר הפעל כדי להפעיל את האפליקציה ולהוסיף כמה סרטים לרשימת הלייקים שלך.
  4. ב-DebugView של קונסולת Firebase, ודא שהאירועים האלה נרשמים בזמן שאתה מוסיף סרטים באפליקציה.

6. ייצא נתוני Analytics ל-Big Query

Big Query הוא מוצר של Google Cloud המאפשר לך לבחון ולעבד כמויות גדולות של נתונים. בשלב זה, תחבר את פרויקט Firebase Console שלך ​​ל-Big Query כך שנתוני Analytics שנוצרו על ידי האפליקציה שלך ייצאו אוטומטית ל-Big Query.

אפשר ייצוא שאילתה גדולה

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

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

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

7. השתמש ב-BigQuery כדי להשיג נתוני אימון מודל

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

ייבא מערך נתונים לדוגמה לתוך BigQuery

  1. עבור אל לוח המחוונים של BigQuery במסוף הענן של Google.
  2. בחר את שם הפרויקט שלך בתפריט.
  3. בחר את שם הפרויקט שלך בתחתית הניווט הימני של BigQuery כדי לראות פרטים.
  4. בחר צור מערך נתונים כדי לפתוח את חלונית יצירת מערך הנתונים.
  5. הזן 'firebase_recommendations_dataset' עבור מזהה מערך הנתונים ובחר צור מערך נתונים .
  6. מערך הנתונים החדש יופיע בתפריט השמאלי מתחת לשם הפרויקט. לחץ עליו.
  7. בחר צור טבלה כדי לפתוח את חלונית יצירת הטבלה.
  8. עבור צור טבלה מתוך בחר 'אחסון בענן של Google'.
  9. בשדה Select file from GCS bucket , הזן 'gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
  10. בחר 'JSONL' בתפריט הנפתח של פורמט קובץ .
  11. הזן 'table_recommendations' עבור שם הטבלה .
  12. סמן את התיבה תחת סכימה > זיהוי אוטומטי > סכימה ופרמטרי קלט
  13. בחר צור טבלה

חקור מערך נתונים לדוגמה

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

  1. בחר firebase-recommendations-dataset בתפריט הימני כדי להרחיב את הטבלאות שהוא מכיל.
  2. בחר את טבלת ההמלצות כדי להציג את סכימת הטבלה.
  3. בחר תצוגה מקדימה כדי לראות את נתוני אירועי Analytics בפועל שהטבלה הזו מכילה.

צור אישורי חשבון שירות

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

  1. ודא שהחיוב מופעל עבור פרויקט Google Cloud שלך.
  2. הפעל את ממשקי API של BigQuery ו-BigQuery Storage API. < לחץ כאן >
  3. עבור לדף צור מפתח חשבון שירות .
  4. מרשימת חשבונות השירות , בחר חשבון שירות חדש .
  5. בשדה שם חשבון שירות , הזן שם.
  6. מרשימת התפקידים , בחר פרויקט > בעלים .
  7. לחץ על צור . קובץ JSON המכיל את הורדות המפתח שלך למחשב שלך.

בשלב הבא, נשתמש ב-Google Colab כדי לעבד מראש נתונים אלה ולהכשיר את מודל ההמלצות שלנו.

8. מעבד נתונים מראש ומודל המלצות הרכבת

בשלב זה, נשתמש במחברת Colab כדי לבצע את השלבים הבאים:

  1. לייבא את נתוני BigQuery למחברת Colab
  2. לעבד מראש את הנתונים כדי להכין אותם לאימון מודלים
  3. לאמן את מודל ההמלצות על נתוני הניתוח
  4. ייצא את הדגם כדגם TF lite
  5. לפרוס את המודל ל-Firebase Console כדי שנוכל להשתמש בו באפליקציה שלנו

לפני שנשיק את מחברת ההדרכה של Colab, תחילה נפעיל את ה-API לניהול מודלים של Firebase כך ש-Colab תוכל לפרוס את המודל המאומן בקונסולת Firebase שלנו.

אפשר Firebase Model Management API

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

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

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

19517c0d6d2aa14d.png

הפעל את Firebase ML API

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

השתמש במחברת Colab כדי לאמן ולפרוס את המודל

פתח את מחברת colab באמצעות הקישור הבא והשלם את השלבים שבתוכו. לאחר סיום השלבים במחברת Colab, יהיה לך קובץ דגם TF lite פרוס למסוף Firebase שנוכל לסנכרן עם האפליקציה שלנו.

פתוח ב-Colab

9. הורד את הדגם באפליקציה שלך

בשלב זה, נשנה את האפליקציה שלנו כדי להוריד את הדגם שאימנו זה עתה מ-Firebase Machine Learning.

הוסף תלות ב-Firebase ML

התלות הבאה נחוצה כדי להשתמש במודלים של Firebase Machine Learning באפליקציה שלך. זה כבר אמור להתווסף (אמת).

Podfile

import FirebaseCore
import FirebaseMLModelDownloader

הורד את הדגם עם Firebase Model Manager API

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

ModelLoader.swift

static func downloadModel(named name: String,
                            completion: @escaping (CustomModel?, DownloadError?) -> Void) {
    guard FirebaseApp.app() != nil else {
      completion(nil, .firebaseNotInitialized)
      return
    }
    guard success == nil && failure == nil else {
      completion(nil, .downloadInProgress)
      return
    }
    let conditions = ModelDownloadConditions(allowsCellularAccess: false)
    ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
            switch (result) {
            case .success(let customModel):
                    // Download complete.
                    // The CustomModel object contains the local path of the model file,
                    // which you can use to instantiate a TensorFlow Lite classifier.
                    return completion(customModel, nil)
            case .failure(let error):
                // Download was unsuccessful. Notify error message.
              completion(nil, .downloadFailed(underlyingError: error))
            }
    }
  }

10. שלב את מודל ההמלצה של Tensorflow Lite באפליקציה שלך

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

טען מילון ותוויות

התוויות המשמשות ליצירת מועמדי ההמלצות לפי מודל ההמלצות רשומות בקובץ sorted_movie_vocab.json בתיקיית הנכסים. העתק את הקוד הבא כדי לטעון את המועמדים הללו.

המלצותViewController.swift

  func getMovies() -> [MovieItem] {
    let barController = self.tabBarController as! TabBarController
    return barController.movies
  }

יישם עיבוד מקדים

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

המלצותViewController.swift

  // Given a list of selected items, preprocess to get tflite input.
  func preProcess() -> Data {
    let likedMovies = getLikedMovies().map { (MovieItem) -> Int32 in
      return MovieItem.id
    }
    var inputData = Data(copyingBufferOf: Array(likedMovies.prefix(10)))

    // Pad input data to have a minimum of 10 context items (4 bytes each)
    while inputData.count < 10*4 {
      inputData.append(0)
    }
    return inputData
  }

הפעל את המתורגמן כדי ליצור המלצות

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

המלצותViewController.swift

import TensorFlowLite

המלצותViewController.swift

 private var interpreter: Interpreter?

 func loadModel() {
    // Download the model from Firebase
    print("Fetching recommendations model...")
    ModelDownloader.fetchModel(named: "recommendations") { (filePath, error) in
      guard let path = filePath else {
        if let error = error {
          print(error)
        }
        return
      }
      print("Recommendations model download complete")
      self.loadInterpreter(path: path)
    }
  }

 func loadInterpreter(path: String) {
    do {
      interpreter = try Interpreter(modelPath: path)

      // Allocate memory for the model's input `Tensor`s.
      try interpreter?.allocateTensors()

      let inputData = preProcess()

      // Copy the input data to the input `Tensor`.
      try self.interpreter?.copy(inputData, toInputAt: 0)

      // Run inference by invoking the `Interpreter`.
      try self.interpreter?.invoke()

      // Get the output `Tensor`
      let confidenceOutputTensor = try self.interpreter?.output(at: 0)
      let idOutputTensor = try self.interpreter?.output(at: 1)

      // Copy output to `Data` to process the inference results.
      let confidenceOutputSize = confidenceOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})

      let idOutputSize = idOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})

      let confidenceResults =
        UnsafeMutableBufferPointer<Float32>.allocate(capacity: confidenceOutputSize!)
      let idResults =
        UnsafeMutableBufferPointer<Int32>.allocate(capacity: idOutputSize!)
      _ = confidenceOutputTensor?.data.copyBytes(to: confidenceResults)
      _ = idOutputTensor?.data.copyBytes(to: idResults)

      postProcess(idResults, confidenceResults)

      print("Successfully ran inference")
      DispatchQueue.main.async {
        self.tableView.reloadData()
      }
    } catch {
      print("Error occurred creating model interpreter: \(error)")
    }
  }

יישם עיבוד לאחר

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

המלצותViewController.swift

  // Postprocess to get results from tflite inference.
  func postProcess(_ idResults: UnsafeMutableBufferPointer<Int32>, _ confidenceResults: UnsafeMutableBufferPointer<Float32>) {
    for i in 0..<10 {
      let id = idResults[i]
      let movieIdx = getMovies().firstIndex { $0.id == id }
      let title = getMovies()[movieIdx!].title
      recommendations.append(Recommendation(title: title, confidence: confidenceResults[i]))
    }
  }

בדוק את האפליקציה שלך!

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

11. מזל טוב!

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

מה שכיסינו

  • Firebase ML
  • Firebase Analytics
  • ייצא אירועי ניתוח ל-BigQuery
  • טרום תהליכי ניתוח של אירועים
  • המלצות רכבת מודל TensorFlow
  • ייצא מודל ופריסה ל-Firebase Console
  • הגש המלצות על סרטים באפליקציה

הצעדים הבאים

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

למד עוד

יש שאלה?

דווח על בעיות