在 Android 上使用 TensorFlow Lite 识别花卉

1. 简介

657431be3173fa86 android.png

注意:此 Codelab 需要使用实体设备进行测试

TensorFlow 是一个多用途机器学习框架。TensorFlow 有很多用途,例如跨云端集群训练大型模型,以及在手机等嵌入式系统本地运行模型。

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

安装 Android Studio 4.1 或更高版本

如果您尚未安装,请在训练 TensorFlow Lite 模型时下载并安装 Android Studio 4.1 或更高版本

学习内容

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

构建内容

一个简单的相机应用,该应用会运行 TensorFlow 图像识别程序来识别花卉。

f11c2821f2c8311d.png

许可:可随意使用

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

在开始模型训练之前,请先下载并安装 Android Studio 4.1 或更高版本

打开 Colab,其中展示了如何使用 Keras 训练分类器,以使用 TensorFlow Lite 迁移学习来识别花朵。

3. 设置工作目录

克隆 Git 代码库

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

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

接下来,找到您刚刚克隆代码库的目录。在此 Codelab 的剩余部分中,您会将该目录作为工作目录:

cd TFLClassify

4. 设置 Android 框架应用

android.png

安装 Android Studio 4.1 或更高版本

如果您尚未安装 Android Studio 4.1 或更高版本,请转到安装 Android Studio 4.1 或更高版本

使用 Android Studio 打开项目

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

  1. 打开 Android Studio 7f2480ded53a193b。加载完成后,从此弹出式窗口中选择“Open an Existing project”:

f3b8bea7e3b39376.png

  1. 在文件选择器中,从工作目录中选择 TFLClassify/build.gradle
  1. 首次打开项目时,您会看到一个“Gradle Sync”弹出式窗口,询问是否使用 Gradle 封装容器。点击“确定”。

d68b4d7189e6c1e4.png

  1. 在手机上启用开发者模型和 USB 调试(如果您尚未启用)。此设置是一次性的。请按照这些说明操作。
  2. 项目和手机均准备就绪后,选择 TFL_Classify.start 并按工具栏中的运行按钮 86934b7b01ad7565,即可在真实设备上运行项目:

60a77ef126c1373d

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

b63cba02bb36b7e3.png

  1. 手机上会显示以下屏幕,实际结果的显示位置会用随机数字代替。

82c603596afa35f1

5. 将 TensorFlow Lite 添加到 Android 应用

  1. 在左侧的 Project Explorer 中选择 start 模块:

cede7f2b8b23c1a7.png

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

bf243d9fdd27e20a.png

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

cfee18cc6674a408.png

  1. 点击 Finish
  2. 最终将显示以下内容。已成功导入 FlowerModel.tflite,它显示了关于模型的概要信息,包括输入/输出以及一些可以帮助您入门的示例代码。

82840065f0d59def

6. 可选:查看所有待办事项列表

待办事项列表可让您轻松导航到需要更新 Codelab 的确切位置。您还可以在 Android 项目中使用它,提醒自己今后的工作。您可以使用代码注释添加待办事项,然后输入关键字 TODO。如需访问待办事项列表,您可以执行以下操作:

  1. 查看待办事项列表的一种绝佳方式是查看待办事项列表。为此,请从顶部的菜单栏依次选择 View > Tool Windows > TODO

5de29b413574f25c

  1. 默认情况下,它会列出所有模块中的所有待办事项,这会让人感觉有些混乱。我们可以点击待办事项面板一侧的“group by”按钮,从而仅挑选出开始的待办事项,然后选择 Modules

5d8fe7b102340208

  1. 展开起始模块下的所有内容:

8d0f14a039995b20

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

  1. 点击待办事项列表中的“TODO 1”,或打开 MainActivity.kt 文件并找到“TODO 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 并按工具栏中的运行按钮 86934b7b01ad7565,在真实设备上运行应用:

60a77ef126c1373d

  1. 手机上会显示以下屏幕,实际结果的显示位置会用随机数字代替:

f11c2821f2c8311d.png

8. 可选:使用 GPU 委托加速推理

TensorFlow Lite 支持多种硬件加速器,可加快移动设备上的推理速度。GPU 是 TensorFlow Lite 可以通过代理机制利用的加速器之一,使用起来非常简单。

  1. 打开 start 模块下的 build.gradle,或者点击待办事项列表下的“TODO 5”并添加以下依赖项:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. 返回 MainActivity.kt 文件,或点击 TODO 列表中的 TODO 6。将 flowerModel 的简单启动替换为以下代码:获取 GPU 兼容性列表的实例,并根据 GPU 是否是列出的兼容 GPU 之一初始化 GPU。否则,启动 4 个 CPU 线程来运行模型:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. 更改模型初始化程序,通过将 options 添加到方法输入来使用此对象:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}
  1. 选择 TFL_Classify.start 并按工具栏中的运行按钮 86934b7b01ad7565,在真实设备上运行应用:

60a77ef126c1373d

9. 后续步骤

如需了解详情,请参阅以下链接: