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

【已解决】pt文件转onnx后再转rknn时得到推理图片出现大量锚框变花屏

前言

环境介绍:

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,rknn模型能正常转换,并且推理显示正常。但将rknn文件放到开发板,使用rknn_toolkit_lite2进行推理时,得到的推理图片出现大量锚框变花屏,如下。
在这里插入图片描述

二、解决

经过排查发现是前面为了解决rknn置信度大于1,图像出现乱框问题在将pt导出为onnx文件时,对yolo.py文件做了修改,引入了sigmoid函数。
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)

而板子上跑的test_rknn_lite.py后期对数据处理函数与虚拟机上推理导出rknn函数存在差异,而这差异就是对sigmoid函数的处理不同。
在这里插入图片描述

没有sigmoid函数的,不会出现花屏现象!!!

修改过后推理结果正常。

在这里插入图片描述

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

相关文章:

  • DevOps文章之 操作手册用户使用说明书
  • 【RT-DETR进阶实战】利用RT-DETR进行视频划定区域目标统计计数
  • 2.11学习总结
  • 以谷歌浏览器为例 讲述 JavaScript 断点调试操作用法
  • Vue前端框架--Vue工程项目问题总结{脚手架 Vue-cli}
  • Unity2D 学习笔记 0.Unity需要记住的常用知识
  • vue3-应用规模化-单文件组件
  • Redis -- 渐进式遍历
  • 使用 C++23 从零实现 RISC-V 模拟器(3):指令解析
  • CSS Selector—选择方法,和html自动——异步社区的爬取(动态网页)——爬虫(get和post的区别)
  • C语言 服务器编程-日志系统
  • HarmonyOS 状态管理装饰器 Observed与ObjectLink 处理嵌套对象/对象数组 结构双向绑定
  • windows中的apache改成手动启动的操作步骤
  • Intellij Idea的数据库工具 DataGrip
  • 精品springboot疫苗发布和接种预约系统
  • Linux快速入门
  • 【图形图像的C++ 实现 01/20】 2D 和 3D 贝塞尔曲线
  • python+flask+django医院预约挂号病历分时段管理系统snsj0
  • 《CSS 简易速速上手小册》第9章:CSS 最佳实践(2024 最新版)
  • Qt QVariant类应用
  • 不到1s生成mesh! 高效文生3D框架AToM
  • Mac中管理多版本Jdk
  • 用C语言列出Linux或Unix上的网络适配器
  • 单片机学习笔记---LED点阵屏显示图形动画
  • Git分支常用指令
  • 3.3 Binance_interface APP U本位合约行情-实时行情
  • 机器学习——流形学习
  • 离线数仓(一)【数仓概念、需求架构】
  • 物联网测试:2024 年的最佳实践和挑战
  • 蓝桥杯Web应用开发-CSS3 新特性