使用 TensorFlow Lite 和 Firebase 向应用添加设备端文本分类 - Android Codelab

1. 概览

文本分类结果.png

欢迎学习“使用 TensorFlow Lite 和 Firebase 进行文本分类”Codelab。在此 Codelab 中,您将学习如何使用 TensorFlow Lite 和 Firebase 训练文本分类模型并将其部署到您的应用。此 Codelab 基于此 TensorFlow Lite 示例

文本分类是根据文本内容为文本分配标签或类别的过程。它是自然语言处理 (NLP) 的基本任务之一,具有多种应用,例如情感分析、主题标签、垃圾内容检测和意图检测。

情感分析是使用文本分析技术对文本数据中的情绪(积极、消极和中性的)进行解释和分类。通过情感分析,商家可以确定客户在线对话和反馈时对产品、品牌或服务的感受。

本教程介绍如何构建用于情感分析的机器学习模型,特别是如何对文本进行正面或负面的分类。这是一个二元分类(或两类分类)的示例,也是一种重要且广泛适用的机器学习问题。

学习内容

  • 使用 TF Lite Model Maker 训练 TF Lite 情感分析模型
  • 将 TF Lite 模型部署到 Firebase ML 并从您的应用访问这些模型
  • 使用 TF Lite Task 库将 TF Lite 情感分析模型集成到您的应用中

所需条件

  • 最新 Android Studio 版本。
  • 示例代码。
  • 一台安装了 Android 5.0+ 和 Google Play 服务 9.8 或更高版本的测试设备,或者一个安装了 Google Play 服务 9.8 或更高版本的模拟器
  • 如果使用设备,需要一根连接线。

您将如何使用本教程?

仅阅读教程内容 阅读并完成练习

您如何评价自己在构建 Android 应用方面的经验水平?

新手 中等 熟练

2. 获取示例代码

从命令行克隆 GitHub 代码库。

$ git clone https://github.com/FirebaseExtended/codelab-textclassification-android.git

如果您未安装 git,也可以从其 GitHub 页面或点击此链接下载示例项目。

3. 导入起始应用

在 Android Studio 中,从示例代码下载中选择 codelab-textclassification-android-master 目录 ( android_studio_folder.png) (File > Open > .../codelab-textclassification-android-master/start)。

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

4.运行起始应用

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

应用应在您的设备上启动。它仅包含一个简单的界面,让您可以在后续步骤中轻松集成和测试文本分类模型。此时,如果您尝试预测情感,应用将仅返回一些虚拟结果。

2fb4e69fafb2e3ed.png

5. 创建 Firebase 控制台项目

将 Firebase 添加到项目

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

6. 将 Firebase 添加到应用

  1. 在新项目的概览屏幕中,点击 Android 图标以启动设置工作流。
  2. 输入此 Codelab 的软件包名称:org.tensorflow.lite.codelabs.textclassification

将 google-services.json 文件添加到您的应用

添加软件包名称并选择“注册”**后,点击“下载 google-services.json**”以获取 Firebase Android 配置文件,然后将 google-services.json 文件复制到项目的 *app* 目录中。

将 google-services 插件添加到您的应用

按照 Firebase 控制台上的说明更新 build.gradle.kts 文件,以将 Firebase 添加到您的应用。

google-services 插件使用 google-services.json 文件将您的应用配置为使用 Firebase。

将项目与 Gradle 文件同步

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

7. 使用 Firebase 运行应用

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

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

8. 训练情感分析模型

我们将使用 TensorFlow Lite Model Maker 训练文本分类模型,以预测给定文本的情感。

此步骤以 Python 笔记本形式显示,您可以在 Google Colab 中打开。您可以选择运行时 > 全部运行,以一次性执行所有笔记本。

在 Colab 中打开

完成此步骤后,您将得到一个可以部署到移动应用的 TensorFlow Lite 情感分析模型。

9. 将模型部署到 Firebase ML

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

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

您可以通过控制台部署模型,也可以使用 Firebase Admin SDK 以编程方式部署模型。在此步骤中,我们将通过控制台进行部署。

首先,打开 Firebase 控制台,然后点击左侧导航面板中的“机器学习”。如果您是第一次打开,请点击“开始使用”。然后,转到“自定义”并点击“添加模型”按钮。

当系统提示时,将模型命名为 sentiment_analysis,然后上传您在上一步中从 Colab 下载的文件。

3c3c50e6ef12b3b

10. 从 Firebase ML 下载模型

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

为简单起见,我们将移除默认的捆绑模型,并始终在应用首次启动时从 Firebase 下载模型。这样,在运行情感分析时,您可以确保使用 Firebase 提供的模型运行推理。

app/build.gradle.kts 文件中,添加 Firebase Machine Learning 依赖项。

app/build.gradle.kts

找到此评论:

// TODO 1: Add Firebase ML dependency

然后添加:

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

当 Android Studio 要求同步您的项目时,选择 Sync Now

然后添加一些代码,以便从 Firebase 下载模型。

MainActivity.java

找到此评论:

// TODO 2: Implement a method to download TFLite model from Firebase

然后添加:

  /** Download model from Firebase ML. */
  private synchronized void downloadModel(String modelName) {
      CustomModelDownloadConditions conditions = new CustomModelDownloadConditions.Builder()
            .requireWifi()
            .build();
      FirebaseModelDownloader.getInstance()
              .getModel("sentiment_analysis", DownloadType.LOCAL_MODEL, conditions)
              .addOnSuccessListener(model -> {
                  try {
                      // TODO 6: Initialize a TextClassifier with the downloaded model

                      predictButton.setEnabled(true);
                  } catch (IOException e) {
                      Log.e(TAG, "Failed to initialize the model. ", e);
                      Toast.makeText(
                              MainActivity.this,
                              "Model initialization failed.",
                              Toast.LENGTH_LONG)
                              .show();
                      predictButton.setEnabled(false);
                  }
              })
              .addOnFailureListener(e -> {
                      Log.e(TAG, "Failed to download the model. ", e);
                      Toast.makeText(
                              MainActivity.this,
                              "Model download failed, please check your connection.",
                              Toast.LENGTH_LONG)
                              .show();

                      }
              );

}

接下来,在 activity 的 onCreate 方法中调用 downloadModel 方法。

MainActivity.java

找到此评论:

// TODO 3: Call the method to download TFLite model

然后添加:

downloadModel("sentiment_analysis");

11. 将模型集成到您的应用中

借助 TensorFlow Lite 任务库,您只需几行代码即可将 TensorFlow Lite 模型集成到您的应用中。我们将使用从 Firebase 下载的 TensorFlow Lite 模型来初始化 NLClassifier 实例。然后,我们将使用它对来自应用用户的文本输入进行分类,并在界面上显示结果。

添加依赖项

转到应用的 Gradle 文件,然后在应用的依赖项中添加 TensorFlow Lite Task Library (Text)。

app/build.gradle

找到此评论:

// TODO 4: Add TFLite Task API (Text) dependency

然后添加:

implementation("org.tensorflow:tensorflow-lite-task-text:0.3.0")

当 Android Studio 要求同步您的项目时,选择 Sync Now

初始化文本分类器

然后,我们将使用 Task 库的 NLClassifier 加载从 Firebase 下载的情感分析模型。

MainActivity.java

我们来声明一个 NLClassifier 实例变量。找到此评论:

// TODO 5: Define a NLClassifier variable

然后添加:

private NLClassifier textClassifier;

使用从 Firebase 下载的情感分析模型初始化 textClassifier 变量。找到此评论:

// TODO 6: Initialize a TextClassifier with the downloaded model

然后添加:

textClassifier = NLClassifier.createFromFile(model.getFile());

对文本进行分类

设置好 textClassifier 实例后,只需调用一个方法即可运行情感分析。

MainActivity.java

找到此评论:

// TODO 7: Run sentiment analysis on the input text

然后添加:

List<Category> results = textClassifier.classify(text);

实现后期处理

最后,我们将模型的输出转换为要在屏幕上显示的描述性文本。

MainActivity.java

找到此评论:

// TODO 8: Convert the result to a human-readable text

移除生成虚拟结果文本的代码:

String textToShow = "Dummy classification result.\n";

然后添加:

String textToShow = "Input: " + text + "\nOutput:\n";
for (int i = 0; i < results.size(); i++) {
  Category result = results.get(i);
  textToShow += String.format("    %s: %s\n", result.getLabel(),
                              result.getScore());
}
textToShow += "---------\n";

12. 运行最终应用

您已将情感分析模型集成到应用中,让我们对其进行测试。连接 Android 设备,然后点击 Android Studio 工具栏中的 Run ( 执行.png)。

应用应该能够正确预测您输入的影评的情感。

img/text-classification-result.png

13. 利用更多 Firebase 功能为应用提供支持

除了托管 TFLite 模型之外,Firebase 还提供了一些其他功能来支持您的机器学习用例:

  • Firebase Performance Monitoring 用于衡量模型在用户设备上运行的推断速度。
  • Firebase Analytics,通过衡量用户的反应来衡量模型在生产环境中的表现。
  • 使用 Firebase A/B Testing 测试模型的多个版本
  • 你还记得我们之前训练了两个版本的 TFLite 模型吗?A/B 测试是了解哪些版本在生产环境中效果更好的好方法!

如需详细了解如何在应用中利用这些功能,请查看以下 Codelab:

14. 恭喜!

在此 Codelab 中,您学习了如何使用 Firebase 训练情感分析 TFLite 模型并将其部署到移动应用。如需详细了解 TFLite 和 Firebase,请查看其他 TFLite 示例和 Firebase 入门指南。

所学内容

  • TensorFlow Lite
  • Firebase ML

后续步骤

  • 使用 Firebase Performance Monitoring 衡量模型的推断速度。
  • 通过 Firebase ML Model Management API 将模型从 Colab 直接部署到 Firebase。
  • 添加一种机制,允许用户针对预测结果提供反馈,并使用 Firebase Analytics 跟踪用户反馈。
  • 使用 Firebase A/B Testing 对平均字词向量模型和 MobileBERT 模型进行 A/B 测试。

了解详情

有疑问?

报告问题