Fügen Sie Empfehlungen zu Ihrer App mit TensorFlow Lite und Firebase – iOS Codelab hinzu

1. Übersicht

Willkommen bei den Empfehlungen mit TensorFlow Lite und Firebase Codelab. In diesem Codelab erfahren Sie, wie Sie mit TensorFlow Lite und Firebase ein Empfehlungsmodell für Ihre App bereitstellen. Dieses Codelab basiert auf diesem TensorFlow Lite- Beispiel .

Empfehlungen ermöglichen es Apps, maschinelles Lernen zu nutzen, um jedem Benutzer auf intelligente Weise die relevantesten Inhalte bereitzustellen. Sie berücksichtigen früheres Benutzerverhalten, um App-Inhalte vorzuschlagen, mit denen der Benutzer in Zukunft möglicherweise interagieren möchte, indem sie ein Modell verwenden, das auf dem Gesamtverhalten einer großen Anzahl anderer Benutzer trainiert wurde.

In diesem Tutorial erfahren Sie, wie Sie mit Firebase Analytics Daten von den Benutzern Ihrer App erhalten, ein maschinelles Lernmodell für Empfehlungen aus diesen Daten erstellen und dieses Modell dann in einer iOS-App verwenden, um Inferenzen auszuführen und Empfehlungen zu erhalten. Unsere Empfehlungen schlagen insbesondere vor, welche Filme ein Benutzer angesichts der Liste der Filme, die ihm zuvor gefallen haben, am wahrscheinlichsten ansehen würde.

Was Sie lernen werden

  • Integrieren Sie Firebase Analytics in eine Android-App, um Daten zum Benutzerverhalten zu sammeln
  • Exportieren Sie diese Daten in Google Big Query
  • Verarbeiten Sie die Daten vor und trainieren Sie ein TF Lite-Empfehlungsmodell
  • Stellen Sie das TF Lite-Modell in Firebase ML bereit und greifen Sie über Ihre App darauf zu
  • Führen Sie die Geräteinferenz mithilfe des Modells aus, um Benutzern Empfehlungen vorzuschlagen

Was du brauchen wirst

  • Xcode 11 (oder höher)
  • CocoaPods 1.9.1 (oder höher)

Wie werden Sie dieses Tutorial nutzen?

Lesen Sie es nur durch Lesen Sie es und absolvieren Sie die Übungen

Wie würden Sie Ihre Erfahrungen mit der Erstellung von iOS-Apps bewerten?

Anfänger Dazwischenliegend Kompetent

2. Erstellen Sie ein Firebase-Konsolenprojekt

Fügen Sie Firebase zum Projekt hinzu

  1. Gehen Sie zur Firebase-Konsole .
  2. Wählen Sie „Neues Projekt erstellen“ und nennen Sie Ihr Projekt „Firebase ML iOS Codelab“.

3. Holen Sie sich das Beispielprojekt

Laden Sie den Code herunter

Klonen Sie zunächst das Beispielprojekt und führen Sie pod update im Projektverzeichnis aus:

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

Wenn Sie Git nicht installiert haben, können Sie das Beispielprojekt auch von der GitHub-Seite herunterladen oder auf diesen Link klicken. Nachdem Sie das Projekt heruntergeladen haben, führen Sie es in Xcode aus und experimentieren Sie mit der Empfehlung, um ein Gefühl dafür zu bekommen, wie es funktioniert.

Richten Sie Firebase ein

Befolgen Sie die Dokumentation , um ein neues Firebase-Projekt zu erstellen. Sobald Sie Ihr Projekt erhalten haben, laden Sie die Datei GoogleService-Info.plist Ihres Projekts von der Firebase-Konsole herunter und ziehen Sie sie in das Stammverzeichnis des Xcode-Projekts.

4a923d5c7ae0d8f3.png

Fügen Sie Firebase zu Ihrer Pod-Datei hinzu und führen Sie die Pod-Installation aus.

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

Importieren Sie Firebase in der didFinishLaunchingWithOptions -Methode Ihrer AppDelegate am Anfang der Datei

import FirebaseCore

Und fügen Sie einen Aufruf hinzu, um Firebase zu konfigurieren.

FirebaseApp.configure()

Führen Sie das Projekt erneut aus, um sicherzustellen, dass die App richtig konfiguriert ist und beim Start nicht abstürzt.

  1. Stellen Sie sicher, dass „Google Analytics für dieses Projekt aktivieren“ aktiviert ist.
  2. Befolgen Sie die verbleibenden Einrichtungsschritte in der Firebase-Konsole und klicken Sie dann auf Projekt erstellen (oder Firebase hinzufügen, wenn Sie ein vorhandenes Google-Projekt verwenden).

4. Fügen Sie Firebase Analytics zur App hinzu

In diesem Schritt fügen Sie Firebase Analytics zur App hinzu, um Daten zum Benutzerverhalten zu protokollieren (in diesem Fall welche Filme einem Benutzer gefallen). Diese Daten werden in zukünftigen Schritten aggregiert verwendet, um das Empfehlungsmodell zu trainieren.

Richten Sie Firebase Analytics in der App ein

Das LikedMoviesViewModel enthält Funktionen zum Speichern der Filme, die dem Benutzer gefallen. Jedes Mal, wenn dem Benutzer ein neuer Film gefällt, möchten wir auch ein Analyseprotokollereignis senden, um dieses Like aufzuzeichnen.

Fügen Sie den folgenden Code hinzu, um ein Analyseereignis zu registrieren, wenn der Benutzer wie auf einen Film klickt.

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. Testen Sie Ihre Analytics-Integration

In diesem Schritt generieren wir Analytics-Ereignisse in der App und überprüfen, ob sie an die Firebase Console gesendet werden.

Aktivieren Sie die Analytics-Debug-Protokollierung

Im Allgemeinen werden von Ihrer App protokollierte Ereignisse über einen Zeitraum von etwa einer Stunde gebündelt und gemeinsam hochgeladen. Dieser Ansatz schont den Akku der Endbenutzergeräte und reduziert die Netzwerkdatennutzung. Zum Zwecke der Validierung Ihrer Analyseimplementierung (und um Ihre Analysen im DebugView-Bericht anzuzeigen) können Sie jedoch den Debug-Modus auf Ihrem Entwicklungsgerät aktivieren, um Ereignisse mit minimaler Verzögerung hochzuladen.

Um den Analytics-Debug-Modus auf Ihrem Entwicklungsgerät zu aktivieren, geben Sie das folgende Befehlszeilenargument in Xcode an:

-FIRDebugEnabled

Zu diesem Zeitpunkt haben Sie Firebase Analytics erfolgreich in Ihre App integriert. Wenn Benutzer Ihre App verwenden und Filme mögen, werden ihre „Gefällt mir“-Angaben zusammengefasst protokolliert. Wir werden diese aggregierten Daten im Rest dieses Codelabs verwenden, um unser Empfehlungsmodell zu trainieren. Der folgende Schritt ist optional, um zu sehen, dass dieselben Analytics-Ereignisse, die Sie in Logcat gesehen haben, auch in die Firebase-Konsole gestreamt werden. Springen Sie gerne zur nächsten Seite.

Optional: Bestätigen Sie Analytics-Ereignisse in der Firebase Console

  1. Gehen Sie zur Firebase-Konsole .
  2. Wählen Sie unter Analytics die Option DebugView aus
  3. Wählen Sie in Xcode „Ausführen“ , um die App zu starten und einige Filme zu Ihrer „Likes“-Liste hinzuzufügen.
  4. Überprüfen Sie im DebugView der Firebase-Konsole, ob diese Ereignisse protokolliert werden, wenn Sie Filme zur App hinzufügen.

6. Exportieren Sie Analytics-Daten nach Big Query

Big Query ist ein Google Cloud-Produkt, mit dem Sie große Datenmengen untersuchen und verarbeiten können. In diesem Schritt verbinden Sie Ihr Firebase Console-Projekt mit Big Query, sodass die von Ihrer App generierten Analytics-Daten automatisch nach Big Query exportiert werden.

Aktivieren Sie den Big-Query-Export

  1. Gehen Sie zur Firebase-Konsole .
  2. Wählen Sie das Zahnradsymbol „Einstellungen“ neben „Projektübersicht“ und dann „Projekteinstellungen“ aus
  3. Wählen Sie die Registerkarte Integrationen .
  4. Wählen Sie im BigQuery- Block „Verknüpfen“ (oder „Verwalten “) aus.
  5. Wählen Sie im Schritt „Informationen zum Verknüpfen von Firebase mit BigQuery“ die Option „ Weiter“ aus.
  6. Klicken Sie im Abschnitt „Integration konfigurieren“ auf den Schalter, um das Senden von Google Analytics-Daten zu aktivieren, und wählen Sie „Mit BigQuery verknüpfen“ aus.

Sie haben jetzt Ihr Firebase-Konsolenprojekt aktiviert, um Firebase Analytics-Ereignisdaten automatisch an Big Query zu senden. Dies geschieht automatisch und ohne weitere Interaktion. Allerdings kann es sein, dass der erste Export, der den Analysedatensatz in BigQuery erstellt, erst nach 24 Stunden erfolgt. Nachdem der Datensatz erstellt wurde, exportiert Firebase kontinuierlich neue Analytics-Ereignisse nach Big Query in die Intraday-Tabelle und gruppiert Ereignisse vergangener Tage in der Ereignistabelle.

Das Training eines Empfehlungsmodells erfordert viele Daten. Da wir noch keine App haben, die große Datenmengen generiert, importieren wir im nächsten Schritt einen Beispieldatensatz in BigQuery, um ihn für den Rest dieses Tutorials zu verwenden.

7. Verwenden Sie BigQuery, um Modelltrainingsdaten abzurufen

Nachdem wir nun unsere Firebase-Konsole für den Export nach BigQuery verbunden haben, werden unsere App-Analyse-Ereignisdaten nach einiger Zeit automatisch in der BigQuery-Konsole angezeigt. Um erste Daten für dieses Tutorial zu erhalten, importieren wir in diesem Schritt einen vorhandenen Beispieldatensatz in Ihre BigQuery-Konsole, um ihn zum Trainieren unseres Empfehlungsmodells zu verwenden.

Beispieldatensatz in BigQuery importieren

  1. Gehen Sie zum BigQuery- Dashboard in der Google Cloud Console.
  2. Wählen Sie im Menü Ihren Projektnamen aus.
  3. Wählen Sie unten in der linken BigQuery-Navigation Ihren Projektnamen aus, um Details anzuzeigen.
  4. Wählen Sie „Datensatz erstellen“ , um den Bereich zum Erstellen des Datensatzes zu öffnen.
  5. Geben Sie „firebase_recommendations_dataset“ als Datensatz-ID ein und wählen Sie „Datensatz erstellen“ aus.
  6. Der neue Datensatz wird im linken Menü unter dem Projektnamen angezeigt. Klick es.
  7. Wählen Sie Tabelle erstellen aus , um das Tabellenerstellungsfenster zu öffnen.
  8. Wählen Sie für „Tabelle erstellen aus “ „Google Cloud Storage“ aus.
  9. Geben Sie im Feld „Datei aus GCS-Bucket auswählen “ „gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt“ ein.
  10. Wählen Sie „JSONL“ im Dropdown-Menü „ Dateiformat“ .
  11. Geben Sie „recommendations_table“ als Tabellennamen ein.
  12. Aktivieren Sie das Kontrollkästchen unter Schema > Automatische Erkennung > Schema und Eingabeparameter
  13. Wählen Sie Tabelle erstellen

Entdecken Sie den Beispieldatensatz

An dieser Stelle können Sie optional das Schema erkunden und eine Vorschau dieses Datensatzes anzeigen.

  1. Wählen Sie im linken Menü „firebase-recommendations-dataset“ aus, um die darin enthaltenen Tabellen zu erweitern.
  2. Wählen Sie die Tabelle „Empfehlungen-Tabelle“ aus, um das Tabellenschema anzuzeigen.
  3. Wählen Sie „Vorschau“ , um die tatsächlichen Analytics-Ereignisdaten anzuzeigen, die diese Tabelle enthält.

Erstellen Sie Anmeldeinformationen für ein Dienstkonto

Jetzt erstellen wir in unserem Google Cloud Console-Projekt Anmeldeinformationen für Dienstkonten, die wir im folgenden Schritt in der Colab-Umgebung verwenden können, um auf unsere BigQuery-Daten zuzugreifen und diese zu laden.

  1. Stellen Sie sicher, dass die Abrechnung für Ihr Google Cloud-Projekt aktiviert ist.
  2. Aktivieren Sie die APIs BigQuery und BigQuery Storage API. < hier klicken >
  3. Gehen Sie zur Seite Dienstkontoschlüssel erstellen .
  4. Wählen Sie in der Liste „Dienstkonto“ die Option „Neues Dienstkonto“ aus.
  5. Geben Sie im Feld Dienstkontoname einen Namen ein.
  6. Wählen Sie in der Rollenliste „Projekt“ > „Eigentümer“ aus.
  7. Klicken Sie auf Erstellen . Eine JSON-Datei, die Ihre Schlüsseldownloads auf Ihren Computer enthält.

Im nächsten Schritt werden wir Google Colab verwenden, um diese Daten vorzuverarbeiten und unser Empfehlungsmodell zu trainieren.

8. Daten vorverarbeiten und Empfehlungsmodell trainieren

In diesem Schritt verwenden wir ein Colab-Notizbuch, um die folgenden Schritte auszuführen:

  1. Importieren Sie die BigQuery-Daten in das Colab-Notizbuch
  2. Verarbeiten Sie die Daten vor, um sie für das Modelltraining vorzubereiten
  3. Trainieren Sie das Empfehlungsmodell anhand der Analysedaten
  4. Exportieren Sie das Modell als TF-Lite-Modell
  5. Stellen Sie das Modell in der Firebase-Konsole bereit, damit wir es in unserer App verwenden können

Bevor wir das Colab-Schulungsnotizbuch starten, aktivieren wir zunächst die Firebase Model Management API, damit Colab das trainierte Modell auf unserer Firebase-Konsole bereitstellen kann.

Aktivieren Sie die Firebase Model Management API

Erstellen Sie einen Bucket zum Speichern Ihrer ML-Modelle

Gehen Sie in Ihrer Firebase-Konsole zu „Speicher“ und klicken Sie auf „Erste Schritte“. fbbea78f0eb3dc9f.png

Folgen Sie dem Dialog, um Ihren Eimer einzurichten.

19517c0d6d2aa14d.png

Aktivieren Sie die Firebase ML-API

Gehen Sie zur Seite „Firebase ML API“ in der Google Cloud Console und klicken Sie auf „Aktivieren“.

Verwenden Sie das Colab-Notebook, um das Modell zu trainieren und bereitzustellen

Öffnen Sie das Colab-Notizbuch über den folgenden Link und führen Sie die darin enthaltenen Schritte aus. Nachdem Sie die Schritte im Colab-Notizbuch abgeschlossen haben, wird eine TF-Lite-Modelldatei auf der Firebase-Konsole bereitgestellt, die wir mit unserer App synchronisieren können.

In Colab öffnen

9. Laden Sie das Modell in Ihrer App herunter

In diesem Schritt ändern wir unsere App, um das Modell herunterzuladen, das wir gerade von Firebase Machine Learning trainiert haben.

Firebase ML-Abhängigkeit hinzufügen

Die folgende Abhängigkeit ist erforderlich, um Firebase Machine Learning-Modelle in Ihrer App zu verwenden. Es sollte bereits hinzugefügt (überprüfen) sein.

Poddatei

import FirebaseCore
import FirebaseMLModelDownloader

Laden Sie das Modell mit der Firebase Model Manager API herunter

Kopieren Sie den folgenden Code in ModelLoader.swift , um die Bedingungen festzulegen, unter denen der Modell-Download erfolgt, und erstellen Sie eine Download-Aufgabe, um das Remote-Modell mit unserer App zu synchronisieren.

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. Integrieren Sie das Tensorflow Lite-Empfehlungsmodell in Ihre App

Mit der Tensorflow Lite-Laufzeit können Sie Ihr Modell in der App verwenden, um Empfehlungen zu generieren. Im vorherigen Schritt haben wir einen TFlite-Interpreter mit der heruntergeladenen Modelldatei initialisiert. In diesem Schritt laden wir zunächst ein Wörterbuch und Beschriftungen, die unser Modell im Inferenzschritt begleiten. Anschließend fügen wir eine Vorverarbeitung hinzu, um die Eingaben für unser Modell zu generieren, und eine Nachverarbeitung, mit der wir die Ergebnisse aus unserer Inferenz extrahieren .

Wörterbuch und Beschriftungen laden

Die Labels, die vom Empfehlungsmodell zum Generieren der Empfehlungskandidaten verwendet werden, sind in der Datei sorted_movie_vocab.json im Assets-Ordner aufgeführt. Kopieren Sie den folgenden Code, um diese Kandidaten zu laden.

EmpfehlungenViewController.swift

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

Implementieren Sie die Vorverarbeitung

Im Vorverarbeitungsschritt ändern wir die Form der Eingabedaten, um sie an die Erwartungen unseres Modells anzupassen. Hier füllen wir die Eingabelänge mit einem Platzhalterwert auf, wenn wir nicht bereits viele Benutzer-Likes generiert haben. Kopieren Sie den folgenden Code:

EmpfehlungenViewController.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
  }

Führen Sie den Interpreter aus, um Empfehlungen zu generieren

Hier verwenden wir das Modell, das wir in einem vorherigen Schritt heruntergeladen haben, um Rückschlüsse auf unsere vorverarbeiteten Eingaben zu ziehen. Wir legen die Art der Ein- und Ausgabe für unser Modell fest und führen eine Inferenz durch, um unsere Filmempfehlungen zu generieren. Kopieren Sie den folgenden Code in Ihre App.

EmpfehlungenViewController.swift

import TensorFlowLite

EmpfehlungenViewController.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)")
    }
  }

Implementieren Sie die Nachbearbeitung

Schließlich verarbeiten wir in diesem Schritt die Ausgabe unseres Modells nach, wählen die Ergebnisse mit der höchsten Zuverlässigkeit aus und entfernen enthaltene Werte (Filme, die dem Benutzer bereits gefallen haben). Kopieren Sie den folgenden Code in Ihre App.

EmpfehlungenViewController.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]))
    }
  }

Testen Sie Ihre App!

Führen Sie Ihre App erneut aus. Wenn Sie ein paar Filme auswählen, sollte das neue Modell automatisch heruntergeladen werden und Empfehlungen generiert werden!

11. Herzlichen Glückwunsch!

Sie haben mithilfe von TensorFlow Lite und Firebase eine Empfehlungsfunktion in Ihre App integriert. Beachten Sie, dass die in diesem Codelab gezeigten Techniken und Pipelines verallgemeinert und auch für andere Arten von Empfehlungen verwendet werden können.

Was wir abgedeckt haben

  • Firebase ML
  • Firebase Analytics
  • Analyseereignisse nach BigQuery exportieren
  • Analyseereignisse vorverarbeiten
  • Trainieren Sie Empfehlungen für das TensorFlow-Modell
  • Modell exportieren und in der Firebase-Konsole bereitstellen
  • Bieten Sie Filmempfehlungen in einer App an

Nächste Schritte

  • Implementieren Sie Firebase ML-Empfehlungen in Ihrer App.

Erfahren Sie mehr

Eine Frage haben?

Probleme melden