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

1.概览

cd824ecfd05a2822

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-digitcategories-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 文件同步。选择文件 >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),然后从 start/app/src/main/assets/mnist.tflite 下的 Codelab 项目目录上传文件。然后,您可以从 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)
}

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

调试分析

通常,您的应用所记录的事件会在大约 1 小时内集中成批,并一起上传。此方法可节省最终用户并减少网络流量消耗不过,为了验证您的 Google Analytics 实现情况(并且为了在 DebugView 报告中查看您的分析数据),您可以在开发设备上启用调试模式,从而以最短延迟时间上传事件。

要在 Android 设备上启用 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 性能依赖项

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 启用调试日志记录,方法是将 <meta-data> 元素添加到应用的 AndroidManifest.xml 文件中,如下所示:

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,然后点击“开始使用”。fbbea78f0eb3dc9f

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

19517c0d6d2aa14d.png

启用 Firebase ML API

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

2414fd5cced6c984在系统提示时,选择 Digit Classifier 应用。

训练新模型并发布到 Firebase ML

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

下载服务账号的私钥

我们需要先创建一个服务账号,然后才能使用 Firebase Admin SDK。点击此链接打开 Firebase 控制台的“服务账号”面板,然后点击按钮以便为 Firebase Admin SDK 创建新的服务账号。出现提示时,点击 生成新的私钥 按钮。我们将使用服务账号密钥对来自 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)
  }

请求和使用配置

为 config 创建提取请求,然后添加一个完成处理程序来获取和使用 config 参数。

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 行为来了解两个模型中哪个效果更好。

转到 Google Analytics->Firebase 控制台中的事件。如果显示 correct_inference 事件,请将其标记为“转化事件”。如果未显示,您可以前往 Google Analytics->转化事件,然后点击“创建新的转化事件”然后放下correct_inference.

现在,前往 Firebase 控制台中的“Remote Config”,选择“A/B 测试”“model_name”上“更多选项”菜单中的按钮参数。

fad5ea36969d2aeb

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

d7c006669ace6e40.png

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

cb72dcc7d2666bd3.png

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

1ac9c94fb3159271

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

e4510434f8da31b6

点击右下角的“查看”按钮。

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

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

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 部署。

了解详情

有疑问?

报告问题