rv1126下yolov5s转rknn模型

最近的主要任务是完成自训练的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

rockchip-linux (github.com)

其中rv1126使用的是rknn-toolkit,不要以为rknn-toolkit2是改进版

[1]rknpu

rknpu有驱动:

rv1126下yolov5s转rknn模型_第1张图片

手动更新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)

rv1126下yolov5s转rknn模型_第2张图片

rv1126下yolov5s转rknn模型_第3张图片

解决方法:

读报错信息,发现问题出现在:

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文件

第二步:加入这一句

rv1126下yolov5s转rknn模型_第4张图片

 第三步:加一个库和代码

(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推理速度上也有一些不同。所以为了推理速度,一般是:

改变如下:

  1. 将Focus层改成Conv层
  2. 将Swish激活函数改成Relu激活函数
  3. 将大kernel_size的MaxPooling改成3x3 MaxPooling Stack结构

这个的话就相当于我笔记里群里推荐的两个专门用于板子的yolov5模型,相当于用精度换速度。

最后的话还可以通过量化进一步加快推理速度,当然精度也会下降。

3、ubuntu下usb驱动的摄像头也是能照常工作。

4、那现在我项目干脆直接先实现电脑摄像头读取,然后用板子去计算结果然后再用电脑后处理。

你可能感兴趣的:(python)