当前位置: 首页 > 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

参考这位大佬的文件

http://www.lryc.cn/news/296407.html

相关文章:

  • 多路服务器技术如何处理大量并发请求?
  • SpringBoot - 不加 @EnableCaching 标签也一样可以在 Redis 中存储缓存?
  • Linux------命令行参数
  • LLM少样本示例的上下文学习在Text-to-SQL任务中的探索
  • 双非本科准备秋招(19.2)—— 设计模式之保护式暂停
  • 使用SpringMVC实现功能
  • spring aop实现接口超时处理组件
  • c++设计模式之装饰器模式
  • WordPress如何实现随机显示一句话经典语录?怎么添加到评论框中?
  • 【退役之重学前端】vite, vue3, vue-router, vuex, ES6学习日记
  • [linux]-总线,设备,驱动,dts
  • python3实现gitlab备份文件上传腾讯云COS
  • 292.Nim游戏
  • Spring和Spring Boot的区别
  • 备战蓝桥杯---动态规划(理论基础)
  • FPGA_ip_pll
  • 【实验3】统计某电商网站买家收藏商品数量
  • 【Qt】Android上运行keeps stopping, Desktop上正常
  • 算法学习打卡day47|单调栈系列题目
  • Maven构建OSGI+HttpServer应用
  • chrome扩展插件常用文件及作用
  • PdfFactory Pro软件下载以及序列号注册码生成器
  • jsp康养小镇管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • Android 无操作之后定时退出
  • CMS 检测神器:CMSeek 保姆级教程(附链接)
  • oracle 启动命令以及ORA-01033问题处理、删除归档日志
  • 【大模型上下文长度扩展】MedGPT:解决遗忘 + 永久记忆 + 无限上下文
  • 谷歌seo搜索引擎优化有什么思路?
  • 腾讯云与IBM共同打造“高性能计算服务解决方案“
  • 【SparkML实践7】特征选择器FeatureSelector