TFLite を利用した Android アプリに Firebase を追加する

1。概要

cd824ecfd05a2822.png

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ディレクトリ ( android_studio_folder.png ) サンプル コードをダウンロードします ( [ファイル] > [開く] > [.../codelab-digitalclassifier-android/start])。

これで、Android Studio で開始プロジェクトが開いたはずです。

4.スターターアプリを実行します

プロジェクトを Android Studio にインポートしたので、アプリを初めて実行する準備が整いました。 Android デバイスを接続し、 「実行」( 実行.png )Android Studio ツールバー。

アプリがデバイス上で起動するはずです。この時点で、数字を描画してみると、アプリはそれを認識できるはずです。

6e36e1b947b395f2.png

5. Firebaseコンソールプロジェクトを作成する

Firebaseをプロジェクトに追加する

  1. Firebase コンソールに移動します。
  2. [プロジェクトの追加]を選択します。
  3. プロジェクト名を選択または入力します。
  4. Firebase コンソールで残りのセットアップ手順に従い、[プロジェクトの作成] (既存の Google プロジェクトを使用している場合は [Firebase を追加]) をクリックします。

6. Firebaseを追加する

  1. 新しいプロジェクトの概要画面で、Android アイコンをクリックしてセットアップ ワークフローを起動します。
  2. コードラボのパッケージ名を入力します: 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 デバイスを接続し、 「実行」( 実行.png )Android Studio ツールバー。

アプリがデバイス上で起動するはずです。この時点では、アプリはまだ正常にビルドされているはずです。

8. モデルを Firebase ML にデプロイする

モデルを Firebase ML にデプロイすると、主に次の 2 つの理由で役立ちます。

  1. アプリのインストール サイズを小さく保ち、必要な場合にのみモデルをダウンロードできます。
  2. モデルは定期的に更新でき、アプリ全体とは異なるリリース サイクルで更新できます。

アプリ内の静的モデルを Firebase から動的にダウンロードしたモデルに置き換える前に、それを Firebase ML にデプロイする必要があります。モデルは、コンソール経由で、または Firebase Admin SDK を使用してプログラムでデプロイできます。このステップでは、コンソール経由でデプロイします。

物事を簡単にするために、アプリにすでに含まれている TensorFlow Lite モデルを使用します。まず、Firebase コンソールを開き、左側のナビゲーション パネルで [機械学習] をクリックします。初めて開く場合は、「始める」をクリックしてください。次に、[カスタム] に移動し、[カスタム モデルの追加] ボタンをクリックします。

プロンプトが表示されたら、モデルにmnist_v1のようなわかりやすい名前を付け、 start/app/src/main/assets/mnist.tfliteの下の codelab プロジェクト ディレクトリからファイルをアップロードします。その後、この TF Lite モデル ファイルを Android プロジェクトから削除できます。

3c3c50e6ef12b3b.png

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] をクリックします。

5276199a086721fd.png

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)
        }
    }
  }

パフォーマンス イベントのログ メッセージを表示する

  1. 次のように、アプリのAndroidManifest.xmlファイルに<meta-data>要素を追加して、ビルド時にパフォーマンス モニタリングのデバッグ ログを有効にします。

AndroidManifest.xml

<application>
    <meta-data
      android:name="firebase_performance_logcat_enabled"
      android:value="true" />
</application>
  1. ログ メッセージにエラー メッセージがないか確認してください。
  2. Performance Monitoring は、ログ メッセージにFirebasePerformanceのタグを付けます。 logcat フィルタリングを使用すると、次のコマンドを実行して期間トレースと HTTP/S ネットワーク リクエストのログを具体的に表示できます。
adb logcat -s FirebasePerformance
  1. パフォーマンス監視がパフォーマンス イベントをログに記録していることを示す、次の種類のログを確認します。
  • Logging TraceMetric
  • Logging NetworkRequestMetric

12. 2 番目のモデルを Firebase ML にデプロイする

より優れたモデル アーキテクチャを備えたモデルや、より大規模なデータセットや更新されたデータセットでトレーニングされたモデルなど、モデルの新しいバージョンを思いついたとき、現在のモデルを新しいバージョンに置き換えたくなるかもしれません。ただし、テストで良好なパフォーマンスを発揮したモデルが、本番環境でも同様に良好なパフォーマンスを発揮するとは限りません。したがって、本番環境で A/B テストを実行して、元のモデルと新しいモデルを比較してみましょう。

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

このステップでは、Firebase Model Management API を有効にして、Python コードを使用して TensorFlow Lite モデルの新しいバージョンをデプロイします。

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

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

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

19517c0d6d2aa14d.png

Firebase ML API を有効にする

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

2414fd5cced6c984.png尋ねられたら、Digit Classifier アプリを選択します。

新しいモデルをトレーニングして Firebase ML に公開する

次に、より大きなデータセットを使用して新しいバージョンのモデルをトレーニングし、Firebase Admin SDK を使用してトレーニング ノートブックからプログラムで直接デプロイします。

サービスアカウントの秘密キーをダウンロードする

Firebase Admin SDK を使用する前に、サービス アカウントを作成する必要があります。このリンクをクリックして Firebase コンソールの [サービス アカウント] パネルを開き、ボタンをクリックして Firebase Admin SDK の新しいサービス アカウントを作成します。プロンプトが表示されたら、「新しい秘密キーを生成」ボタンをクリックします。 colab ノートブックからのリクエストを認証するためにサービス アカウント キーを使用します。

c3b95de1e5508516.png

これで、新しいモデルをトレーニングしてデプロイできるようになりました。

  1. このcolab ノートブックを開いて、自分のドライブにコピーを作成します。
  2. 最初のセル「改良された TensorFlow Lite モデルのトレーニング」の左側にある再生ボタンをクリックして実行します。これにより新しいモデルがトレーニングされるため、時間がかかる場合があります。
  3. 2 番目のセルを実行すると、ファイルのアップロード プロンプトが作成されます。サービス アカウントの作成時に Firebase コンソールからダウンロードした json ファイルをアップロードします。

71e847c6a85423b3.png

  1. 最後の 2 つのセルを実行します。

colab ノートブックを実行すると、Firebase コンソールに 2 番目のモデルが表示されるはずです。 2 番目のモデルの名前がmnist_v2であることを確認します。

c316683bb4d75d57.png

13. Remote Config でモデルを選択します

2 つの別々のモデルができたので、実行時にどちらのモデルをダウンロードするかを選択するためのパラメーターを追加します。クライアントが受け取るパラメータの値によって、クライアントがダウンロードするモデルが決まります。

Firebase コンソールに構成ルールを追加する

まず、Firebase コンソールを開き、左側のナビゲーション メニューにある [Remote Config] ボタンをクリックします。次に、「パラメータの追加」ボタンをクリックします。

新しいパラメータにmodel_nameという名前を付け、デフォルト値"mnist_v1"を指定します。モデルの名前をリモート構成パラメーターに入れることで、テストしたいモデルごとに新しいパラメーターを追加することなく、複数のモデルをテストできます。 「変更の公開」をクリックして更新を適用します。

2949cb95c7214ca4.png

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

リモート構成のテスト

  1. クリック98205811bbed9d74.png実行ボタン。
  2. mnist_v1 モデルがダウンロードされたことを示すトースト メッセージが表示されることを確認します。
  3. Firebase コンソールに戻り、デフォルト値を mnist_v2 に変更し、 [変更の公開]を選択して更新を適用します。
  4. アプリを再起動し、今回は 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 テスト」ボタンを選択します。

fad5ea36969d2aeb.png

続くメニューでは、デフォルトの名前を受け入れます。

d7c006669ace6e40.png

ドロップダウンでアプリを選択し、ターゲティング基準をアクティブ ユーザーの 50% に変更します。

cb72dcc7d2666bd3.png

以前にcorrect_inferenceイベントをコンバージョンとして設定できた場合は、このイベントを追跡する主要な指標として使用します。それ以外の場合、Analytics にイベントが表示されるまで待ちたくない場合は、 correct_inference manually追加できます。

1ac9c94fb3159271.png

最後に、[バリアント]画面で、コントロール グループのバリアントがmnist_v1を使用するように設定し、バリアント A グループがmnist_v2を使用するように設定します。

e4510434f8da31b6.png

右下隅にある「レビュー」ボタンをクリックします。

おめでとうございます。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 デプロイメントを実装します。

もっと詳しく知る

質問があります?

問題を報告する