TensorFlow Lite と Firebase を使用してアプリにレコメンデーションを追加する - iOS Codelab

1。概要

TensorFlow Lite と Firebase コードラボの推奨事項へようこそ。このコードラボでは、TensorFlow Lite と Firebase を使用してアプリにレコメンデーション モデルをデプロイする方法を学びます。このコードラボは、この TensorFlow Liteサンプルに基づいています。

レコメンデーションにより、アプリは機械学習を使用して、各ユーザーに最も関連性の高いコンテンツをインテリジェントに提供できるようになります。これらは、他の多数のユーザーの集合的な行動に基づいてトレーニングされたモデルを使用して、過去のユーザーの行動を考慮して、ユーザーが将来インタラクションする可能性のあるアプリのコンテンツを提案します。

このチュートリアルでは、Firebase Analytics を使用してアプリのユーザーからデータを取得し、そのデータからレコメンデーション用の機械学習モデルを構築し、そのモデルを iOS アプリで使用して推論を実行してレコメンデーションを取得する方法を説明します。特に、当社の推奨事項は、ユーザーが以前に気に入った映画のリストを考慮して、ユーザーが視聴する可能性が最も高い映画を提案します。

学べること

  • Firebase Analytics を Android アプリに統合してユーザー行動データを収集する
  • そのデータを 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 install を実行します。

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

AppDelegatedidFinishLaunchingWithOptionsメソッドで、ファイルの先頭に Firebase をインポートします。

import FirebaseCore

そして、Firebase を設定するための呼び出しを追加します。

FirebaseApp.configure()

プロジェクトを再度実行して、アプリが正しく構成されており、起動時にクラッシュしないことを確認します。

  1. 「このプロジェクトに対して Google アナリティクスを有効にする」が有効になっていることを確認します。
  2. Firebase コンソールで残りのセットアップ手順に従い、[プロジェクトの作成] (既存の Google プロジェクトを使用している場合は [Firebase を追加]) をクリックします。

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 コンソールに送信されていることを確認します。

分析デバッグログを有効にする

通常、アプリによって記録されたイベントは、約 1 時間にわたってまとめられ、一緒にアップロードされます。このアプローチにより、エンド ユーザーのデバイスのバッテリーが節約され、ネットワーク データの使用量が削減されます。ただし、分析の実装を検証する目的 (および DebugView レポートで分析を表示するため) を目的として、開発デバイスでデバッグ モードを有効にして、最小限の遅延でイベントをアップロードできます。

開発デバイスで Analytics デバッグ モードを有効にするには、Xcode で次のコマンド ライン引数を指定します。

-FIRDebugEnabled

この時点で、Firebase Analytics がアプリに正常に統合されました。ユーザーがアプリを使用して映画を「いいね!」すると、そのいいね数がまとめて記録されます。このコードラボの残りの部分ではこの集計データを使用して、レコメンデーション モデルをトレーニングします。以下は、Logcat で表示されたのと同じ Analytics イベントが Firebase コンソールにもストリーミングされることを確認するためのオプションの手順です。次のページに進んでください。

オプション: Firebase コンソールでアナリティクス イベントを確認する

  1. Firebase コンソールに移動します。
  2. Analytics の下のDebugViewを選択します
  3. Xcode で、 「実行」を選択してアプリを起動し、いくつかのムービーを「いいね!」リストに追加します。
  4. Firebase コンソールの DebugView で、アプリにムービーを追加するときにこれらのイベントが記録されていることを確認します。

6. Analytics データを Big Query にエクスポートする

Big Query は、大量のデータを調査して処理できる Google Cloud プロダクトです。このステップでは、アプリによって生成されたアナリティクス データが自動的に Big Query にエクスポートされるように、Firebase コンソール プロジェクトを Big Query に接続します。

BigQuery エクスポートを有効にする

  1. Firebase コンソールに移動します。
  2. [プロジェクトの概要]の横にある [設定] 歯車アイコンを選択し、 [プロジェクト設定]を選択します。
  3. 「統合」タブを選択します。
  4. BigQueryブロック内の[リンク] (または[管理]) を選択します。
  5. 「Firebase と BigQuery のリンクについて」ステップで「次へ」を選択します。
  6. [統合の構成]セクションで、スイッチをクリックして Google アナリティクス データの送信を有効にし、 [BigQuery へのリンク]を選択します。

これで、Firebase コンソール プロジェクトが Firebase Analytics イベント データを Big Query に自動的に送信できるようになりました。これは追加の操作を行わなくても自動的に行われますが、BigQuery で分析データセットを作成する最初のエクスポートは 24 時間行われない場合があります。データセットの作成後、Firebase は継続的に新しいアナリティクス イベントを Big Query の日中テーブルにエクスポートし、過去の日のイベントをイベント テーブルにグループ化します。

レコメンデーション モデルのトレーニングには大量のデータが必要です。大量のデータを生成するアプリがまだないため、次のステップでは、このチュートリアルの残りの部分で使用するサンプル データセットを BigQuery にインポートします。

7. BigQuery を使用してモデルのトレーニング データを取得する

Firebase コンソールを接続して BigQuery にエクスポートしたので、アプリ分析イベント データはしばらくすると BigQuery コンソールに自動的に表示されます。このチュートリアルの目的で初期データを取得するために、このステップでは既存のサンプル データセットを BigQuery コンソールにインポートし、レコメンデーション モデルのトレーニングに使用します。

サンプル データセットを BigQuery にインポートする

  1. Google Cloud コンソールでBigQueryダッシュボードに移動します。
  2. メニューでプロジェクト名を選択します。
  3. BigQuery の左側のナビゲーションの下部でプロジェクト名を選択すると、詳細が表示されます。
  4. [データセットの作成]を選択して、データセット作成パネルを開きます。
  5. データセット IDに「firebase_recommendations_dataset」と入力し、 [データセットの作成]を選択します。
  6. 新しいデータセットが、左側のメニューのプロジェクト名の下に表示されます。クリックして。
  7. [テーブルの作成]を選択して、テーブル作成パネルを開きます。
  8. [テーブルの作成元] で[Google Cloud Storage] を選択します。
  9. [GCS バケットからファイルを選択]フィールドに、「gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt」と入力します。
  10. ファイル形式ドロップダウンで「JSONL」を選択します。
  11. [テーブル名]に「recommendations_table」と入力します。
  12. [スキーマ] > [自動検出] > [スキーマと入力パラメータ]の下のボックスをオンにします。
  13. 「テーブルの作成」を選択します

サンプル データセットを探索する

この時点で、必要に応じてスキーマを探索し、このデータセットをプレビューすることができます。

  1. 左側のメニューでfirebase-recommendations-datasetを選択して、そこに含まれるテーブルを展開します。
  2. Recommendations-tableテーブルを選択して、テーブル スキーマを表示します。
  3. [プレビュー]を選択すると、このテーブルに含まれる実際の Analytics イベント データが表示されます。

サービスアカウントの資格情報を作成する

ここで、Google Cloud コンソール プロジェクトでサービス アカウントの認証情報を作成します。これは、次の手順で Colab 環境で BigQuery データにアクセスして読み込むために使用できます。

  1. Google Cloud プロジェクトの課金が有効になっていることを確認してください。
  2. BigQuery および BigQuery Storage API API を有効にします。 <ここをクリック>
  3. 「サービス アカウント キーの作成」ページに移動します。
  4. [サービス アカウント]リストから、 [新しいサービス アカウント]を選択します。
  5. [サービス アカウント名]フィールドに名前を入力します。
  6. 「役割」リストから、 「プロジェクト」 > 「所有者」を選択します。
  7. 「作成」をクリックします。キーを含む JSON ファイルがコンピューターにダウンロードされます。

次のステップでは、Google Colab を使用してこのデータを前処理し、レコメンデーション モデルをトレーニングします。

8. データの前処理と推奨モデルのトレーニング

このステップでは、Colab ノートブックを使用して次の手順を実行します。

  1. BigQuery データを Colab ノートブックにインポートする
  2. データを前処理してモデルのトレーニングに備えます
  3. 分析データに基づいて推奨モデルをトレーニングする
  4. モデルを TF lite モデルとしてエクスポートします
  5. モデルを Firebase コンソールにデプロイして、アプリで使用できるようにします

Colab トレーニング ノートブックを起動する前に、まず Firebase Model Management API を有効にして、Colab がトレーニング済みモデルを Firebase コンソールにデプロイできるようにします。

Firebase モデル管理 API を有効にする

ML モデルを保存するバケットを作成する

Firebase コンソールで、[ストレージ] に移動し、[開始する] をクリックします。 fbbea78f0eb3dc9f.png

ダイアログに従ってバケットを設定します。

19517c0d6d2aa14d.png

Firebase ML API を有効にする

Google Cloud Console のFirebase ML API ページに移動し、[有効にする] をクリックします。

Colab ノートブックを使用してモデルをトレーニングおよびデプロイする

次のリンクを使用して colab ノートブックを開き、その中の手順を完了します。 Colab ノートブックの手順を完了すると、アプリと同期できる TF lite モデル ファイルが Firebase コンソールにデプロイされます。

コラボで開く

9. アプリにモデルをダウンロードします

このステップでは、Firebase Machine Learning からトレーニングしたばかりのモデルをダウンロードするようにアプリを変更します。

Firebase ML 依存関係を追加する

アプリで Firebase Machine Learning モデルを使用するには、次の依存関係が必要です。すでに追加されているはずです (確認)。

ポッドファイル

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 インタープリターを初期化しました。このステップでは、まず推論ステップでモデルに付随する辞書とラベルをロードします。次に、モデルへの入力を生成する前処理と、推論から結果を抽出する後処理を追加します。 。

辞書とラベルをロードする

推奨モデルによって推奨候補を生成するために使用されるラベルは、assets フォルダー内のファイルsorted_movie_vocab.jsonにリストされています。次のコードをコピーして、これらの候補をロードします。

RecommendationsViewController.swift

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

前処理の実装

前処理ステップでは、モデルが期待するものに一致するように入力データの形式を変更します。ここで、まだ多くのユーザーの「いいね!」を生成していない場合は、入力長にプレースホルダー値を埋め込みます。以下のコードをコピーします。

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

インタープリターを実行して推奨事項を生成する

ここでは、前のステップでダウンロードしたモデルを使用して、前処理された入力に対して推論を実行します。モデルの入力と出力のタイプを設定し、推論を実行して映画の推奨事項を生成します。次のコードをアプリにコピーします。

RecommendationsViewController.swift

import TensorFlowLite

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

後処理の実装

最後に、このステップではモデルからの出力を後処理し、最も信頼性の高い結果を選択し、含まれる値 (ユーザーがすでに気に入っている映画) を削除します。次のコードをアプリにコピーします。

RecommendationsViewController.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 アナリティクス
  • 分析イベントを BigQuery にエクスポートする
  • 分析イベントの前処理
  • 推奨事項 TensorFlow モデルをトレーニングする
  • モデルをエクスポートして Firebase コンソールにデプロイする
  • アプリで映画のおすすめを提供する

次のステップ

  • Firebase ML の推奨事項をアプリに実装します。

もっと詳しく知る

質問があります?

問題を報告する