当前位置: 首页 > news >正文

onnx转换为rknn置信度大于1,图像出现乱框问题解决

前言

环境介绍:

1.编译环境

Ubuntu 18.04.5 LTS

2.RKNN版本

py3.8-rknn2-1.4.0

3.单板

迅为itop-3568开发板


一、现象

采用yolov5训练并将pt转换为onnx,再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn出现置信度大于1,并且图像乱框问题。
类似下面这样
在这里插入图片描述

二、解决

经过网上一顿查找发现是在将pt文件转化为onnx时对models/yolo.py的修改有问题。网上大部分的修改都是下面这种
models/yolo.py

def forward(self, x):z = []  # inference outputfor i in range(self.nl):x[i] = self.m[i](x[i])  # convreturn x# 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)

这是导致问题的根源,至于为什么现在我还没办法回答。正确的应该按如下方式修改

models/yolo.py

def forward(self, x):z = []  # inference outputfor i in range(self.nl):if os.getenv('RKNN_model_hack', '0') != '0':x[i] = torch.sigmoid(self.m[i](x[i]))  # convreturn x
# 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.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:
#                 self.grid[i] = self._make_grid(nx, ny).to(x[i].device)
#
#             y = x[i].sigmoid()
#             if self.inplace:
#                 y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
#                 y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
#             else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
#                 xy = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
#                 wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i].view(1, self.na, 1, 1, 2)  # wh
#                 y = torch.cat((xy, wh, y[..., 4:]), -1)
#             z.append(y.view(bs, -1, self.no))
#
#     return x if self.training else (torch.cat(z, 1), x)

export.py文件的run函数

# shape = tuple((y[0] if isinstance(y, tuple) else y).shape)  # model output shape
shape = tuple(y[0].shape)  # model output shape

export.py文件的开头加上

#onn转换添加内容
import os
os.environ['RKNN_model_hack'] = 'npu_2'
#

修改之后按照如下命令导出onnx
其中./runs/train/exp3/weights/best.pt换成自己训练的pt文件

python export.py --weights ./runs/train/exp3/weights/best.pt --img 640 --batch 1 --include onnx --opset 12

参考这位大佬的文件

相关文章:

  • 企业级IT应用运维监控:层次架构设计与实践指南
  • TOP100 矩阵
  • 前后端数据校验
  • Linux 网络编程 + 笔记
  • BUUCTF-Real-[ThinkPHP]5-Rce
  • TPM 2.0安全算法开发示例实战 | 开发准备
  • 07-使用Package、Crates、Modules管理项目
  • 多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测
  • Spring 事务原理总结三
  • MySQL中如何将字符串替换
  • C# 怎么判断屏幕是第几屏幕?屏幕是垂直还是水平?屏幕的分辨率?
  • 老版本O记12C上线前的一些调整
  • npm ERR! code CERT_HAS_EXPIRED
  • oracle数据回滚导致业务性能问题排查
  • 115.工业相机海康SDK开发指南(阅读)
  • SegmentFault for Android 3.0 发布
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Create React App 使用
  • iOS 颜色设置看我就够了
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js操作时间(持续更新)
  • js递归,无限分级树形折叠菜单
  • laravel 用artisan创建自己的模板
  • Linux Process Manage
  • scrapy学习之路4(itemloder的使用)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • SegmentFault 2015 Top Rank
  • Shadow DOM 内部构造及如何构建独立组件
  • Vue 2.3、2.4 知识点小结
  • 记录一下第一次使用npm
  • 悄悄地说一个bug
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用API自动生成工具优化前端工作流
  • 一道闭包题引发的思考
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​力扣解法汇总946-验证栈序列
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (1)(1.13) SiK无线电高级配置(六)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)计算机毕业设计ssm电影分享网站
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net 生成二级域名
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 中使用 Mutex 进行跨越进程边界的同步