【YOLOv10部署RK3588】模型训练→转换RKNN→开发板部署

在这里插入图片描述

------------25.3.26更新内容如下:
已在GitHub开源与本博客同步的YOLOv10_RK3588_object_detect项目,地址:
https://github.com/A7bert777/YOLOv10_RK3588_object_detect
详细使用教程,可参考README.md或参考本博客第七章 模型部署

一、需求分析

最近清华发布了不需要NMS的YOLO检测算法:YOLOv10,感觉挺新奇,准备尝试一下,并部署到国产RK3588开发板测试下效果。

此前博主已经发布过YOLOv8n的相关内容,链接在此,其实具体实现方法都是差不多的,所以内容直接从YOLOv8中copy过来,具体不同细节再详细论述。

二、项目梳理

做YOLOv10的模型训练与部署,与YOLOv8基本是相同的,可以在ultralytics的项目上训练,再把得到的模型放到瑞芯微在Github上的ultralytics_yolov10项目中进行onnx模型转换,再将得到的onnx模型放到虚拟机中转换得到rknn模型

三、文件梳理

我们需要以下四个项目文件:
第一个:YOLOv10模型训练项目文件(链接在此),
第二个:瑞芯微仓库中的pt转onnx项目文件(链接在此);
第三个:用于在虚拟机中进行onnx转rknn的虚拟环境配置项目文件(链接在此);
第四个:在开发板上做模型部署的项目文件(链接在此)。
注:第四个项目文件中的内容很多,里面涉及到rknn模型转换以及模型部署的所有内容,所以该文件在模型转换中也要与第三个文件配合使用。
这三个文件的版本如下:rknn_model_zoo用v2.1.0,rknn-toolkit2也用v2.1.0,其余两个就用正常的main版本即可。如图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里解释下用瑞芯微的YOLOv10和清华官方的YOLOv10有什么不同:
其实根据上图可以看到,瑞芯微的YOLOv10和清华的YOLOv10是一样的,是对清华的YOLOv10做了一点点适应板端部署的微调
具体改动如下:
1、修改输出结构,移除后处理结构(后处理结构对量化不友好)(但是量化后得到的score往往集中在几个固定的值,这也是量化的缺陷之一,但是速度会快很多)
2、 dfl结构在NPU处理上性能不佳,移至模型外部的后处理阶段,此操作大部分情况下可提升推理性能。
3、模型输出分支新增置信度的总和,用于后处理阶段加速阈值筛选。
注:以上移除的操作,均需要在外部使用CPU进行相应的处理.(对应的后处理代码可以在rknn_model_zoo中找到

这三个链接,全是在瑞芯微在Github上的官方仓库,最好科学上网后下载,其中,在Github上搜索rknn-toolkit2会有两个仓库,请以我的链接为准,另一个仓库是瑞芯微之前的官方仓库,并已弃用,现已转为上示链接。

最后,再放一张图,捋清RKNPU2(即rknn-toolkit2)与rknn_model_zoo的版本对应关系,避免版本不对导致的不适配问题。
在这里插入图片描述

四、模型训练

1、训练环境搭建

把瑞芯微的项目git clone下来后,先创建环境:conda create -n yolov10 python=3.9
创建完成后激活环境:conda activate yolov10
配置环境依赖:pip install -r requirements.txt
配置ultralytics:pip install -e .
注:e后面有.

2、模型训练

yolov10的训练方式有很多种,有的是通过命令行进行训练,有的是自己写一个train.py的脚本,在脚本中输入超参数后,再进行训练…,在此,博主建议大家采用脚本训练的方法,并且将脚本放在ultralytics文件夹的同级下,如图所示:
在这里插入图片描述
注:如果大家的数据集量足够,5000+以上的话,建议像上图一样直接用yaml文件训练,没必要再使用预训练权重做迁移学习,效果一样甚至更好。(yaml训练可能会在前几个epoch时精度很低,但能很快提升上来)

说一下为什么采用脚本训练的原因:因为在YOLOv10的项目中,存在一个ultralytics文件夹,而我们在配置环境的时候,又有名为ultralytics的环境包,二者存在歧义,导致我们在ultralytics文件夹中进行参数修改后却不生效的情况,(这时如果仍要通过命令行进行训练,必须要在环境配置文件中进行相应修改),比如更改激活函数后,发现得到的PT模型仍为最初的SiLU激活函数,这是因为命令行会优先调用环境配置文件中的参数,所以在ultralytics文件夹中修改激活函数后并不会生效(博主自己踩坑,请大家避免)。

yolov10n.yaml文件如下所示,记得把nc改成自己的类别数:

在这里插入图片描述
训练文件:
在这里插入图片描述
上图这几个文件都是要的,不然训练不成功,mycoco.yaml就是train.py中调用的数据集加载文件。

train.py中提到的mycoco.yaml内容如下所示:
在这里插入图片描述
path路径参数按照自己的情况进行设置。

在激活yolov10环境后,执行train.py:python train.py

得到的PT模型结构如下所示:
在这里插入图片描述
注:YOLOv10最好使用默认的SiLU激活函数,这点和YOLOv8是不同的

五、PT转ONNX

在第二个文件中(我将该项目文件重命名为yolov10pt2onnx)放置我们之前训练得到的best.pt模型,这里我重命名为了trybest.pt,如下所示:
在这里插入图片描述
然后在当前环境下执行命令:yolo export model=trybest.pt format=rknn opset=13 simplify
得到名为trybest.onnx的模型,如图所示:
注:这里yolov10pt2onnx环境和前面提到的训练yolov10时的环境一模一样,不用重复创建环境)
在这里插入图片描述
onnx模型结构输入输出如下所示:
在这里插入图片描述
YOLOv10在RKNN转换过程中,是要有三个分支的,分别80×80检测头,40×40检测头,20×20检测头。每个检测头下,都有2个输出,分别是box边框输出,即图上的1×64×80×80;还有各类别输出,即1×4×80×80(这里的4就是指我在PT模型训练时的mycoco.yaml文件中定义了4个类别)(其余检测头同理)

六、ONNX转RKNN

在进行这一步的时候,如果你是在云服务器上运行,请先确保你租的卡能支持RKNN的转换运行。博主是在自己的虚拟机中进行转换。
先安装转换环境
这里我们先conda create -n rknn210 python=3.8创建环境,创建完成如下所示:
在这里插入图片描述
现在需要用到rknn-toolkit2-2.1.0文件。
进入rknn-toolkit2-2.1.0\rknn-toolkit2-2.1.0\rknn-toolkit2\packages文件夹下,看到如下内容:
在这里插入图片描述
在终端激活环境,在终端输入pip install -r requirements_cp38-2.1.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
然后再输入pip install rknn_toolkit2-2.1.0+708089d1-cp38-cp38-linux_x86_64.whl
此时,我们的转rknn环境就配置完成了。

现在要进行模型转换,其实大家可以参考rknn_model_zoo-2.1.0\examples\yolov10下的README指导进行转换:
在这里插入图片描述
在这里插入图片描述
这里我也详细再说一遍转换流程:先进入rknn_model_zoo-2.1.0\examples\yolov10\python文件夹,打开yolov10.py,进行适配参数修改:
在这里插入图片描述
然后修改convert.py,如下所示:
在这里插入图片描述

修改完成后,将我们之前得到的onnx模型复制到model文件夹下:
在这里插入图片描述
打开终端,激活rknn210环境,输入命令:python convert.py trybest.onnx rk3588
结果如下:在这里插入图片描述
注:上图的newrknn环境和rknn210环境完全一样,只是名字改了

现在我们可以在model文件夹中看到我们转换的到的trybest.rknn模型了,如图所示:
在这里插入图片描述
现在用netron打开我们的rknn模型,看一下结构:
在这里插入图片描述
由上图可以看到,onnx模型的6个输出会一样出现在rknn模型上。所以如果onnx模型有问题,则无法转出正常的rknn模型

在这里插入图片描述

七、模型部署

如果前面流程都已实现,模型的结构也没问题的话,则可以进行最后一步:模型端侧部署。
我已经帮大家做好了所有的环境适配工作,科学上网后访问博主GitHub仓库:YOLO11_RK3588_object_detect 进行简单的路径修改就即可编译运行。

重点:请大家举手之劳,帮我的仓库点个小星星
点了小星星的同学可以免费帮你解决转模型与部署过程中遇到的问题。
在这里插入图片描述
git clone后把项目复制到开发板上,按如下流程操作:
①:cd build,删除所有build文件夹下的内容
②:cd src 修改main.cc,修改main函数中的如下三个内容:
在这里插入图片描述
将这三个参数改成自己的绝对路径
③:cd src 修改postprocess.cc下的txt标签的绝对路径:
在这里插入图片描述

解释一下,这个标签路径中的内容如下所示:
在这里插入图片描述

其实就是你在训练yolov8时在yaml配置文件中的那几个类别名

④修改include/postprocess.h 中的宏 OBJ_CLASS_NUM
在这里插入图片描述

⑤:把你之前训练好并已转成RKNN格式的模型放到YOLOv10_RK3588_object_detect/model文件夹下,然后把你要检测的所有图片都放到YOLOv10_RK3588_object_detect/inputimage下。
在运行程序后,生成的结果图片在YOLOv10_RK3588_object_detect/outputimage下

⑥:进入build文件夹进行编译

cd build
cmake ..
make

在build下生成可执行文件文件:rknn_yolo11_demo
在build路径下输入

./rknn_yolo11_demo

运行结果如下所示:
在这里插入图片描述
原inputimage文件夹下的图片:
请添加图片描述

在执行完./rknn_yolo11_demo后在outputimage下的输出结果图片:
请添加图片描述

可以看到,与终端显示的检测结果一致。

以下是其他场景部署结果示例:
在这里插入图片描述
在这里插入图片描述
可以看到模型检测精度一般吧,算不上优秀,量化时有一定的损失,推理速度平均30ms,图片大小为1080P

上述即博主此次更新的YOLOv10部署RK3588,包含PT转ONNX转RKNN的全流程步骤,欢迎交流!

### 飞腾派开发板上的YOLO模型部署 #### 准备工作 为了在飞腾派开发板上成功部署YOLO模型,前期准备工作至关重要。这包括但不限于获取适合的YOLO版本以及准备必要的依赖库和工具链。对于YOLOv8而言,在边缘设备上的应用展示了其卓越性能[^1]。 #### 获取YOLO模型文件 可以从官方发布的资源页面下载预训练好的YOLO模型权重文件。这些模型已经在多个数据集上进行了充分训练,能够直接用于目标检测任务而无需额外调整参数设置[^2]。 #### 开发环境搭建 针对特定硬件平台如飞腾派开发板,需安装适配的操作系统并配置好Python解释器及相关机器学习框架。考虑到RK系列芯片的特点,建议采用轻量化方案来优化运行效率和支持实时处理能力[^3]。 #### 转换模型格式 为了让YOLO能够在ARM架构处理器高效执行,通常需要将原始网络结构转化为更适合嵌入式系统的表示形式——例如RKNN。此过程涉及使用专用工具完成从PyTorch/TensorFlow到RKNN IR(Intermediate Representation)再到最终可加载二进制文件(.rknn)的一系列变换操作。 ```bash # 安装RKNNTensorflowConverter工具包 pip install rknn-toolkit==0.97.0b20220624 --force-reinstall # 执行模型转换命令 python -m rknn.api.convert \ --model yolov5s.onnx \ --output_path ./yolov5s.rknn \ ... ``` #### 测试与验证 一旦完成了上述步骤,则可以在真实环境中测试所部署的应用程序。通过编写简单的脚本来读取摄像头输入流并将每一帧图像送入已编译完毕的目标识别引擎中进行分析;最后输出标注后的可视化结果供观察评估。 ```python from rknn.api import RKNN if __name__ == '__main__': # 初始化RKNN实例对象 rknn = RKNN() # 加载预先构建好的.RKNN文件 ret = rknn.load_rknn('./yolov5s.rknn') # 设置运行选项... # 进行推理预测 # 清理释放资源 rknn.release() ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值