最近的主要任务是完成自训练的yolov5s模型转rknn模型。
学习笔记:
非github资料收集:
以下为收集资料阶段的结果:
1、首先从RP-rknpu配置说明的文件可以知道:
RV1126_RV1109 的 npu 默认配置为 mini 的,mini 是不带 rknn_server 的,所以不能通过 pc 端连接 主板仿真。但是可以解决。
——————————————————————
群内笔记:
2、rknn lite 是仅仅包含推理功能的包.适合装在开发板上.
3、 rknn toolkit 是包含推理和模型转换还有模拟的开发包. 功能全面, 不建议装在开发板上. 此包依赖 TensorFlow和pytorch 等其它库比较多.
4、因我个人一般使用windows, 建议开发环境训练机是在windows下, 装python3.6版. (一定要装3.6) 然后装rknn toolkit, 如果需要交叉编译等建议使用Ubuntu
5、建议开发版上 装python3.7版 (一定要装3.7). 然后装rknn lite
6、开发板上安装 pytorch 有打包好的源, 无需编译. 详见:
https://blog.csdn.net/phker/article/details/118190816
7、建议使用pytorch训练, 然后转onnx, 然后再用onnx转rknn. 将转换得到的rknn文件, 复制到开发板上, 使用rknn lite 进行推理运算.
8、最后关于yolov5
yolov5 还是得用修改过的库. 修改过的库才能正常转换成rknn...
对新算子的支持还没跟上, 需要将yolov5中的模型做一些修改,
改变之后重新训练新的模型. 再去转onnx, 然后转rknn
yolov5 的模型转换目前存在问题, 无法支持yolov5的全部op算子, 如需使用建议用魔改版的yolov5有下面两个:
https://github.com/EASY-EAI/yolov5
https://github.com/littledeep/YOLOv5-RK3399Pro
EASY-EAI属于比较基础能跑通的项目, 没有后面的可视化部分.
YOLOv5-RK3399Pro 是在 EASY-EAI 的基础上增加了, 可视化和量化,预编译部分的代码
建议不要使用官方的yolov5 模型, 官方的由于更新太快了, rknn的速度跟不上, 训练和转换模型是往往会出现各种各样的算子不支持的问题.
还是使用 https://github.com/littledeep/YOLOv5-RK3399Pro 比较好.
去下载 https://github.com/littledeep/YOLOv5-RK3399Pro吧,
训练的时候可能会遇到点小问题,
记得模型转换onnx的时候如果遇到失败了, 要把 opset 改成 11
把训练的weights 参数改成 ‘’ 空字符串, 这样是全新的训练. 不用下载官方模型.
2021-11-5日,
经过测试在3399pro这块板子上, 未做模型量化, 识别速度0.35秒一张图, 速度很慢无法达到实时.
https://github.com/littledeep/YOLOv5-RK3399Pro.git
这个项目里面, 把Detect 层给排除掉了, 放到了后处理之后单独再处理. 也就是放到了CPU中进行处理. 这样肯定是慢的...
把Detect层移到NPU里面算应该会快很多. 不知道rknn啥时候能支持Detect层的操作?
9、RKNN_Toolkit:
主要是学习Rockchip_User_Guide_RKNN_Toolkit_V1.7.1_CN这个文档。
10、针对yolov5的6.0版本:
这里有一个我觉得应该比较靠谱的,然后解决训练的问题就行了。
yolov5.onnx转rknn失败的解决方案 - 知乎 (zhihu.com)
11、有个收费专栏似乎内容相近,相信大家都明白如何解决:
(3条消息) rockchips--RV1126_陈 洪 伟的博客-CSDN博客
12、RKNN的可视化工具:
python3 -m rknn.bin.visualization
13、一个看起来不错的仓库
(3条消息) yolov5_for_rknn:PyTorch中的YOLOv5>ONNX>RKNN_rknnyolov5,yolov5转rknn-其它代码类资源-CSDN文库
14、PC端运行yolov5官方demo
(3条消息) PC端运行yolov5官方demo:onnx文件转rknn并仿真_gloryor的博客-CSDN博客_rknn yolov5
15、(十九)实践出真知——yolov5s转onnx细节修改 - 知乎 (zhihu.com)
小总结:
(1)需要收费的资料:11和13
(2)官方demo:1和14
(3)一个比较适合yolov5部署的项目:8(缺点是detector是在cpu上跑)
(4)最为详细的文档:9
(5)yolov5-6.0:10(也可以试试)
(6)RKNN可视化:12
(7)2~7是经验之谈,主要是开发环境、rknn-toolkit和rknn-lite
github资料收集
(1)YOLOv5:
ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite (github.com)
目前已经出到了6.1版本,然后在5.0版本的时候YOLOv5s还是最适合嵌入式的最小最快模型,但是在6.0版本出现了一个YOLOv5n的模型,更小更快。但怎么说呢?考量到复现难度、6.0是极限我能转rknn的版本以及mAP,估计我还是老老实实用YOLOv5s吧。
然后的话官方的这个项目应该能做到的是:训练、转onnx、模型推理。
所以我推测rknn能做到的就是得先对onnx模型处理,然后转成rknn,并对rknn模型进行推理。
(2)rknn
其中rv1126使用的是rknn-toolkit,不要以为rknn-toolkit2是改进版
[1]rknpu
rknpu有驱动:
手动更新NPU驱动,就是将相关的驱动拷贝到对应的目录就可以。
- 更新RV1109/RV1126的驱动:
adb push drivers/linux-armhf-puma/ /
adb push drivers/npu_ko/galcore_puma.ko /lib/modules/galcore.ko
- 更新RV1109/RV1126 mini driver:
adb push drivers/linux-armhf-puma-mini/ /
adb push drivers/npu_ko/galcore_puma.ko /lib/modules/galcore.ko
注意:adb不同版本的默认行为不一样,有些是直接push目录的,有些是push目录下的文件。因此替换完后,需要检查一下相关的库是否已经替换成功。比如通过md5sum检查对应文件的md5值是否相同。
另外,toybrick可能对文件路径进行了调整,因此最好通过toybrick自带的方式进行更新。
librknn_api与librknn_runtime的区别:
librknn_api是对librknn_runtime的封装,主要是为了减少对其他so的编译依赖,功能上并未区别。检查驱动版本时,一般以librknn_runtime.so为准。
[2]rknn-toolkit
这里主要关注yolov5,我得建议是对着这的教程弄:
rknn-toolkit/examples/pytorch/yolov5 at master · rockchip-linux/rknn-toolkit (github.com)
实践:
1、pt转onnx
这里提一个奇怪的点,我挂了fastgithub去edge浏览器的github上看项目,但是无论怎么点都显示无法下载,解决办法是换成火狐浏览器就好了。
我发现我是个笨比,分割线下面是我最初的想法,当时还傻傻的用cmd去输入指令运行,后来发现其实可以直接vscode运行export.py。
一开始跑不通官方的项目中的export.py还去找别的项目,但现在官方的也跑通了。
然后的话遇到报错可以去分割线下面翻,应该是都能解决。
我已经按下面的报错修改过代码了,然后才用vscode去运行export.py,会报那个关于ssl的错,把关于ssl的两行注释掉就行。
但是要注意的是:分割线下的项目和官方yolov5-5.0项目的pt和转成的onnx文件都不一样,暂时不知道对后续有什么影响。
——————————————————————————————————————
这里用的项目是:
(十八)实践出真知——yolov5s部署rknn - 知乎 (zhihu.com)
Dreamdreams8/yolov5s_rknn_deploy (github.com)
提一句:我检查了一下yaml文件,这个项目应该跟yolov5官方5.0版本的一样,所以只要是官方5.0版本训练出来的pt文件应该也能用这个项目转换。
安装完requirements.txt运行转换遇到的第一个报错:
(1)urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.github.com', port=443)
解决方法:
读报错信息,发现问题出现在:
yolov5s_rknn_deploy\yolov5s-to-onnx\utils\google_utils.py
然后又看到一个这个博客:
(1条消息) 2020 python解决requests.exceptions.SSLError: HTTPSConnectionPool问题_ywj_486的博客-CSDN博客
第一步:安装依赖库
pip install cryptography
pip install pyOpenSSL
pip install certifi
接下来修改那个google_utils.py文件
第二步:加入这一句
第三步:加一个库和代码
(2) AttributeError: 'Upsample' object has no attribute 'recompute_scale_factor'
解决方法:
(1条消息) AttributeError: ‘Upsample‘ object has no attribute ‘recompute_scale_factor‘_阳光不锈@的博客-CSDN博客
(3)显示有一些模块或者库没装就pip安装就行了
(4)AttributeError: 'Detect' object has no attribute 'm'
说明下的pt权重文件有问题,建议下官方的
2、onnx转rknn
建议去ubuntu下弄,建议直接弄官方给的rknn-toolkit,不建议用上面的知乎项目,因为那个项目用的是rknntoolkit2,环境也和rv1126所用的rknn-toolkit不同。
官方的demo中的test.py想在PC上模拟只有一个要注意:
ret = rknn.init_runtime(),原来括号里有指定平台,但目前我想在PC上仿真,所以去掉括号内容即可,但是现在在running model报了一个错:
1、Warning: Cmodel got negative postshift!
解决方法:
这个应该只是警告,似乎并不影响程序运行,但现在还比较慢。
2、官方yolov5demo有一个报错:
那个是索引有问题我记得应该是output[]啥的,报错位置把索引从1,2,3改成0,1,2
————————————————————————————————
总结:
1、实践说白了就两步:得到onnx(运行export.py)和运行官方yolov5的test.py(得到rknn模型并预测)
2、
从yolov5的官方demo来看,实际上只要是yolov5的5.0版本的算子都是支持的。就意味着,只要你能把pt或者pth转成onnx,都是可以转换成rknn模型进行推理的。
然后现在有了几个新问题:
一个是原来进行推理的detect层似乎是不支持转换成rknn的,所以一般现在的处理是对除去detect层的模型转换成rknn模型。然后输入图片,借助rknntoolkit进行推理,得到推理后的数据,然后再通过程序来进行后处理(即确定种类、画框和置信度),而后处理的程序则一般是用cpu运行的,速度相对来说就比较慢。
此外,rknn推理速度上也有一些不同。所以为了推理速度,一般是:
改变如下:
- 将Focus层改成Conv层
- 将Swish激活函数改成Relu激活函数
- 将大kernel_size的MaxPooling改成3x3 MaxPooling Stack结构
这个的话就相当于我笔记里群里推荐的两个专门用于板子的yolov5模型,相当于用精度换速度。
最后的话还可以通过量化进一步加快推理速度,当然精度也会下降。
3、ubuntu下usb驱动的摄像头也是能照常工作。
4、那现在我项目干脆直接先实现电脑摄像头读取,然后用板子去计算结果然后再用电脑后处理。