跳到主要内容

Edge Impulse图像分类

来源:https://docs.edgeimpulse.com/tutorials/end-to-end/image-classification

通过迁移学习训练物体识别模型,并将其部署到微控制器。

本教程将使用机器学习,搭建一个通过摄像头识别家中物体的系统。摄像头连接到微控制器,这类识别任务称为图像分类。为嵌入式设备加入视觉能力后,它们就能够区分偷猎者与大象、在工厂生产线上进行质量检测,甚至让遥控小车自主行驶。本教程将介绍如何采集图像、构建类别均衡的数据集,如何利用迁移学习训练神经网络,以及如何将整个系统部署到嵌入式设备。

完成本教程后,你将掌握使用 Edge Impulse 进行图像分类的方法。

直接使用现成项目:如果希望跳过配置过程,可以克隆一个已准备好的 Edge Impulse 项目,其中包含数据集、Impulse 处理流程和训练完成的模型。

本教程也提供视频版本。

1. 前提条件​

你需要一台受支持的设备。如果没有这些设备,也可以使用 Uploader(上传工具)上传已有数据集。完成本教程后,你可以将训练好的机器学习模型导出为 C++ 库,并在自己的设备上运行。

2. 构建数据集​

本教程将训练一个能够区分家中两种物体的模型。示例选用的是一盆植物和一盏台灯,你也可以选择其他两种物体。要让机器学习模型具备识别能力,首先需要为这些物体拍摄足够多的示例图像。训练时,模型会利用这些图像学习区分不同物体。当然,家里通常不只有台灯和植物,因此还需要拍摄一些既不是台灯、也不是植物的图像,帮助模型正确处理其他物体。

请按以下数量采集图像,并尽量覆盖不同的拍摄角度和缩放程度:

  • 50 张台灯图像。
  • 50 张植物图像。
  • 50 张既不是植物、也不是台灯的图像。请在同一房间中选择多种其他物体,尽量增加图像的多样性。

可以通过以下设备和方式采集数据:

也可以使用其他摄像头拍摄图像,再进入 Data acquisition(数据采集) 页面,单击 Upload(上传) 图标上传。完成后,Edge Impulse 项目的数据采集页面中应显示一个类别均衡的数据集。使用 Data collected(已采集数据) 面板上方的两个按钮,可以在训练数据与测试数据之间切换。

数据采集页面中的植物图像

数据采集页面中的植物图像。采集时,数据会自动划分为训练集和测试集;原文示例中,训练集包含 221 个样本。

3. 设计 Impulse​

准备好训练集后,就可以设计 Impulse 处理流程。Impulse 接收原始数据,调整图像尺寸,通过预处理模块处理图像,再利用学习模块对新数据进行分类。对于相同的输入,预处理模块始终产生相同的输出,例如将彩色图像转换为灰度图像;学习模块则通过已有数据学习规律。

本教程使用 Images(图像) 预处理模块。该模块接收彩色图像,可以按需将其转换为灰度图像,然后转换为特征数组。如果希望执行更复杂的预处理,例如先从照片中找出人脸,再将人脸图像送入神经网络,可以参阅构建自定义处理模块教程。随后使用 Transfer Learning(迁移学习) 模块,学习区分 plant(植物)、lamp(台灯)和 unknown(未知)三个类别。

在 Studio 中进入 Create impulse(创建 Impulse),将图像宽度和高度均设为 96,添加 Images(图像) 和 Transfer Learning (Images)(迁移学习:图像) 模块,然后单击 Save impulse(保存 Impulse)。

设计 Impulse 处理流程

设计 Impulse 处理流程。

配置处理模块​

单击左侧菜单中的 Images(图像),配置处理模块。页面上方显示原始数据,可以通过下拉菜单选择其他文件;右侧显示处理结果。选项中可以切换 RGB(彩色) 与 Grayscale(灰度) 模式。本教程暂时将颜色模式保持为 RGB,然后单击 Save parameters(保存参数)。

配置处理模块。

随后进入 Feature generation(特征生成) 页面。在这里将完成以下操作:

  • 调整所有图像的尺寸。
  • 使用处理模块处理全部数据。
  • 为整个数据集生成三维可视化结果。

单击 Generate features(生成特征) 开始处理。

处理完成后,将加载 Feature explorer(特征浏览器),以图表形式呈现整个数据集。图像数据的维度很高,例如这里每张 RGB 图像包含 96×96×3=27,648 个特征,因此在可视化之前需要先进行降维。在本例中,27,648 维特征被压缩到 3 维,并根据相似程度呈现出聚类分布。即使数据量不大,也能看到一些簇已经形成,例如台灯图像集中在右侧。单击图中的点,可以查看对应的图像。

特征浏览器中的数据集可视化结果

特征浏览器中的数据集可视化结果。不同类别的簇分得越开,机器学习模型通常越容易学会区分这些类别。

配置迁移学习模型​

所有数据处理完成后,就可以开始训练神经网络。神经网络是一类受人脑工作方式启发、用于识别模式的算法。这里训练的网络以图像数据作为输入,尝试将每张图像归入三个类别之一。

从零开始训练一个效果良好的计算机视觉模型并不容易。为了让模型具备良好的泛化能力,通常需要大量、丰富的输入数据,而训练过程即使使用 GPU,也可能耗时数天。迁移学习能够简化并加速这一过程:以已经训练好的模型为基础,仅重新训练靠近输出端的高层网络,就能用明显更少的数据和时间,获得更可靠的模型。

单击左侧菜单中的 Transfer learning(迁移学习),配置迁移学习模型。在这里可以选择基础模型;默认模型即可使用,也可以根据模型大小的要求进行调整。此外,还可以启用数据增强,并设置学习率。数据增强会对图像进行随机变换,以提高模型在实际场景中的表现。

设置以下参数:

  • Number of training cycles(训练轮数):20。
  • Learning rate(学习率):0.0005。
  • Data augmentation(数据增强):启用。
  • Minimum confidence rating(最低置信度):0.7。

注意: 如果使用内存较小的开发板,例如 Arduino Nano 33 BLE Sense,请单击 Choose a different model(选择其他模型),选择体积较小的 MobileNetV1 96x96 0.25 迁移学习模型。

然后单击 Start training(开始训练)。训练完成后,页面下方会显示准确率、混淆矩阵,以及设备端性能的估算结果。至此,模型训练完成。

训练完成的模型及设备端性能估算结果

训练完成的模型及设备端性能估算结果。

4. 验证模型​

模型训练完成后,需要使用测试数据检验效果。采集数据时已经将数据划分为训练集和测试集,模型只使用训练集进行训练,因此可以利用未参与训练的测试集,评估模型在实际场景中的表现。这有助于检查模型是否出现了常见的过拟合问题,即过度适应训练数据。

进入 Model testing(模型测试) 页面,勾选 Sample name(样本名称) 旁的复选框,再单击 Classify selected(对选中样本进行分类)。原文示例的准确率达到 89%;对于数据量如此小的模型,这是一个不错的结果。

使用实际场景中的数据验证模型。

若要查看某个样本的详细分类结果,单击该样本旁的三点菜单,再选择 Show classification(显示分类结果)。随后进入 Live classification(实时分类) 页面,查看该文件的更多信息。如果使用手机采集数据,也可以在这里采集新的测试数据。此页面有助于分析样本被错误分类的原因。

未能确定类别的样本

一个未能确定类别的样本:最高得分仍低于 0.7 的置信度阈值。该样本在特征空间中远离所有已知的簇,很可能包含了模型此前未见过的内容,例如画面中出现了部分窗户。可以考虑向训练集中补充更多相关图像。

5. 在设备上运行模型​

完成 Impulse 的设计、训练和验证后,就可以将模型部署到设备上。模型在设备本地运行,无须联网,有助于降低延迟,并尽可能减少功耗。Edge Impulse 可以将完整的 Impulse,包括预处理步骤、神经网络权重和分类代码,打包为一个 C++ 库,集成到嵌入式软件中。

若要在 OpenMV 摄像头或手机上运行 Impulse,请按以下方式操作:

对于其他开发板,单击菜单中的 Deployment(部署),在 Build firmware(构建固件) 区域选择自己的开发板,再单击 Build(构建)。系统会一次性完成 Impulse 导出,并构建可在该开发板上运行的二进制固件。构建完成后,按照提示下载二进制文件并保存到计算机。

烧录设备​

单击 Build(构建) 后,会出现弹出窗口,通过文字和视频说明如何将二进制固件部署到所选设备。按照说明完成烧录,即可开始测试 Impulse。

在设备上运行模型​

可以通过串口连接开发板上刚烧录的固件。打开终端并运行:

$ edge-impulse-run-impulse

若还需要查看摄像头画面预览,请运行:

$ edge-impulse-run-impulse --debug

若希望连续运行,不再每隔 2 秒暂停一次,且不需要图像预览,请运行:

$ edge-impulse-run-impulse --continuous
机器学习模型在设备上实时运行,对植物图像进行分类

机器学习模型在设备上实时运行,对植物图像进行分类。

恭喜,你已经为传感器加入了视觉识别能力!模型训练完成后,可以将 Impulse 集成到自己嵌入式设备的固件中,具体方法请参阅部署教程。其中提供了 Mbed OS、Arduino、STM32CubeIDE,以及其他支持 C++ 编译器的目标平台示例。请注意,本教程训练的模型相对较大,也可以选择体积更小的迁移学习模型。

如果希望继续学习,可以阅读连续动作识别或声音识别教程。当然,也欢迎尝试自己的项目构想。Edge Impulse 支持从各种传感器采集数据,通过自定义处理模块提取特征,并使用学习模块灵活构建机器学习流程。

期待看到你的作品!🚀