yolov5 转换为rknn模型在3588上运行

为了把yolov5在rk3588上跑起来,在网上搜罗了一圈,踩了一些坑。由于瑞芯微的文档有升级,导致和网络的文章有出入,所以做个记录。

rknn-toolkit 转换文档:

瑞芯微的转换文档在 rknn-toolkit/example/pytorch/yolov5/REAME.md 里

当版本升级到 1.7.5的时候,文档被删除,说是要根据airockchip/rknn_model_zoo (github.com) 里的指令来完成。但是model_zoo里的文档也是没有说太清楚。

把rknn-toolkit版本退回到,在 1.7.3 版本中还是有的。下面就是按照1.7.3的说明来操作。

yolov-v50 的环境:

官方文档指定使用yolov5 v5.0,因此需要获取特定的版本。

需要安装 pytorch 1.10.0 以下版本,否则会报错:

AttributeError: ‘Upsample’ object has no attribute ‘recompute_scale_factor’

但是在python 3.10 版本下没有 pytorch 1.9.1 了,所以要装python 3.8的环境:

conda create -n YOLOV5-V50 python==3.8

然后把requirement.txt 中的torch 改成 torch<1.10.0

pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpleSimple Indexicon-default.png?t=N6B9https://pypi.tuna.tsinghua.edu.cn/simple

权重文件:

在执行 python detect.py 默认下载的是最新版本的权重文件,我们需要v5.0的权重文件,所以需要手动下载

wget https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt

检测:

默认使用coco数据集,yolov5s.pt

python detect.py

修改模型,导出

重点是RKNN把最终的sigmoid从模型内部给拿到外部,把sigmoid交给cpu去计算了。具体的参见 rknn-toolkit/example/pytorch/yolov5/REAME.md

3. 直接使用pt模型转为rknn模型时,需要修改 yolov5/models/yolo.py文件的后处理部分,将class Detect(nn.Module) 类的子函数forward修改为:

def forward(self, x):

      z = [] # inference output

      for i in range(self.nl):

           x[i] = self.m[i](x[i]) # conv

      return x ```

导出

python export.py --weights yolov5s.pt --img 640 --batch 1 --include onnx

测试和转换

测试:

测试的时候生成的rknn文件是用于3566的,不知道怎么给弄成3588的,所以测试只能测试

然后把这个.onnx 文件放到

rknn-toolkit2/examples/onnx/yolov5/

修改 test.py,转换为rknn模型,并查看 result.jpg是不是正确

转换为3588的:

转换的脚本不在rknn-toolkit2下,而在 rknpu2/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5 下,修改

platform = 'rk3588' 和 model path,然后运行脚本可以得到rknn

用这个rknn替换掉板子上的文件,可以运行,识别率似乎下降了一点,发现推理时间从20多ms变为30ms左右。

在测试的时候,发现官方提供的onnx是81层,而我们转化出来的是96层,可能延时时间长跟这个有关系。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源介绍】 基于RK3588上部署yolov5s模型源码(实时摄像头检测)+部署说明文档.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 yolov5模型(.pt)在RK3588(S)上的部署(实时摄像头检测) - 所需: - 安装了Ubuntu20系统的RK3588 - 安装了Ubuntu18的电脑或者虚拟机 <details> <summary>一、yolov5 PT模型获取</summary> [Anaconda教程](https://blog.csdn.net/qq_25033587/article/details/89377259)\ [YOLOv5教程](https://zhuanlan.zhihu.com/p/501798155)\ 经过上面两个教程之后,你应该获取了自己的`best.pt`文件 </details> <details> <summary>二、PT模型转onnx模型</summary> - 将`models/yolo.py`文件中的`class`类下的`forward`函数由: ```python def forward(self, x): z = [] # inference output for i in range(self.nl): x[i] = self.m[i](x[i]) # conv bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() if not self.training: # inference if self.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) if isinstance(self, Segment): # (boxes + masks) xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4) xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf.sigmoid(), mask), 4) else: # Detect (boxes only) xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4) xy = (xy * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf), 4) z.append(y.view(bs, self.na * nx * ny, self.no)) return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x) ``` 改为: ```python def forward(self, x): z = [] # inference

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值