在 Android 上使用 TensorFlow Lite 识别花朵(测试版)

1. 简介

669a7f499283bf90.png android.png

TensorFlow 是一个多功能机器学习框架。TensorFlow 可随时随地使用,无论是在云端的集群中训练大型模型,还是在本地嵌入式系统(如手机)上运行模型,其均可提供支持。

本 Codelab 使用 TensorFlow Lite 在 Android 设备上运行图像识别模型。

安装 Android Studio 4.1 测试版

如果尚未安装测试版,请在训练 TensorFlow Lite 模型时 下载并安装 AndroidStudio 4.1 测试版 1 或更高版本

您将学习的内容

  • 如何使用 TensorFlow Lite Model Maker 训练您的自定义图像分类器。
  • 如何使用 Android Studio 导入 TensorFlow Lite 模型,以在 Android 应用中使用 CameraX 集成自定义模型。
  • 如何在手机上使用 GPU 加速模型。

您将构建的内容

用于运行 TensorFlow 图像识别程序以识别花朵的简单相机应用。

f11c2821f2c8311d.png

许可证:免费使用

2. 使用 Colab 训练花朵识别器

在开始模型训练之前,先下载并安装

3. 设置工作目录

克隆 Git 代码库

以下命令将会克隆包含本 Codelab 所需文件的 Git 代码库:

git clone https://github.com/hoitab/TFLClassify.git

然后转到刚才克隆代码库的目录。您将在这里处理本 Codelab 的剩余操作:

cd TFLClassify

4. 设置 Android Studio 应用

android.png

安装 Android Studio 4.1 测试版 1

如果尚未安装测试版,请 安装 AndroidStudio 4.1 测试版 1 或更高版本

使用 Android Studio 打开项目

按照以下步骤,使用 Android Studio 打开项目:

  1. 打开 Android Studio 1696c3b1aa132402.png。加载后,从该弹出式窗口中选择"Open an Existing project"(打开现有项目):

59c37ab9b9abd1bc.png

  1. 在文件选择器中,选择工作目录下的 TFLClassify/build.gradle
  1. 系统将会显示"Gradle Sync"(Gradle 同步)弹出式窗口,第一次打开项目时,系统会询问是否使用 gradle 封装容器。点击"OK"(确定)。

8f53dc6a60269780.png

  1. 如果尚未在手机上启用开发者模型和 USB 调试,请启用。这是一次性设置。 请遵循 以下说明
  2. 在您的项目和手机就绪后,便可选择 TFL_Classify.start 并按下工具栏上的运行按钮 69920bd22d7f4755.png,以在实际设备上运行项目:

9715364a916259b1.png

  1. 现在允许 Tensorflow Demo 访问您的相机:

c70385b58db6a27e.png

  1. 您的手机上将会显示以下画面,系统会在显示真实结果的地方使用随机数字来作为代替。

805802b9fab8e7d4.png

5. 将 TensorFlow Lite 添加到 Android 应用

  1. 在左边的项目资源管理器中选择 start 模块:

22a090727360bb7f.png

  1. 右键点击 start 模块,或者点击 File,然后点击 New > Other > TensorFlow Lite Model

36e91eccefd0cdda.png

  1. 选择您前面下载自定义训练的 FlowerModel.tflite 的位置。

b1906a242408ad15.png

  1. 点击 Finish
  2. 最终您将看到以下内容。FlowerModel.tflite 已成功导入,并且显示模型的简要信息,包括输入/输出以及某些示例代码,可帮助您开始操作。

24460f53df5d5da4.png

6. 可选:签出所有任务清单

您可借助任务清单,轻松找到需要更新 Codelab 的准确位置。您也可以在 Android 项目中用它向自己提醒未来的工作。可以使用代码备注添加任务项,并输入关键字 TODO。如要访问任务清单,您可以:

  1. 如要查看待处理任务,签出任务清单是非常好的方式。如要签出任务清单,请从顶部菜单栏选择 View > Tool Windows > TODO

220b955c407460fa.png

  1. 默认情况下,它会列出所有模块中的所有任务,这可能会造成一点混乱。我们可以点击任务面板旁边的"分组 (group by)"按钮,并选择 Modules,以仅列出开始模块中的任务

554a02545dd2b618.png

  1. 展开开始模块下的所有项目:

dd338355cc0e629c.png

7. 使用 TensorFlow Lite 运行自定义模型

  1. 点击任务清单中的任务 1,或者打开 MainActivity.kt 文件并找到任务 1,添加以下行以初始化模型:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. 在 CameraX Analyzer 的分析方法内部,我们需要将相机输入 ImageProxy 转换为 Bitmap,并为推断过程创建 TensorImage 对象。
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}
  1. 处理图像并对结果执行以下操作:
  • 在属性 score 下按概率降序排序结果,概率最高的排在最前面。
  • 按常量 MAX_RESULT_DISPLAY 的定义提取前 k 个结果。您可以选择改变此变量的值以获取更多或更少结果。
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. 通过 数据绑定,将经过排序和筛选的结果转换为可直接供 RecyclerView 使用的数据对象 Recognition
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. 注释掉或删除以下行,这些行有助于生成我们前面所见的假结果:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. 选择 TFL_Classify.start 并按下工具栏上的运行按钮 69920bd22d7f4755.png, 以在实际设备上运行应用:

9715364a916259b1.png

  1. 您的手机上将会显示以下画面,系统会在显示真实结果的地方使用随机数字来作为代替。

f11c2821f2c8311d.png

8. 可选:通过 GPU 委托加速推断

TensorFlow Lite 支持多个硬件加速器,可用于加速移动设备上的推断。 GPU 是 TensorFlow Lite 可通过委托机制利用的加速器之一,其使用非常简便。

  1. start 模块下打开 build.gradle,或者点击任务清单中的任务 5,然后添加以下依 赖关系:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.2.0'
  1. 返回 MainActivity.kt 文件,或者点击任务清单中的任务 6,然后初始化以下模型选项:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...
  // TODO 6. Optional GPU acceleration
  private val options = Model.Options.Builder().setDevice(Model.Device.GPU).build()
  ...
}
  1. options 添加到方法输入中,更改模型以使用此对象:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx, options)

  ...
}
  1. 选择 TFL_Classify.start 并按下工具栏上的运行按钮 69920bd22d7f4755.png,以在实际设备上运行 应用:

9715364a916259b1.png

9. 后续步骤?

下面是有关更多信息的一些链接: