将 Firebase 添加到 TFLite 支持的 Android 应用中

1. 概述

cd824ecfd05a2822.png

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

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

你将学到什么

  • 将 TFLite 模型部署到 Firebase ML 并从您的应用访问它们
  • 使用 Firebase Analytics 跟踪用户反馈以衡量模型准确性
  • 通过 Firebase Performance 分析模型性能
  • 选择通过远程配置加载多个部署模型中的哪一个
  • 通过 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-digitclassifier-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. 输入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块中:

应用程序/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 非常有用,主要原因有两个:

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

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

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

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

3c3c50e6ef12b3b.png

9. 从 Firebase ML 下载模型

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

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

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

应用程序/build.gradle.kts

implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")

然后添加逻辑以从 Firebase 下载模型。

我们将用downloadModel("mnist_v1")替换digitClassifier.initialize(loadModelFile())并实现此方法。

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.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 设备上启用 Analytics 调试模式,请执行以下命令:

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

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

5276199a086721fd.png

11. 分析模型的性能

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

您可以使用性能监控 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
}

应用程序/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. 通过将<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 ML 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 笔记本,并将其复制到您自己的云端硬盘下。
  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.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 模型已下载的 Toast 消息。
  3. 返回 Firebase 控制台,将默认值更改为 mnist_v2 并选择发布更改以应用更新。
  4. 重新启动应用程序,查看Toast消息,表明本次mnist_v2模型已下载。

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

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

转到 Firebase 控制台中的“分析”->“事件”。如果显示了correct_inference事件,请将其标记为“转化事件”,如果没有,您可以转到“分析”->“转化事件”,然后单击“创建新的转化事件”并输入correct_inference.

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

fad5ea36969d2aeb.png

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

d7c006669ace6e40.png

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

cb72dcc7d2666bd3.png

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

1ac9c94fb3159271.png

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

e4510434f8da31b6.png

单击右下角的“审阅”按钮。

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

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

15. 恭喜!

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

我们涵盖的内容

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

下一步

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

了解更多

有一个问题?

报告问题