1。概要
TensorFlowLiteとFirebasecodelabの推奨事項へようこそ。このコードラボでは、TensorFlowLiteとFirebaseを使用してアプリに推奨モデルをデプロイする方法を学習します。このコードラボは、このTensorFlowLiteの例に基づいています。
推奨事項により、アプリは機械学習を使用して、各ユーザーに最も関連性の高いコンテンツをインテリジェントに提供できます。過去のユーザーの行動を考慮に入れて、他の多数のユーザーの集合的な行動についてトレーニングされたモデルを使用して、ユーザーが将来対話したいと思う可能性のあるアプリのコンテンツを提案します。
このチュートリアルでは、Firebase Analyticsを使用してアプリのユーザーからデータを取得し、そのデータから推奨事項の機械学習モデルを構築し、Androidアプリでそのモデルを使用して推論を実行し、推奨事項を取得する方法を示します。特に、私たちの推奨事項は、ユーザーが以前に気に入った映画のリストを考えると、ユーザーが最も見そうな映画を提案します。
あなたが学ぶこと
- Firebase AnalyticsをAndroidアプリに統合して、ユーザーの行動データを収集します
- そのデータをGoogleBigQueryにエクスポートします
- データを前処理し、TFLite推奨モデルをトレーニングします
- TFLiteモデルをFirebaseMLにデプロイし、アプリからアクセスします
- モデルを使用してデバイス推論を実行し、ユーザーに推奨事項を提案します
必要なもの
- AndroidStudioバージョン3.4以降。
- サンプルコード。
- Android2.3以降およびGooglePlayサービス9.8以降を搭載したテストデバイス、またはGooglePlayサービス9.8以降を搭載したエミュレーター
- デバイスを使用する場合は、接続ケーブル。
このチュートリアルをどのように使用しますか?
Androidアプリの作成経験をどのように評価しますか?
2.サンプルコードを取得します
コマンドラインからGitHubリポジトリのクローンを作成します。
$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git
3.スターターアプリをインポートします
Android Studioから、 codelab-recommendations-android
ディレクトリを選択します( )サンプルコードのダウンロードから( [ファイル]> [開く]> ... / codelab-recommendations-android / start)。
これで、AndroidStudioで開始プロジェクトを開く必要があります。
4.Firebaseコンソールプロジェクトを作成します
新しいプロジェクトを作成する
- Firebaseコンソールに移動します。
- [プロジェクトの追加]を選択します(または、プロジェクトが最初の場合はプロジェクトを作成します)。
- プロジェクト名を選択または入力して、[続行]をクリックします。
- [このプロジェクトでGoogleAnalyticsを有効にする]が有効になっていることを確認します。
- Firebaseコンソールの残りの設定手順に従い、[プロジェクトの作成](または、既存のGoogleプロジェクトを使用している場合は[Firebaseの追加])をクリックします。
5.Firebaseを追加します
- 新しいプロジェクトの概要画面で、Androidアイコンをクリックしてセットアップワークフローを起動します。
- codelabのパッケージ名を入力してください:
com.google.firebase.codelabs.recommendations
- [アプリの登録]を選択します。
google-services.jsonファイルをアプリに追加します
パッケージ名を追加して[登録]を選択した後、[ google-services.jsonのダウンロード]をクリックしてFirebase Android構成ファイルを取得し、google-services.jsonファイルをプロジェクトのapp
ディレクトリにコピーします。ファイルがダウンロードされたら、コンソールに表示される次の手順をスキップできます(build-android-startプロジェクトですでに実行されています)。
アプリにgoogle-servicesプラグインを追加します
google-servicesプラグインは、google-services.jsonファイルを使用して、Firebaseを使用するようにアプリケーションを構成します。次の行は、プロジェクトのbuild.gradleファイルにすでに追加されているはずです(確認のためにチェックしてください)。
app / build.grade
apply plugin: 'com.google.gms.google-services'
build.grade
classpath 'com.google.gms:google-services:4.3.4'
プロジェクトをgradleファイルと同期する
アプリですべての依存関係を利用できるようにするには、この時点でプロジェクトをgradleファイルと同期する必要があります。 AndroidStudioツールバーから[ファイル]> [プロジェクトをGradleファイルと同期]を選択します。
6.スターターアプリを実行します
プロジェクトをAndroidStudioにインポートし、JSONファイルを使用してgoogle-services
プラグインを構成したので、アプリを初めて実行する準備が整いました。 Androidデバイスを接続し、[実行]をクリックします( )AndroidStudioツールバー。
アプリがデバイスで起動するはずです。この時点で、映画のリストを含むタブ、「いいね!」タブ、および「推奨」タブを表示する、機能しているアプリケーションを確認できます。映画のリストで映画をクリックして、お気に入りのリストに追加できます。コードラボの残りの手順を完了すると、[おすすめ]タブで映画のおすすめを生成できるようになります。
7. FirebaseAnalyticsをアプリに追加します
このステップでは、Firebase Analyticsをアプリに追加して、ユーザーの行動データ(この場合、ユーザーが好きな映画)をログに記録します。このデータは、推奨モデルをトレーニングするための将来のステップでまとめて使用されます。
FirebaseAnalyticsの依存関係を追加する
Firebase Analyticsをアプリに追加するには、次の依存関係が必要です。すでにapp / build.gradleファイルに含まれている必要があります(確認)。
app / build.grade
implementation 'com.google.firebase:firebase-analytics-ktx:17.6.0'
アプリでFirebaseAnalyticsを設定する
LikedMoviesViewModelには、ユーザーが好きな映画を保存するための関数が含まれています。ユーザーが新しい映画を気に入ったときはいつでも、そのようなものを記録するために分析ログイベントを送信したいと思います。
以下のコードを使用してonMovieLiked関数を追加し、ユーザーが映画のようにクリックしたときに分析イベントを登録します。
LikedMoviesViewModel.kt
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase
class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
...
fun onMovieLiked(movie: Movie) {
movies.setLike(movie, true)
logAnalyticsEvent(movie.id.toString())
}
}
次のフィールドと関数を追加して、映画がユーザーの「いいね」リストに追加されたときにAnalyticsイベントをログに記録します。
LikedMoviesViewModel.kt
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase
class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
...
private val firebaseAnalytics = Firebase.analytics
...
/**
* Logs an event in Firebase Analytics that is used in aggregate to train the recommendations
* model.
*/
private fun logAnalyticsEvent(id: String) {
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
param(FirebaseAnalytics.Param.ITEM_ID, id)
}
}
8.アナリティクスの統合をテストします
このステップでは、アプリでアナリティクスイベントを生成し、それらがFirebaseコンソールに送信されていることを確認します。
Analyticsデバッグログを有効にする
Firebase Analyticsは、ユーザーのバッテリー寿命を最大化するように設計されており、デバイスでイベントをバッチ処理し、Firebaseにたまにのみ送信します。デバッグの目的で、シェルで次のコマンドを実行することにより、この動作を無効にして、イベントがリアルタイムでログに記録されるときにイベントを表示できます。
ターミナル
adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations
Analyticsイベントが生成されたことを確認する
- Android Studioで、Logcatウィンドウを開いて、アプリからのログを確認します。
- Logcatフィルターを文字列「Loggingevent」に設定します。
- アプリで映画が好きになるたびに、「select_item」アナリティクスイベントが発行されることを確認します。
この時点で、FirebaseAnalyticsがアプリに正常に統合されています。ユーザーがアプリを使用して映画を高く評価すると、ユーザーの高評価が集計されて記録されます。このコードラボの残りの部分でこの集計データを使用して、推奨モデルをトレーニングします。以下は、Logcatで見たのと同じAnalyticsイベントがFirebaseコンソールにストリーミングされるのを確認するためのオプションの手順です。次のページに進んでください。
オプション: FirebaseConsoleでアナリティクスイベントを確認する
- Firebaseコンソールに移動します。
- AnalyticsでDebugViewを選択します
- Android Studioで、[実行]を選択してアプリを起動し、いくつかの映画を[いいね!]リストに追加します。
- FirebaseコンソールのDebugViewで、アプリに映画を追加するときにこれらのイベントがログに記録されていることを確認します。
9.アナリティクスデータをBigQueryにエクスポートします
Big Queryは、大量のデータを調べて処理できるGoogleCloud製品です。この手順では、FirebaseConsoleプロジェクトをBigQueryに接続して、アプリによって生成されたアナリティクスデータが自動的にBigQueryにエクスポートされるようにします。
BigQueryのエクスポートを有効にする
- Firebaseコンソールに移動します。
- [プロジェクトの概要]の横にある[設定]歯車アイコンを選択し、[プロジェクト設定]を選択します
- [統合]タブを選択します。
- BigQueryブロック内の[リンク](または[管理])を選択します。
- [ FirebaseをBigQueryにリンクする方法]ステップで[次へ]を選択します。
- [統合の構成]セクションで、スイッチをクリックしてGoogle Analyticsデータの送信を有効にし、[ BigQueryへのリンク]を選択します。
これで、FirebaseコンソールプロジェクトがFirebaseAnalyticsイベントデータをBigQueryに自動的に送信できるようになりました。これはそれ以上の操作なしで自動的に行われますが、BigQueryで分析データセットを作成する最初のエクスポートは24時間行われない場合があります。データセットが作成された後、Firebaseは継続的に新しいAnalyticsイベントをBig Queryに日中テーブルにエクスポートし、過去の日のイベントをイベントテーブルにグループ化します。
推奨モデルのトレーニングには、大量のデータが必要です。大量のデータを生成するアプリはまだないため、次のステップでは、サンプルデータセットをBigQueryにインポートして、このチュートリアルの残りの部分で使用します。
10.BigQueryを使用してモデルトレーニングデータを取得します
Firebaseコンソールを接続してBigQueryにエクスポートしたので、しばらくするとアプリ分析イベントデータがBigQueryコンソールに自動的に表示されます。このチュートリアルの目的で初期データを取得するために、このステップでは、既存のサンプルデータセットをBigQueryコンソールにインポートして、推奨モデルのトレーニングに使用します。
サンプルデータセットをBigQueryにインポートする
- GoogleクラウドコンソールのBigQueryダッシュボードに移動します。
- メニューでプロジェクト名を選択します。
- BigQueryの左側のナビゲーションの下部でプロジェクト名を選択すると、詳細が表示されます。
- [データセットの作成]を選択して、データセット作成パネルを開きます。
- データセットIDに「firebase_recommendations_dataset」と入力し、[データセットの作成]を選択します。
- 新しいデータセットは、左側のメニューのプロジェクト名の下に表示されます。クリックして。
- [テーブルの作成]を選択して、テーブル作成パネルを開きます。
- [テーブルの作成]で、[Google CloudStorage]を選択します。
- [GCSバケットからファイルを選択]フィールドに「gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt」と入力します。
- [ファイル形式]ドロップダウンで[JSONL]を選択します。
- テーブル名に「recommendations_table」と入力します。
- [スキーマ]> [自動検出]> [スキーマと入力パラメーター]の下のチェックボックスをオンにします
- [テーブルの作成]を選択します
サンプルデータセットを調べる
この時点で、オプションでスキーマを探索し、このデータセットをプレビューできます。
- 左側のメニューでfirebase-recommendations-datasetを選択して、含まれているテーブルを展開します。
- テーブルスキーマを表示するには、 recommendations-tableテーブルを選択します。
- このテーブルに含まれる実際のAnalyticsイベントデータを表示するには、[プレビュー]を選択します。
サービスアカウントの資格情報を作成する
次に、Google Cloudコンソールプロジェクトでサービスアカウントのクレデンシャルを作成します。このクレデンシャルは、次の手順でColab環境で使用して、BigQueryデータにアクセスして読み込むことができます。
- GoogleCloudプロジェクトで課金が有効になっていることを確認してください。
- BigQueryおよびBigQueryStorage APIAPIを有効にします。 <ここをクリック>
- [サービスアカウントキーの作成]ページに移動します。
- [サービスアカウント]リストから、[新しいサービスアカウント]を選択します。
- 「サービスアカウント名」フィールドに名前を入力します。
- [役割]リストから、[プロジェクト] > [所有者]を選択します。
- [作成]をクリックします。コンピューターへのキーのダウンロードを含むJSONファイル。
次のステップでは、Google Colabを使用してこのデータを前処理し、推奨モデルをトレーニングします。
11.データの前処理と推奨モデルのトレーニング
このステップでは、Colabノートブックを使用して次のステップを実行します。
- BigQueryデータをColabノートブックにインポートします
- データを前処理して、モデルトレーニング用に準備します
- 分析データで推奨モデルをトレーニングする
- モデルをTFliteモデルとしてエクスポートします
- モデルをFirebaseConsoleにデプロイして、アプリで使用できるようにします
Colabトレーニングノートブックを起動する前に、まずFirebase Model Management APIを有効にして、Colabがトレーニング済みモデルをFirebaseコンソールにデプロイできるようにします。
Firebase Model ManagementAPIを有効にする
MLモデルを保存するバケットを作成します
Firebase Consoleで、[ストレージ]に移動し、[開始]をクリックします。
ダイアログに従って、バケットを設定します。
Firebase MLAPIを有効にする
Google CloudConsoleのFirebaseML APIページに移動し、[有効にする]をクリックします。
Colabノートブックを使用してモデルをトレーニングおよびデプロイします
次のリンクを使用してcolabノートブックを開き、内の手順を完了します。 Colabノートブックの手順を完了すると、アプリに同期できるTFliteモデルファイルがFirebaseコンソールにデプロイされます。
Colabで開く
12.アプリにモデルをダウンロードします
このステップでは、Firebase MachineLearningからトレーニングしたモデルをダウンロードするようにアプリを変更します。
FirebaseMLの依存関係を追加する
アプリでFirebaseMachine Learningモデルを使用するには、次の依存関係が必要です。すでに追加されているはずです(確認)。
app / build.grade
implementation 'com.google.firebase:firebase-ml-model-interpreter:22.0.4'
Firebase Model ManagerAPIを使用してモデルをダウンロードする
以下のコードをRecommendationClient.ktにコピーして、モデルのダウンロードが発生する条件を設定し、ダウンロードタスクを作成してリモートモデルをアプリに同期します。
RecommendationClient.kt
private fun downloadModel(modelName: String) {
val remoteModel = FirebaseCustomRemoteModel.Builder(modelName).build()
val firebaseModelManager = FirebaseModelManager.getInstance()
firebaseModelManager
.isModelDownloaded(remoteModel)
.continueWithTask { task ->
// Create update condition if model is already downloaded, otherwise create download
// condition.
val conditions = if (task.result != null && task.result == true) {
FirebaseModelDownloadConditions.Builder()
.requireWifi()
.build() // Update condition that requires wifi.
} else {
FirebaseModelDownloadConditions.Builder().build(); // Download condition.
}
firebaseModelManager.download(remoteModel, conditions)
}
.addOnSuccessListener {
firebaseModelManager.getLatestModelFile(remoteModel)
.addOnCompleteListener {
val model = it.result
if (model == null) {
showToast(context, "Failed to get model file.")
} else {
showToast(context, "Downloaded remote model")
GlobalScope.launch { initializeInterpreter(model) }
}
}
}
.addOnFailureListener {
showToast(context, "Model download failed for recommendations, please check your connection.")
}
}
13. TensorflowLiteレコメンデーションモデルをアプリに統合します
Tensorflow Liteランタイムを使用すると、アプリでモデルを使用して推奨事項を生成できます。前のステップでは、ダウンロードしたモデルファイルを使用してTFliteインタープリターを初期化しました。このステップでは、最初に推論ステップでモデルに付随する辞書とラベルをロードし、次にモデルへの入力を生成する前処理と、推論から結果を抽出する後処理を追加します。 。
辞書とラベルを読み込む
推奨モデルによって推奨候補を生成するために使用されるラベルは、res / assetsフォルダーのsorted_movie_vocab.jsonファイルにリストされています。次のコードをコピーして、これらの候補をロードします。
RecommendationClient.kt
/** Load recommendation candidate list. */
private suspend fun loadCandidateList() {
return withContext(Dispatchers.IO) {
val collection = MovieRepository.getInstance(context).getContent()
for (item in collection) {
candidates[item.id] = item
}
Log.v(TAG, "Candidate list loaded.")
}
}
前処理を実装する
前処理ステップでは、モデルが期待するものと一致するように入力データの形式を変更します。ここでは、まだ多くのユーザーのいいねを生成していない場合は、入力の長さにプレースホルダー値を埋め込みます。以下のコードをコピーします。
RecommendationClient.kt
/** Given a list of selected items, preprocess to get tflite input. */
@Synchronized
private suspend fun preprocess(selectedMovies: List<Movie>): IntArray {
return withContext(Dispatchers.Default) {
val inputContext = IntArray(config.inputLength)
for (i in 0 until config.inputLength) {
if (i < selectedMovies.size) {
val (id) = selectedMovies[i]
inputContext[i] = id
} else {
// Padding input.
inputContext[i] = config.pad
}
}
inputContext
}
}
インタプリタを実行して推奨事項を生成する
ここでは、前の手順でダウンロードしたモデルを使用して、前処理された入力に対して推論を実行します。モデルの入力と出力のタイプを設定し、推論を実行して映画の推奨事項を生成します。次のコードをアプリにコピーします。
RecommendationClient.kt
/** Given a list of selected items, and returns the recommendation results. */
@Synchronized
suspend fun recommend(selectedMovies: List<Movie>): List<Result> {
return withContext(Dispatchers.Default) {
val inputs = arrayOf<Any>(preprocess(selectedMovies))
// Run inference.
val outputIds = IntArray(config.outputLength)
val confidences = FloatArray(config.outputLength)
val outputs: MutableMap<Int, Any> = HashMap()
outputs[config.outputIdsIndex] = outputIds
outputs[config.outputScoresIndex] = confidences
tflite?.let {
it.runForMultipleInputsOutputs(inputs, outputs)
postprocess(outputIds, confidences, selectedMovies)
} ?: run {
Log.e(TAG, "No tflite interpreter loaded")
emptyList()
}
}
}
後処理を実装する
最後に、このステップでは、モデルからの出力を後処理し、最も信頼性の高い結果を選択し、含まれている値(ユーザーがすでに気に入っている映画)を削除します。次のコードをアプリにコピーします。
RecommendationClient.kt
/** Postprocess to gets results from tflite inference. */
@Synchronized
private suspend fun postprocess(
outputIds: IntArray, confidences: FloatArray, selectedMovies: List<Movie>
): List<Result> {
return withContext(Dispatchers.Default) {
val results = ArrayList<Result>()
// Add recommendation results. Filter null or contained items.
for (i in outputIds.indices) {
if (results.size >= config.topK) {
Log.v(TAG, String.format("Selected top K: %d. Ignore the rest.", config.topK))
break
}
val id = outputIds[i]
val item = candidates[id]
if (item == null) {
Log.v(TAG, String.format("Inference output[%d]. Id: %s is null", i, id))
continue
}
if (selectedMovies.contains(item)) {
Log.v(TAG, String.format("Inference output[%d]. Id: %s is contained", i, id))
continue
}
val result = Result(
id, item,
confidences[i]
)
results.add(result)
Log.v(TAG, String.format("Inference output[%d]. Result: %s", i, result))
}
results
}
}
アプリをテストしてください!
アプリを再実行します。いくつかの映画を選択すると、新しいモデルが自動的にダウンロードされ、推奨事項の生成が開始されます。
14.おめでとうございます!
TensorFlow LiteとFirebaseを使用して、アプリに推奨機能を組み込みました。このコードラボに示されている手法とパイプラインは、一般化して、他のタイプの推奨事項を提供するためにも使用できることに注意してください。
私たちがカバーしたこと
- Firebase ML
- FirebaseAnalytics
- 分析イベントをBigQueryにエクスポートする
- 分析イベントの前処理
- トレーニングの推奨事項TensorFlowモデル
- モデルをエクスポートしてFirebaseConsoleにデプロイする
- アプリで映画のおすすめを提供する
次のステップ
- アプリにFirebaseMLの推奨事項を実装します。