1。概要
Firebase ML を使用すると、モデルを無線でデプロイできます。これにより、アプリのサイズを小さく保ち、必要な場合にのみ ML モデルをダウンロードしたり、複数のモデルを試したり、アプリ全体を再公開することなく ML モデルを更新したりすることができます。
このコードラボでは、静的な TFLite モデルを使用する Android アプリを、Firebase から動的に提供されるモデルを使用するアプリに変換します。
学べること
- TFLite モデルを Firebase ML にデプロイし、アプリからアクセスする
- Firebase Analytics でユーザー フィードバックを追跡し、モデルの精度を測定します
- Firebase Performance を介してモデルのパフォーマンスをプロファイリングする
- 複数のデプロイ済みモデルのうちどれを Remote Config を通じてロードするかを選択します
- Firebase A/B テストを通じてさまざまなモデルを試してみる
必要なもの
- 最新のAndroid Studioバージョン。
- サンプルコード。
- Android 5.0 以降および Google Play サービス 9.8 以降を搭載したテスト デバイス、または Google Play サービス 9.8 以降を搭載したエミュレータ
- 機器を使用する場合は接続ケーブル。
このチュートリアルをどのように使用しますか?
Android アプリの構築に関するあなたの経験をどう評価しますか?
2. サンプルコードを入手する
コマンドラインから GitHub リポジトリのクローンを作成します。
$ git clone https://github.com/FirebaseExtended/codelab-digitclassifier-android.git
git がインストールされていない場合は、GitHub ページから、またはこのリンクをクリックしてサンプル プロジェクトをダウンロードすることもできます。
3.スターターアプリをインポートする
Android Studio から、 codelab-digitclassifier-android
ディレクトリ ( ) サンプル コードをダウンロードします ( [ファイル] > [開く] > [.../codelab-digitalclassifier-android/start])。
これで、Android Studio で開始プロジェクトが開いたはずです。
4.スターターアプリを実行します
プロジェクトを Android Studio にインポートしたので、アプリを初めて実行する準備が整いました。 Android デバイスを接続し、 「実行」( )Android Studio ツールバー。
アプリがデバイス上で起動するはずです。この時点で、数字を描画してみると、アプリはそれを認識できるはずです。
5. Firebaseコンソールプロジェクトを作成する
Firebaseをプロジェクトに追加する
- Firebase コンソールに移動します。
- [プロジェクトの追加]を選択します。
- プロジェクト名を選択または入力します。
- Firebase コンソールで残りのセットアップ手順に従い、[プロジェクトの作成] (既存の Google プロジェクトを使用している場合は [Firebase を追加]) をクリックします。
6. Firebaseを追加する
- 新しいプロジェクトの概要画面で、Android アイコンをクリックしてセットアップ ワークフローを起動します。
- コードラボのパッケージ名を入力します:
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 を使用するように設定します。プロジェクトのapp
ディレクトリにある build.gradle.kts ファイルの先頭にあるplugins
ブロックに次の行を追加します。
app/build.gradle.kts
id("com.google.gms.google-services")
次に、プロジェクト内の build.gradle.kts ファイルのplugins
ブロックに次の行を追加します。
プロジェクト/build.gradle.kts
id("com.google.gms.google-services") version "4.3.15" apply false
プロジェクトをgradleファイルと同期する
すべての依存関係をアプリで確実に利用できるようにするには、この時点でプロジェクトを Gradle ファイルと同期する必要があります。 Android Studio ツールバーから[ファイル] > [プロジェクトを Gradle ファイルと同期]を選択します。
7. Firebase でアプリを実行する
JSON ファイルを使用してgoogle-services
プラグインを構成したので、Firebase でアプリを実行する準備が整いました。 Android デバイスを接続し、 「実行」( )Android Studio ツールバー。
アプリがデバイス上で起動するはずです。この時点では、アプリはまだ正常にビルドされているはずです。
8. モデルを Firebase ML にデプロイする
モデルを Firebase ML にデプロイすると、主に次の 2 つの理由で役立ちます。
- アプリのインストール サイズを小さく保ち、必要な場合にのみモデルをダウンロードできます。
- モデルは定期的に更新でき、アプリ全体とは異なるリリース サイクルで更新できます。
アプリ内の静的モデルを Firebase から動的にダウンロードしたモデルに置き換える前に、それを Firebase ML にデプロイする必要があります。モデルは、コンソール経由で、または Firebase Admin SDK を使用してプログラムでデプロイできます。このステップでは、コンソール経由でデプロイします。
物事を簡単にするために、アプリにすでに含まれている TensorFlow Lite モデルを使用します。まず、Firebase コンソールを開き、左側のナビゲーション パネルで [機械学習] をクリックします。初めて開く場合は、「始める」をクリックしてください。次に、[カスタム] に移動し、[カスタム モデルの追加] ボタンをクリックします。
プロンプトが表示されたら、モデルにmnist_v1
のようなわかりやすい名前を付け、 start/app/src/main/assets/mnist.tflite
の下の codelab プロジェクト ディレクトリからファイルをアップロードします。その後、この TF Lite モデル ファイルを Android プロジェクトから削除できます。
9. Firebase ML からモデルをダウンロードする
TFLite モデルは比較的大きくなる可能性があるため、Firebase からアプリにリモート モデルをいつダウンロードするかを選択するのは難しい場合があります。理想的には、アプリの起動時にすぐにモデルをロードすることは避けたいと考えています。モデルが 1 つの機能のみに使用され、ユーザーがその機能をまったく使用しない場合、理由もなく大量のデータがダウンロードされることになるからです。 Wi-Fi 接続時にのみモデルを取得するなどのダウンロード オプションを設定することもできます。ネットワーク接続がなくてもモデルを利用できるようにしたい場合は、バックアップとしてアプリなしでモデルをバンドルすることも重要です。
わかりやすくするために、デフォルトのバンドル モデルを削除し、アプリの起動時に常に 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.")
}
}
アプリを再実行し、数字分類子で数字を描画します。ダウンロードが完了すると、リモート モデルがダウンロードされたことを示すトースト メッセージと、新しいモデルが使用されていることを示すログが表示されます。
10. ユーザーのフィードバックとコンバージョンを追跡してモデルの精度を測定する
Firebase 向け Google アナリティクスは、ユーザーがアプリケーション内をどのように移動し、どこで成功し、どこで行き詰まって引き返すかを理解する方法を提供します。また、アプリケーションで最もよく使用される部分を理解するためにも使用できます。
モデルの予測に関するユーザーのフィードバックを追跡することで、モデルの精度を測定します。ユーザーが「はい」をクリックすると、予測が正確であったことが示されます。
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
関数で、 correct_inference
イベントを Firebase に記録するように onclick リスナーを設定します。
MainActivity.kt (作成時)
// Setup YES button
yesButton?.setOnClickListener {
Firebase.analytics.logEvent("correct_inference", null)
}
アプリを再度実行し、数字を描画します。 「はい」ボタンを数回押して、推論が正確であるというフィードバックを送信します。
デバッグ分析
通常、アプリによって記録されたイベントは、約 1 時間にわたってまとめられ、一緒にアップロードされます。このアプローチにより、エンド ユーザーのデバイスのバッテリーが節約され、ネットワーク データの使用量が削減されます。ただし、分析の実装を検証する目的 (および DebugView レポートで分析を表示するため) を目的として、開発デバイスでデバッグ モードを有効にして、最小限の遅延でイベントをアップロードできます。
Android デバイスで分析デバッグ モードを有効にするには、次のコマンドを実行します。
adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier
アプリを再度実行し、数字を描画します。 「はい」ボタンを数回押して、推論が正確であるというフィードバックを送信します。 Firebase コンソールのデバッグ ビューを介して、ほぼリアルタイムでログ イベントを表示できるようになりました。左側のナビゲーション バーから [Analytics] > [DebugView] をクリックします。
11. モデルのパフォーマンスを分析する
Firebase Performance Monitoring は、iOS、Android、ウェブ アプリのパフォーマンス特性を把握するのに役立つサービスです。
Performance Monitoring SDK を使用してアプリからパフォーマンス データを収集し、Firebase コンソールでそのデータを確認して分析します。パフォーマンス監視は、アプリのパフォーマンスをいつどこで改善できるかを理解し、その情報を使用してパフォーマンスの問題を修正できるようにするのに役立ちます。
ここでは、推論とダウンロードに関するパフォーマンス トレースを追加します。
深層学習で使用されるモデルが大きいほど精度が高くなる可能性がありますが、応答を返すまでに時間がかかる可能性があるため、これは重要です。私たちの実験では、精度と速度の適切なバランスを見つけようとしています。
Firebase パフォーマンスの依存関係を追加する
プロジェクト/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 を作成し、モデルをダウンロードする直前にそれを開始します。次に、トレースを停止する onsuccess リスナーを追加します。
classifyDrawing()
関数で新しいclassifyTraceを作成し、分類の直前にそれを開始します。次に、onsuccess リスナーでトレースを停止します。
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)
}
}
}
パフォーマンス イベントのログ メッセージを表示する
- 次のように、アプリの
AndroidManifest.xml
ファイルに<meta-data>
要素を追加して、ビルド時にパフォーマンス モニタリングのデバッグ ログを有効にします。
AndroidManifest.xml
<application>
<meta-data
android:name="firebase_performance_logcat_enabled"
android:value="true" />
</application>
- ログ メッセージにエラー メッセージがないか確認してください。
- Performance Monitoring は、ログ メッセージに
FirebasePerformance
のタグを付けます。 logcat フィルタリングを使用すると、次のコマンドを実行して期間トレースと HTTP/S ネットワーク リクエストのログを具体的に表示できます。
adb logcat -s FirebasePerformance
- パフォーマンス監視がパフォーマンス イベントをログに記録していることを示す、次の種類のログを確認します。
-
Logging TraceMetric
-
Logging NetworkRequestMetric
12. 2 番目のモデルを Firebase ML にデプロイする
より優れたモデル アーキテクチャを備えたモデルや、より大規模なデータセットや更新されたデータセットでトレーニングされたモデルなど、モデルの新しいバージョンを思いついたとき、現在のモデルを新しいバージョンに置き換えたくなるかもしれません。ただし、テストで良好なパフォーマンスを発揮したモデルが、本番環境でも同様に良好なパフォーマンスを発揮するとは限りません。したがって、本番環境で A/B テストを実行して、元のモデルと新しいモデルを比較してみましょう。
Firebase モデル管理 API を有効にする
このステップでは、Firebase Model Management API を有効にして、Python コードを使用して TensorFlow Lite モデルの新しいバージョンをデプロイします。
ML モデルを保存するバケットを作成する
Firebase コンソールで、[ストレージ] に移動し、[開始する] をクリックします。
ダイアログに従ってバケットを設定します。
Firebase ML API を有効にする
Google Cloud Console のFirebase ML API ページに移動し、[有効にする] をクリックします。
尋ねられたら、Digit Classifier アプリを選択します。
新しいモデルをトレーニングして Firebase ML に公開する
次に、より大きなデータセットを使用して新しいバージョンのモデルをトレーニングし、Firebase Admin SDK を使用してトレーニング ノートブックからプログラムで直接デプロイします。
サービスアカウントの秘密キーをダウンロードする
Firebase Admin SDK を使用する前に、サービス アカウントを作成する必要があります。このリンクをクリックして Firebase コンソールの [サービス アカウント] パネルを開き、ボタンをクリックして Firebase Admin SDK の新しいサービス アカウントを作成します。プロンプトが表示されたら、「新しい秘密キーを生成」ボタンをクリックします。 colab ノートブックからのリクエストを認証するためにサービス アカウント キーを使用します。
これで、新しいモデルをトレーニングしてデプロイできるようになりました。
- このcolab ノートブックを開いて、自分のドライブにコピーを作成します。
- 最初のセル「改良された TensorFlow Lite モデルのトレーニング」の左側にある再生ボタンをクリックして実行します。これにより新しいモデルがトレーニングされるため、時間がかかる場合があります。
- 2 番目のセルを実行すると、ファイルのアップロード プロンプトが作成されます。サービス アカウントの作成時に Firebase コンソールからダウンロードした json ファイルをアップロードします。
- 最後の 2 つのセルを実行します。
colab ノートブックを実行すると、Firebase コンソールに 2 番目のモデルが表示されるはずです。 2 番目のモデルの名前がmnist_v2
であることを確認します。
13. Remote Config でモデルを選択します
2 つの別々のモデルができたので、実行時にどちらのモデルをダウンロードするかを選択するためのパラメーターを追加します。クライアントが受け取るパラメータの値によって、クライアントがダウンロードするモデルが決まります。
Firebase コンソールに構成ルールを追加する
まず、Firebase コンソールを開き、左側のナビゲーション メニューにある [Remote Config] ボタンをクリックします。次に、「パラメータの追加」ボタンをクリックします。
新しいパラメータにmodel_name
という名前を付け、デフォルト値"mnist_v1"
を指定します。モデルの名前をリモート構成パラメーターに入れることで、テストしたいモデルごとに新しいパラメーターを追加することなく、複数のモデルをテストできます。 「変更の公開」をクリックして更新を適用します。
Firebase RemoteConfig 依存関係を追加する
app/build.gradle.kts
implementation("com.google.firebase:firebase-config-ktx")
Firebase リモート構成を構成する
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.")
}
}
}
リモート構成のテスト
- クリック
実行ボタン。
- mnist_v1 モデルがダウンロードされたことを示すトースト メッセージが表示されることを確認します。
- Firebase コンソールに戻り、デフォルト値を mnist_v2 に変更し、 [変更の公開]を選択して更新を適用します。
- アプリを再起動し、今回は mnist_v2 モデルがダウンロードされたことを示すトースト メッセージを確認します。
14. A/B テストモデルの有効性
Firebase A/B Testing は、製品やマーケティングの実験を簡単に実行、分析、拡張できるようにすることで、アプリ エクスペリエンスを最適化するのに役立ちます。最後に、Firebase の組み込み A/B テスト動作を使用して、2 つのモデルのどちらのパフォーマンスが優れているかを確認できます。
Firebase コンソールで [分析] -> [イベント] に移動します。 correct_inference
イベントが表示されている場合は、「コンバージョン イベント」としてマークします。表示されていない場合は、「分析」→「コンバージョン イベント」に移動し、「新しいコンバージョン イベントの作成」をクリックして、 correct_inference.
次に、Firebase コンソールの「Remote Config」に移動し、先ほど追加した「model_name」パラメータのその他のオプション メニューから「A/B テスト」ボタンを選択します。
続くメニューでは、デフォルトの名前を受け入れます。
ドロップダウンでアプリを選択し、ターゲティング基準をアクティブ ユーザーの 50% に変更します。
以前にcorrect_inference
イベントをコンバージョンとして設定できた場合は、このイベントを追跡する主要な指標として使用します。それ以外の場合、Analytics にイベントが表示されるまで待ちたくない場合は、 correct_inference
manually
追加できます。
最後に、[バリアント]画面で、コントロール グループのバリアントがmnist_v1
を使用するように設定し、バリアント A グループがmnist_v2
を使用するように設定します。
右下隅にある「レビュー」ボタンをクリックします。
おめでとうございます。2 つの異なるモデルの A/B テストが正常に作成されました。 A/B テストは現在ドラフト状態にあり、[実験を開始] ボタンをクリックすることでいつでも開始できます。
A/B テストの詳細については、 A/B テストのドキュメントを参照してください。
15. おめでとうございます!
このコードラボでは、アプリ内の静的にバンドルされた tflite アセットを、Firebase から動的にロードされた TFLite モデルに置き換える方法を学習しました。 TFLite と Firebase について詳しくは、他の TFLite サンプルと Firebase スタート ガイドをご覧ください。
私たちがカバーした内容
- TensorFlow Lite
- Firebase ML
- Firebase アナリティクス
- Firebaseのパフォーマンスモニタリング
- Firebaseリモート設定
- Firebase A/B テスト
次のステップ
- アプリに Firebase ML デプロイメントを実装します。