TensorFlow 是一个多用途机器学习框架。TensorFlow 有很多用途,例如跨云端集群训练大型模型,以及在手机等嵌入式系统本地运行模型。
此 Codelab 使用 TensorFlow Lite 在 Android 设备上运行图像识别模型。
安装 Android Studio 4.1 Beta 版
如果您尚未安装该软件,请在训练 TensorFlow Lite 模型时下载并安装 Android Studio 4.1 Beta 1 或更高版本。
学习内容
- 如何使用 TensorFlow Lite Model Maker 训练您自己的自定义图像分类器。
- 如何使用 Android Studio 导入 TensorFlow Lite 模型,以使用 CameraX 将自定义模型集成到 Android 应用中。
- 如何在手机上使用 GPU 加速模型。
构建内容
一个简单的相机应用,该应用会运行 TensorFlow 图像识别程序来识别花卉。
许可:免费使用
在启动模型训练之前,请开始下载并安装
打开 Colab,了解如何使用 Keras 训练分类器以通过 TensorFlow Lite 迁移学习识别花卉。
克隆 Git 代码库
以下命令将克隆包含此 Codelab 所需文件的 Git 代码库:
git clone https://github.com/hoitab/TFLClassify.git
接下来,找到您刚刚克隆代码库的目录。在此 Codelab 的剩余部分中,您会将该目录作为工作目录:
cd TFLClassify
安装 Android Studio 4.1 Beta 1
如果您尚未安装该软件,请安装 Android Studio 4.1 Beta 1 或更高版本。
使用 Android Studio 打开项目
按照以下步骤,使用 Android Studio 打开项目:
- 打开 Android Studio。加载完成后,从此弹出式窗口中选择“Open an Existing project”:
- 在文件选择器中,从您的工作目录中选择
TFLClassify/build.gradle
。
- 首次打开项目时,您会看到一个“Gradle Sync”弹出式窗口,询问是否使用 Gradle 封装容器。点击“OK”。
- 在手机上启用开发者模型和 USB 调试(如果您尚未启用)。此设置是一次性的。请按照以下说明操作。
- 项目和手机准备就绪后,您可以选择
TFL_Classify.start
在实际设备上运行它,然后按工具栏上的“运行”按钮 :
- 现在允许 Tensorflow Demo 访问您的相机:
- 手机上会显示以下屏幕,实际结果的显示位置会用随机数字代替。
- 在左侧的 Project Explorer 中选择
start
模块:
- 右键点击
start
模块或点击File
,然后依次点击New
>Other
>TensorFlow Lite Model
- 选择您之前下载自定义训练的
FlowerModel.tflite
的模型位置。
- 点击
Finish
。 - 最终将显示以下内容。已成功导入 FlowerModel.tflite,它显示了关于模型的概要信息,包括输入/输出以及一些可以帮助您入门的示例代码。
待办事项列表可让您轻松导航到需要更新 Codelab 的确切位置。您还可以在 Android 项目中使用它,提醒自己今后的工作。您可以使用代码注释添加待办事项,然后输入关键字 TODO
。如需访问待办事项列表,您可以执行以下操作:
- 查看待办事项列表的一种绝佳方式是查看待办事项列表。为此,请从顶部的菜单栏依次选择
View
>Tool Windows
>TODO
- 默认情况下,它会列出所有模块中的所有待办事项,这会让人感觉有些混乱。我们可以点击待办事项面板一侧的“group by”按钮,从而仅挑选出开始的待办事项,然后选择
Modules
- 展开起始模块下的所有内容:
- 点击待办事项列表中的“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)
...
}
- 在 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))
...
}
- 处理图片并对结果执行以下操作:
- 根据
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
...
}
- 通过数据绑定将经过排序和过滤的结果转换为可供
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))
}
...
}
- 注释掉或删除以下行,这有助于生成我们之前看到的虚假结果:
// 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.
- 选择
TFL_Classify.start
在实际设备上运行该应用,然后按工具栏上的“运行”按钮 :
- 手机上会显示以下屏幕,实际结果的显示位置会用随机数字代替:
TensorFlow Lite 支持多种硬件加速器,可加快移动设备上的推断速度。GPU 是 TensorFlow Lite 可以通过代理机制利用的加速器之一,使用起来非常简单。
- 打开
start
模块下的 build.gradle,或者点击待办事项列表下的“TODO 5”并添加以下依赖项:
// TODO 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.2.0'
- 返回 MainActivity.kt 文件,或点击待办事项列表中的“TODO 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()
...
}
- 更改模型初始化程序,通过将
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)
...
}
- 选择
TFL_Classify.start
在实际设备上运行该应用,然后按工具栏上的“运行”按钮 :
如需了解详情,请参阅以下链接:
- 尝试其他与 tfhub.dev 中的机器学习模型绑定兼容的 TFLite 模型。
- 如需详细了解 TFLite,请参阅 tensorflow.org 和代码库中的文档。
- 尝试使用其他 TFLite 预训练模型,包括语音启动指令检测器和设备端版智能回复。
- 查看入门文档,详细了解 TensorFlow。