将 Firebase 添加到基于 TFLite 的 Android 应用

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

一、概述

cd824ecfd05a2822.png

Firebase ML 使您能够通过无线方式部署模型。这使您可以保持应用程序较小,仅在需要时下载 ML 模型、试验多个模型或更新您的 ML 模型,而无需重新发布整个应用程序。

在此 Codelab 中,您将使用静态 TFLite 模型的 Android 应用程序转换为使用 Firebase 动态提供的模型的应用程序。

你会学到什么

  • 将 TFLite 模型部署到 Firebase ML 并从您的应用访问它们
  • 使用 Firebase Analytics 跟踪用户反馈以衡量模型的准确性
  • 通过 Firebase 性能分析模型性能
  • 选择通过远程配置加载多个部署模型中的哪一个
  • 通过 Firebase A/B 测试试验不同的模型

你需要什么

  • Android Studio 版本 3.4+。
  • 示例代码。
  • 具有 Android 2.3+ 和 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-digitclassifier-android/start)。

您现在应该在 Android Studio 中打开了启动项目。

4. 运行入门应用

现在您已将项目导入 Android Studio,您已准备好首次运行该应用程序。连接您的 Android 设备,然后单击运行( 执行.png ) 在 Android Studio 工具栏中。

该应用程序应在您的设备上启动。此时,如果您尝试绘制一个数字,应用程序应该能够识别它。

6e36e1b947b395f2.png

5. 创建 Firebase 控制台项目

将 Firebase 添加到项目中

  1. 转到Firebase 控制台
  2. 选择添加项目
  3. 选择或输入项目名称。
  4. 按照 Firebase 控制台中的其余设置步骤操作,然后点击创建项目(或添加 Firebase,如果您使用的是现有的 Google 项目)。

6. 添加火力基地

  1. 在新项目的概览屏幕中,单击 Android 图标以启动设置工作流程。
  2. 输入codelab的包名: 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 文件的顶部:

应用程序/build.gradle

apply plugin: 'com.google.gms.google-services'

然后将以下行添加到项目中 build.gradle 文件的dependencies项部分:

项目/build.gradle

classpath 'com.google.gms:google-services:4.3.13'

将您的项目与 gradle 文件同步

为确保您的应用程序可以使用所有依赖项,此时您应该将项目与 gradle 文件同步。从 Android Studio 工具栏中选择File > Sync Project with Gradle Files

7. 使用 Firebase 运行应用

现在您已经使用 JSON 文件配置了google-services插件,您可以使用 Firebase 运行该应用程序了。连接您的 Android 设备,然后单击运行( 执行.png ) 在 Android Studio 工具栏中。

该应用程序应在您的设备上启动。此时,您的应用程序应该仍然可以成功构建。

8. 将模型部署到 Firebase ML

将模型部署到 Firebase ML 非常有用,主要有两个原因:

  1. 我们可以保持应用程序安装大小较小,仅在需要时下载模型
  2. 该模型可以定期更新,并且发布周期与整个应用程序不同

在我们可以将应用中的静态模型替换为从 Firebase 动态下载的模型之前,我们需要将其部署到 Firebase ML。该模型可以通过控制台部署,也可以使用 Firebase Admin SDK 以编程方式部署。在这一步中,我们将通过控制台进行部署。

为简单起见,我们将使用我们应用中已有的 TensorFlow Lite 模型。首先,打开 Firebase 控制台并单击左侧导航面板中的机器学习。如果您是第一次打开,请单击“开始”。然后导航到“自定义”并单击“添加自定义模型”按钮。

出现提示时,给模型起一个描述性名称,例如mnist_v1 ,然后从 codelab 项目目录的start/app/src/main/assets/mnist.tflite下上传文件。然后你可以从 Android 项目中删除这个 TF Lite 模型文件。

3c3c50e6ef12b3b.png

9. 从 Firebase ML 下载模型

选择何时将远程模型从 Firebase 下载到您的应用中可能会很棘手,因为 TFLite 模型可能会变得相对较大。理想情况下,我们希望避免在应用程序启动时立即加载模型,因为如果我们的模型仅用于一个功能并且用户从不使用该功能,我们将无缘无故下载大量数据。我们还可以设置下载选项,例如仅在连接到 wifi 时获取模型。如果您想确保模型在没有网络连接的情况下也可用,那么在没有应用程序的情况下捆绑它作为备份也很重要。

为简单起见,我们将删除默认捆绑模型,并始终在应用启动时从 Firebase 下载模型。这样,在运行数字识别时,您可以确保推理正在使用 Firebase 提供的模型运行。

在 app/build.gradle 文件中,添加 Firebase 机器学习依赖项

应用程序/build.gradle

implementation 'com.google.firebase:firebase-ml-modeldownloader:24.0.4'

然后添加逻辑以从 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.")
      }
  }

重新运行您的应用程序并在数字分类器中绘制一个数字。下载完成后,您应该会看到一条提示远程模型已下载的 Toast 消息,以及指示您的新模型正在使用的日志。

10.跟踪用户反馈和转换以衡量模型准确性

Google Analytics for Firebase 为您提供了一种方法,让您了解用户在您的应用程序中的移动方式、他们在哪里成功以及他们在哪里卡住并返回。它还可用于了解应用程序中最常用的部分。

我们将通过跟踪用户对模型预测的反馈来衡量模型的准确性。如果用户单击“是”,则表明预测是准确的。

我们可以记录一个分析事件来跟踪我们模型的准确性。首先,我们必须将 Analytics 添加到依赖项中,然后才能在项目中使用:

添加 Firebase Analytics 依赖项

应用程序/build.gradle

implementation 'com.google.firebase:firebase-analytics-ktx:21.1.0'

记录事件

然后在onCreate函数中,我们将设置 onclick 侦听器以将correct_inference事件记录到 Firebase。

MainActivity.kt (onCreate)

// Setup YES button
yesButton?.setOnClickListener {
  Firebase.analytics.logEvent("correct_inference", null)
}

再次运行应用程序并绘制一个数字。按下“是”按钮几次以发送推断是准确的反馈。

调试分析

通常,您的应用程序记录的事件会在大约一小时的时间内一起批处理并一起上传。这种方法可以节省最终用户设备的电池电量并减少网络数据使用量。但是,为了验证您的分析实施(以及为了在 DebugView 报告中查看您的分析),您可以在开发设备上启用调试模式以最小延迟上传事件。

要在 Android 设备上启用分析调试模式,请执行以下命令:

adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier

再次运行应用程序并绘制一个数字。按下“是”按钮几次以发送推断是准确的反馈。现在,您可以通过 Firebase 控制台中的调试视图近乎实时地查看日志事件。从左侧导航栏中单击 Analytics > DebugView。

5276199a086721fd.png

11. 分析模型的性能

Firebase 性能监控是一项服务,可帮助您深入了解 iOS、Android 和 Web 应用的性能特征。

您可以使用性能监控 SDK 从您的应用收集性能数据,然后在 Firebase 控制台中查看和分析这些数据。性能监控可帮助您了解可以在何处以及何时改进应用程序的性能,以便您可以使用该信息来解决性能问题。

在这里,我们在推理和下载周围添加性能跟踪

这很重要,因为深度学习中使用的较大模型可能更准确,但它们也可能需要更长的时间才能返回响应。在我们的实验中,我们试图在准确性和速度之间找到适当的平衡。

添加 Firebase 性能依赖项

项目/build.gradle

buildscript {

  // ...

    dependencies {
      // ...

      // Add the dependency for the Performance Monitoring plugin
      classpath 'com.google.firebase:perf-plugin:1.4.1'  // Performance Monitoring plugin
    }
}

应用程序/build.gradle

// Apply the Performance Monitoring plugin
apply plugin: 'com.google.firebase.firebase-perf'

// ...

dependencies {
  // ...

  // Add the dependency for the Performance Monitoring library
  implementation 'com.google.firebase:firebase-perf:20.1.0'
}

添加自定义跟踪

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. 通过将<meta-data>元素添加到应用的AndroidManifest.xml文件中,在构建时启用性能监控的调试日志记录,如下所示:

AndroidManifest.xml

<application>
    <meta-data
      android:name="firebase_performance_logcat_enabled"
      android:value="true" />
</application>
  1. 检查您的日志消息中是否有任何错误消息。
  2. 性能监控使用FirebasePerformance标记其日志消息。使用 logcat 过滤,您可以通过运行以下命令来专门查看持续时间跟踪和 HTTP/S 网络请求日志记录:
adb logcat -s FirebasePerformance
  1. 检查以下类型的日志,这些日志表明性能监控正在记录性能事件:
  • Logging TraceMetric
  • Logging NetworkRequestMetric

12. 将第二个模型部署到 Firebase ML

当提出模型的新版本时,例如具有更好模型架构的模型或在更大或更新的数据集上训练的模型,我们可能会想用新版本替换我们当前的模型。但是,在测试中表现良好的模型不一定在生产中表现同样好。因此,让我们在生产中进行 A/B 测试来比较我们的原始模型和新模型。

启用 Firebase 模型管理 API

在这一步中,我们将启用 Firebase 模型管理 API 以使用 Python 代码部署新版本的 TensorFlow Lite 模型。

创建一个存储桶来存储您的 ML 模型

在您的 Firebase 控制台中,转到存储并单击开始。 fbbea78f0eb3dc9f.png

按照对话设置您的存储桶。

19517c0d6d2aa14d.png

启用 Firebase 机器学习 API

转到 Google Cloud Console 上的Firebase ML API 页面,然后单击启用。

2414fd5cced6c984.png询问时选择数字分类器应用程序。

训练新模型并发布到 Firebase ML

现在,我们将使用更大的数据集训练模型的新版本,然后使用 Firebase Admin SDK 直接从训练笔记本以编程方式部署它。

下载服务帐户的私钥

在我们可以使用 Firebase Admin SDK 之前,我们需要创建一个服务帐户。单击此链接打开 Firebase 控制台的服务帐户面板,然后单击按钮为 Firebase Admin SDK 创建一个新的服务帐户。出现提示时,单击“生成新私钥”按钮。我们将使用服务帐户密钥来验证来自 colab 笔记本的请求。

c3b95de1e5508516.png

现在我们可以训练和部署新模型了。

  1. 打开这个colab notebook并在你自己的 Drive 下复制一份。
  2. 通过单击左侧的播放按钮运行第一个单元格“训练改进的 TensorFlow Lite 模型”。这将训练一个新模型,可能需要一些时间。
  3. 运行第二个单元格将创建一个文件上传提示。上传您在创建服务帐户时从 Firebase 控制台下载的 json 文件。

71e847c6a85423b3.png

  1. 运行最后两个单元格。

运行 colab 笔记本后,您应该会在 Firebase 控制台中看到第二个模型。确保第二个模型名为mnist_v2

c316683bb4d75d57.png

13.通过远程配置选择模型

现在我们有两个独立的模型,我们将添加一个参数来选择在运行时下载哪个模型。客户端接收到的参数值将决定客户端下载哪个模型。

在 Firebase 控制台中添加配置规则

首先,打开 Firebase 控制台并单击左侧导航菜单中的远程配置按钮。然后,单击“添加参数”按钮。

将新参数命名为model_name并为其指定默认值"mnist_v1" 。通过将模型的名称放在远程配置参数中,我们可以测试多个模型,而无需为要测试的每个模型添加新参数。单击发布更改以应用更新。

2949cb95c7214ca4.png

添加 Firebase RemoteConfig 依赖项

应用程序/build.gradle

implementation 'com.google.firebase:firebase-config-ktx:21.1.1'

配置 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 模型的 Toast 消息。
  3. 返回 Firebase 控制台,将默认值更改为 mnist_v2 并选择Publish Changes以应用更新。
  4. 重启应用,查看 Toast 消息,提示本次下载了 mnist_v2 模型。

14. A/B 测试模型的有效性

Firebase A/B 测试可帮助您轻松运行、分析和扩展产品和营销实验,从而优化您的应用体验。最后,我们可以使用 Firebase 的内置 A/B 测试行为来查看我们的两个模型中哪一个表现更好。

转到 Firebase 控制台中的分析 -> 事件。如果显示了correct_inference事件,请将其标记为“Conversion event”,如果没有,您可以转到Analytics -> Conversion Events并点击“Create a New Conversion Event”并correct_inference.

现在转到 Firebase 控制台中的“远程配置”,从我们刚刚添加的“model_name”参数的更多选项菜单中选择“A/B 测试”按钮。

fad5ea36969d2aeb.png

在随后的菜单中,接受默认名称。

d7c006669ace6e40.png

在下拉列表中选择您的应用,并将定位条件更改为 50% 的活跃用户。

cb72dcc7d2666bd3.png

如果您之前能够将correct_inference事件设置为转化,请将此事件用作跟踪的主要指标。否则,如果您不想等待事件显示在 Analytics 中,您可以manually添加correct_inference

1ac9c94fb3159271.png

最后,在 Variants 屏幕上,将您的控制组变体设置为使用mnist_v1并将您的 Variant A 组设置为使用mnist_v2

e4510434f8da31b6.png

单击右下角的查看按钮。

恭喜,您已成功为您的两个独立模型创建了 A/B 测试! A/B 测试目前处于草稿状态,可随时点击“开始实验”按钮启动。

要详细了解 A/B 测试,请查看A/B 测试文档

15. 恭喜!

在此 Codelab 中,您了解了如何使用 Firebase 中动态加载的 TFLite 模型替换应用中静态捆绑的 tflite 资产。要了解有关 TFLite 和 Firebase 的更多信息,请查看其他 TFLite 示例和 Firebase 入门指南。

我们涵盖的内容

  • TensorFlow 精简版
  • Firebase 机器学习
  • Firebase 分析
  • Firebase 性能监控
  • Firebase 远程配置
  • Firebase A/B 测试

下一步

  • 在您的应用中实施 Firebase ML 部署。

学到更多

有一个问题?

报告问题