------------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的全流程步骤,欢迎交流!