
1 前言 对于计算能力较差或计算资源有限的嵌入式平台,通用AI应用的开发通常分为训练端和推理端两个阶段。训练端是指模型的训练过程,这个过程通常在计算能力较强的服务器或云端进行;推理端是指使用训练好的模型进行预测或分类的过程,这个过程通常在嵌入式设备上进行。训练端和推理端在嵌入式平台上各自承担不同的任务,前者侧重于模型的训练和优化,后者侧重于模型的实际应用和实时推理。 本文将以YOLOv8的目标检测应用开发为例,讲述如何在1小时以内快速上手AI应用的开发——训练。 2 YOLOv8训练端 训练端的主要任务包括:数据收集和预处理,即收集大量的训练数据,对数据进行标注等操作;模型训练,我们将利用训练数据对YOLOv8模型进行训练,通过不断地调整模型参数,使其能够准确地预测或分类;模型验证和调优,使用验证数据集对模型进行评估和调优,确保模型的性能达到预期;模型的保存和导出,即将训练好的模型保存为文件,以便在推理端使用。本章的训练端任务将在Ubuntu 22.04系统的PC上进行。 2.1. 环境搭建 YOLO(You Only Look Once)是一种广泛应用于实时目标检测的深度学习模型。Ultralytics公司在YOLO模型的发展和推广中扮演了重要角色,推出了YOLOv8。 YOLOv8在网络架构、损失函数、数据增强和训练策略等方面进行了多项改进,使其在各种复杂场景下的检测性能更加出色。目前已可以根据Ultralytics的文档迅速搭建YOLO的训练开发环境,本章内容主要参考:Quickstart - Ultralytics YOLO Docs。 2.1.1. 虚拟环境 虚拟环境是一种工具,用于在同一台计算机上隔离不同的项目的依赖包和环境。不同项目可能需要不同版本的库和依赖包。虚拟环境可以确保每个项目使用其特定版本的依赖,而不会相互冲突。此处我们推荐使用Anaconda。 点击此链接进入Anaconda官方下载地址,并下载Anaconda Linux版本: Download Now | Anaconda
▲ 图1. Anaconda下载
阅读并接受License,指定下载路径,即可完成Anaconda安装。
<name>请用自定义的虚拟环境名称代替,<version>请用需要使用的python版本代替,示例:
激活虚拟环境,将当前工作环境切换到新建的虚拟环境下:
<name>请用自定义的虚拟环境名称代替,示例:
成功切换路径后,在Ubuntu终端指令行前会出现虚拟环境的名称,例如(yolov8-py310-stm32mpu),看到虚拟环境名称即为切换成功。 2.1.2. Ultralytics库 可根据需要选择pip安装或Conda安装,亦可根据PC硬件资源选择CPU/GPU版本安装,此处以Conda安装GPU版本Ultralytics库为例:
2.1.3. TensorFlow库和ONNXRUNTIME库 TFLite(TensorFlow Lite)是一种神经网络模型格式,是TensorFlow的轻量级版本,专为移动和嵌入式设备上的机器学习推理而设计。TFLite支持多种量化技术,如权重量化、激活量化和混合量化,以减少模型大小和提高推理效率。TFLite模型经过优化,适合在移动和嵌入式设备上高效运行。除了TFLite模型格式以外,部署阶段也可以选择使用标准的神经网络模型交换格式ONNX(Open Neural Network Exchange)。 由于部署阶段需要将训练好的权重文件构建为开放的标准的神经网络模型交换格式,且Ultralytics已提供TFLite模型和ONNX模型的export接口,故此处我们可一并安装相关的库。 由于源限制或其他原因,有时无法确定某一个库是否能通过pip或conda成功安装。因此,可以尝试同时使用这两种包管理工具来安装所需的库。
注:开发过程中遇到找不到相关库的报错信息时,都可以尝试通过conda或pip进行安装。 2.2. 模型训练 为了方便起见,此处直接使用COCO128数据集,Ultralytics提供的生态里,可以直接通过训练指令自动下载开源数据集。当然此处可根据实际需要自己制作数据集并将训练数据更改为自己的数据集,满足YOLOv8对数据集格式的要求即可。
在这条指令中:yolo是调用YOLO命令行的工具;detect是YOLO的子命令,表示进行目标检测任务;train也是一个子命令,表示进行模型训练;data用来指定训练数据集的配置文件,其中包含数据集的路径和标签类别信息;model用来指定预训练模型的路径或名称;epochs指定训练的次数;imgsz用来指定图片的分辨率;device是GPU训练专有的参数,用来指定训练所使用的设备,device=0表示使用第一个GPU进行训练,device=0,1,2,3表示使用第4(多)个GPU进行训练。例:
▲ 图2. 训练过程
2.3. 训练结果 训练完毕后,训练结果将保存在当前路径下的runs/detect/train2文件中(此路径将根据用户执行训练指令的次数自动生成,生成路径会根据指令执行次数有所区别)。
▲ 图3. 训练结果 模型训练完毕得到的文件和图像提供了丰富的信息,帮助我们评估和理解YOLOv8模型的训练过程和性能。这些输出可以帮助我们监控训练进展,调整超参数,并最终选择性能最好的模型进行部署。其中,我们重点需要关注图像和曲线信息。
▲ 图4. 训练集/验证集检测效果
▲ 图5. train_batch0 示例
注:在深度学**,批次(batch)是指在一次前向传播和反向传播中使用的一组样本。批次的划分是为了提高训练效率和稳定性。较小的批次大小可以更频繁地更新模型参数,但计算效率较低;较大的批次大小可以提高计算效率,但需要更多的内存。Ultralytics提供的YOLO中batch-size默认设置为16,可根据自己实际需求修改。 ▲ 图6. 混淆矩阵 confusion_matrix.png是一个未归一化的混淆矩阵图像文件,未归一化的混淆矩阵显示了模型在不同类别上的预测数量,每个单元格的值表示该类别的预测数量,可以用于评估模型在各类别上的绝对表现。
通过分析混淆矩阵,我们可以了解模型在哪些类别上表现良好,哪些类别上存在误分类,从而进行相应的调整和改进。 confusion_matrix_normalized.png是一个归一化的混淆矩阵图像文件,归一后的混淆矩阵可以更直观地展示各类别之间的混淆程度,每个单元格的值表示该类别的预测数量占该类别总数的比例。
▲ 图7. 其他曲线
注:精度是指模型预测为正类的样本中,实际为正类的比例;召回率是指实际为正类的样本中,被模型正确预测为正类的比例。灰色线代表每一个类别对应值的变化情况,粗线代表所有类别的平均/整体表现情况。 abels.jpg是标签分布图像文件,是标签分布图像文件;labels_correlogram.jpg是标签相关图像文件,展示了不同类别标签之间的相关性,可以帮助理解数据集中的类别分布和共现关系。 Weights文件夹是本次模型训练中保存的模型的权重文件,供训练结束后进行评估和推理,best.pt文件保存了在训练过程中表现最好的模型权重,每当模型在验证集上的性能(通常是基于某个指标,如F1分数、精度、召回率或损失)达到新的最佳值时,当前的模型权重会被保存到best.pt文件中。 2.4. 模型导出 Ultralytics提供的生态里,可以直接通过导出指令导出模型,包括但不限于ONNX模型和TFlite模型。在ST提供的AI生态中,ONNX和TFlite两种模型格式都可以直接支持,我们可选用二者之一作为后续部署流程中模型转换的输入,在此我们以TFlite模型导出为例。
▲ 图8. 面向STM32MP25X的AI模型部署流程
可根据开发的实际路径修改权重文件路径、权重文件名称以及想得到的模型格式。例:
▲ 图9. 模型导出 从图中可知模型已成功导出且被保存在对应文件中:TensorFlow Lite: export success ✅ 0.0s, saved as 'weights / best_saved_model / best_float32.tflite'(12.3 MB)。需要注意保存路径,在后续的模型部署的操作中,此模型将作为部署操作的起点。 3 小结 本文以YOLOv8为例,介绍了将模型部署在STM32MPU上的前期准备——模型获取,即训练端的操作。如果客户有图像相关的应用,包括检测分割以及姿态估计,均可参照此文档,尝试使用YOLO模型进行AI应用的开发。 |
经验分享 | STM32CubeMX 生成时钟获取函数的分析
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | 基于STM32片内信号的ADC应用演示
经验分享 | 基于LL库实现STM32U5 LPTIM 功能的代码演示
经验分享 | STM32F0 ADC结果挪位的问题分析及解决
经验分享 | STM32应用五问五答
经验分享 | 基于STM32H7 UART 空闲事件及DMA传输示例
经验分享 | SPI传输时为何丢失2个数据?
经验分享 | 关于STM32 DMA传输的两个问题释疑