将 Firebase 添加到由 TFLite 提供支持的 Android 应用

1. 概览

cd824ecfd05a2822.png

借助 Firebase ML,您可以通过无线方式部署模型。这样一来,您可以缩减应用大小,仅在需要时下载机器学习模型、对多个模型进行实验或更新机器学习模型,而无需重新发布整个应用。

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

学习内容

  • 将 TFLite 模型部署到 Firebase ML 并从您的应用访问这些模型
  • 使用 Firebase Analytics 跟踪用户反馈以衡量模型准确率
  • 通过 Firebase Performance 分析模型性能
  • 选择通过 Remote Config 加载多个已部署模型中的哪一个
  • 通过 Firebase A/B Testing 使用不同模型进行实验

所需条件

  • 最新 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) (File > Open > .../codelab-digitclassifier-android/start)。

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

4.运行起始应用

现在,您已将项目导入 Android Studio,可以首次运行应用了。连接 Android 设备,然后点击 Android Studio 工具栏中的 Run ( 执行.png)。

应用应在您的设备上启动。此时,如果您尝试画出一个数字,应用应该可以识别该数字。

6e36e1b947b395f2

5. 创建 Firebase 控制台项目

将 Firebase 添加到项目

  1. 前往 Firebase 控制台
  2. 选择添加项目
  3. 选择或输入项目名称。
  4. 在 Firebase 控制台中完成剩下的设置步骤,然后点击“创建项目”(如果您使用的是现有 Google 项目,则点击“添加 Firebase”)。

6. 添加 Firebase

  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.kts 文件顶部的 plugins 代码块中:

app/build.gradle.kts

id("com.google.gms.google-services")

然后将以下代码行添加到项目中 build.gradle.kts 文件的 plugins 代码块中:

project/build.gradle.kts

id("com.google.gms.google-services") version "4.3.15" apply false

将项目与 Gradle 文件同步

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

7. 使用 Firebase 运行应用

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

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

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

9. 从 Firebase ML 下载模型

选择何时从 Firebase 将远程模型下载到应用可能会很困难,因为 TFLite 模型可能会变得相对较大。理想情况下,我们希望避免在应用启动时立即加载模型,因为如果模型仅用于一项功能,而用户从未使用该功能,我们就会无缘无故下载大量数据。我们还可以设置下载选项,例如在连接到 Wi-Fi 时仅提取模型。如果要确保模型在没有网络连接的情况下也可使用,务必将模型打包,但不将应用作为备用。

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

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

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. 跟踪用户反馈和转化情况,以衡量模型准确率

Google Analytics for Firebase 通过一种方式,可帮助您了解用户在应用中的移动方式、他们在哪些方面取得成功,以及在哪些方面卡住不动并回访。它还可用于了解应用中最常用的部分。

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

我们可以记录 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 函数中,我们将设置 onClick 监听器,以便将 correct_inference 事件记录到 Firebase 中。

MainActivity.kt (onCreate)

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

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

调试分析

通常,应用程序所记录的事件会在大约一小时的时间内一起批量上传,并一起上传。这种方法可以节省最终用户设备的电量并减少网络流量消耗。不过,为了验证您的分析实现效果(以及为了在 DebugView 报告中查看您的分析),您可以在开发设备上启用调试模式,以尽可能减少延迟上传事件。

要在 Android 设备上启用 Google Analytics(分析)“调试”模式,请执行以下命令:

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

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

5276199a086721fd.png

11. 分析模型的性能

Firebase Performance Monitoring 服务可帮助您深入了解 iOS、Android 和 Web 应用的性能特征。

您可以使用 Performance Monitoring SDK 收集应用的性能数据,然后在 Firebase 控制台中查看和分析这些数据。Performance Monitoring 可帮助您了解何时可以改进应用性能以及改进哪些方面,以便您根据这些信息来修复性能问题。

在这里,我们围绕推断和下载添加了性能跟踪

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

添加 Firebase Performance 依赖项

project/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. 您可以在构建时为 Performance Monitoring 启用调试日志记录功能,方法是在应用的 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/HTTPS 网络请求日志记录:
adb logcat -s FirebasePerformance
  1. 检查以下类型的日志,这些日志表明 Performance Monitoring 正在记录性能事件:
  • Logging TraceMetric
  • Logging NetworkRequestMetric

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

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

启用 Firebase Model Management API

在此步骤中,我们将启用 Firebase Model Management API,以使用 Python 代码部署 TensorFlow Lite 模型的新版本。

创建存储分区以存储机器学习模型

在 Firebase 控制台中,点击“Storage”(开始),然后点击“Get started”(开始使用)。fbbea78f0eb3dc9f.png

按照对话框设置存储分区。

19517c0d6d2aa14d.png

启用 Firebase ML API

转到 Google Cloud 控制台上的 Firebase ML API 页面,然后点击“启用”。

2414fd5cced6c984.png当系统询问时,选择 Digit Classifier 应用。

训练新模型并发布到 Firebase ML

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

下载服务帐号的私钥

在使用 Firebase Admin SDK 之前,我们需要创建一个服务帐号。点击此链接,打开 Firebase 控制台的“服务帐号”面板,然后点击该按钮,即可为 Firebase Admin SDK 创建新的服务帐号。出现提示时,点击“Generate New Private Key”(生成新私钥)按钮。我们将使用该服务帐号密钥对来自 Colab 笔记本的请求进行身份验证。

c3b95de1e5508516

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

  1. 打开此 Colab 笔记本,并在您自己的云端硬盘下创建一份副本。
  2. 点击第一个单元左侧的播放按钮,运行第一个单元“训练改进的 TensorFlow Lite 模型”。这将训练新模型,可能需要一些时间。
  3. 运行第二个单元格将会创建一个文件上传提示。上传您在创建服务帐号时从 Firebase 控制台下载的 JSON 文件。

71e847c6a85423b3

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

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

c316683bb4d75d57

13. 通过 Remote Config 选择模型

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

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

首先,打开 Firebase 控制台,点击左侧导航菜单中的“Remote Config”按钮。然后,点击“添加参数”按钮。

将新参数命名为 model_name,并将其默认值设为 "mnist_v1"。通过将模型名称放入 Remote Config 参数中,我们可以测试多个模型,而无需为要测试的每个模型添加新参数。点击发布更改以应用更新。

2949cb95c7214ca4

添加 Firebase RemoteConfig 依赖项

app/build.gradle.kts

implementation("com.google.firebase:firebase-config-ktx")

配置 Firebase Remote Config

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

测试 Remote Config

  1. 点击 98205811bbed9d74Run 按钮。
  2. 检查您是否看到消息框消息,告知您 mnist_v1 模型已下载。
  3. 返回 Firebase 控制台,将默认值更改为 mnist_v2,然后选择发布更改以应用更新。
  4. 重启应用,并查看消息框消息,指明这次 mnist_v2 模型已下载。

14. A/B 测试模型效果

Firebase A/B Testing 可让您轻松地运行、分析并大规模开展产品和营销实验,从而帮助您优化应用体验。最后,我们可以使用 Firebase 的内置 A/B Testing 行为来了解两个模型中哪个效果更好。

在 Firebase 控制台中依次点击“分析”->“事件”。如果显示的是 correct_inference 事件,请将其标记为“转化事件”。如果没有,您可以依次转到“Google Analytics(分析)”->“转化事件”并点击“创建新的转化事件”,然后放置 correct_inference.

现在,前往 Firebase 控制台中的“Remote Config”,从我们刚刚添加的“model_name”参数的“更多选项”菜单中选择“A/B test”按钮。

fad5ea36969d2aeb

在接下来出现的菜单中,接受默认名称。

d7c006669ace6e40.png

从下拉菜单中选择您的应用,然后将定位条件更改为活跃用户的 50%。

cb72dcc7d2666bd3.png

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

1ac9c94fb3159271.png

最后,在“变体”屏幕上,将对照组变体设为使用“mnist_v1”,将变体 A 组设为使用“mnist_v2”。

e4510434f8da31b6

点击右下角的“审核”按钮。

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

如需详细了解 A/B 测试,请参阅 A/B Testing 文档

15. 恭喜!

在此 Codelab 中,您学习了如何将应用中的静态捆绑的 tflite 资源替换为 Firebase 中动态加载的 TFLite 模型。如需详细了解 TFLite 和 Firebase,请查看其他 TFLite 示例和 Firebase 入门指南。

所学内容

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • Firebase Performance Monitoring
  • Firebase Remote Config
  • Firebase A/B Testing

后续步骤

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

了解详情

有疑问?

报告问题