yolov5 v7.0转ncnn时问题解决

news2025/2/25 0:34:46

yolov5 v7.0转ncnn时遇到很多问题,ncnn版本20231027以下仅做记录:

1.通过官方代码,export.py 转onnx,指定–dynamic --simplify参数

2.编译并安装ncnn,通过onnx2ncnn将onnx转化为ncnn.bin和ncnn.param

3.加载ncnn模型(该部分坑很多)

直接加载,构造输入,获取输出,直接挂掉了,经过排查发现问题,如下图:

在这里插入图片描述

  通过节点输出,发现当获取到Slice算子时,输出错误,因此初步判定Slice算子有问题,通过文档查看,发现ncnn中Slice的参数1=3(这里的1是axis),由于ncnn最多支持4维度(忽略掉batch,就只剩3维),因此这里的维度越界了,改为1=2就可以正常运行了。

  修改后接着往下运行,又挂掉了,定位到发现是后边的Concate算子报错了,同样也是维度问题,将0=3改为0=2。

  通过netron观察onnx模型,发现yolov5s 7.0中有三个这样的结构,全部按照上述两个操作更改,如下:

在这里插入图片描述

  运行成功,不会报错了

  然而,ncnn模型输出与onnxruntime推理的模型输出不一致,不仅仅是不一致,里边全是-nan,也就是中间某些层的参数一定是出了问题。

  最开始怀疑是推理模型是的问题,可能是fp32使用int8或fp16推理等,通过文档查看,ncnn推理时默认是使用fp32,而且转模型是默认也是fp32,排除这一想法。

  由于最终模型结构没有问题,那么问题肯定是出在模型参数上了,再次通过各个节点的部分结果与onnxruntime对比,在同样输入时,第一层(Convelution)的结果就不对,肯定是权重或偏置不对。

  于是在ncnn/src/lays/convelution.cpp的load_model中添加输出信息,重新编译安装ncnn,运行代码发现卷积层的weight不对,通过查看ncnn.param文件,发现convelution算子的前边还有6个MemoryData,如下图:

在这里插入图片描述

  查阅文档发现ncnn中参数读取是按照顺序,果然卷积层的错误的权重来自391节点,也就是说MemoryData定义有问题,文档中MemoryData的参数有三个,whc,默认值都是0:
在这里插入图片描述

因此也就是说,ncnn读取权重的时候,MemoryData的大小被误认为是0了,所以就没有读取,直接到Convelution了,所以这里将MemoryData的参数补齐(需要对照Metron的参数维度以及这些节点的使用位置),如下图:

在这里插入图片描述

然后重新运行程序,运行成功,贴一张图展示下:

在这里插入图片描述
  总结一下:

  通过这一波操作下来,发现onnx2ncnn这个工具目前还有很多操作需要完善,单个算子可能没问题,但是多个算子的组合可能就有问题(主要原因是不支持更多维度)。

如果模型转换后遇到模型推理失败:

1.获取节点返回值或输出节点维度,定位到出错节点,然后根据出错节点的参数排查问题

如果推理结果和预期不符:

1.由于ncnn输出的结果都是以ncnn::Mat,因此可以根据各个节点输出与onnxruntime对比,从最开始不一致的节点分析,如果ncnn.param参数没问题,那肯定就是权重问题。

2.切记,不要随意删除有权重信息的中间节点,因为ncnn权重加载是按顺序的,如果含有权重信息的参数被删除,后续的算子参数就是错乱。

如果是算子不支持:

1.通过自定义算子,将代码放在ncnn/src/lays中,重新编译

2.通过自定义算子,在代码运行时注册进去

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在规划项目进度时,必须关注的两个关键点

要想确保项目的成功,项目经理需要制定一个周密的计划,以便快速有效地应对可能出现的问题。这是最佳实践问题管理过程的核心,也是良好项目管理的本质要求。 在规划项目进度时,应该至少关注两个关键方面。 1、进度规划要做到粗细…

一个极好用的浏览器标签页插件

这是我登录后,并且上传了个人壁纸的页面 Br标签页 一 . 我们来看看界面和功能1.注册登录2.首页及右键功能3.添加小组件和app网址4.切换壁纸5. 计划页面 二 . Edge浏览器安装和chrome(谷歌)浏览器安装1. Edge浏览器安装2. chrome(谷…

java--java的参数传递机制

1.java的参数传递机制都是:值传递 ①所谓值传递:值的是在传递实参给方法的形参的时候,传输的是实参变量中存储的值的副本。 ②实参:在方法内部定义的变量。 ③形参:定义方法时"(...)"中所声明的参数。 2.…

区块链-蚂蚁链(阿里系产品),至信链(腾讯系),长安链(国家队)

目录 区块链-蚂蚁链(阿里系产品),至信链(腾讯系),长安链(国家队) ①蚂蚁链(阿里系产品) ②至信链(腾讯系) ③长安链(国家队) Hyp…

基于世界杯算法的无人机航迹规划-附代码

基于世界杯算法的无人机航迹规划 文章目录 基于世界杯算法的无人机航迹规划1.世界杯搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用世界杯算法来优化无人机航迹规划。 1.世界杯…

【C++ 系列文章 -- 程序员考试 201811 下午场 C++ 专题 】

1.1 C 题目六 阅读下列说明和C代码,填写程序中的空(1) ~(5),将解答写入答题纸的对应栏内。 【说明】 以下C代码实现一个简单乐器系统,音乐类(Music)可以使用…

安装2023年10月更新后,继续在Win10上使用IE的方法

简介 由于微软一直试图让Win10的用户迁移到Edge浏览器,因此不断地对Win10上的IE使用加以限制。 先前我们还可以通过金庸IEToEdge BHO的方式继续使用IE。 通过禁用IEToEdge BHO,禁止IE自动跳转(重定向)到EDGEhttps://blog.csdn.…

5.2 参照完整性

思维导图: 5.2.1 定义参照完整性 5.2 参照完整性笔记: 一、概念 参照完整性 (Referential Integrity):确保关系数据库中的数据表间的关系始终保持一致性。外键 (Foreign Key):一个表中的列或列组,用于标识另一个表中…

QMI8658A_QMC5883L(9轴)-EVB 评估板-使用说明书

文章目录 0.前言 1.硬件准备 1.1 I2C 接口 1.2 USART 接口 2.运行程序 2.1 QMI8658A 常值零偏校准 2.2 QMC5883L地磁传感器校准 2.3 校准步骤 3.与 example-algo-visualizer.exe 上位机通信协议 0.前言 【相关博文】 【QMI8658 - 姿态传感的零偏(常值零偏)标定】 【QMC5883L-磁…

计算机毕业设计选题推荐-大学生心理健康测评微信小程序/安卓APP-项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[学习笔记]TypeScript查缺补漏(二):类型与控制流分析

文章目录 类型约束基本类型联合类型 控制流分析instanceof和typeof类型守卫和窄化typeof判断instanceof判断in判断内建函数,或自定义函数赋值布尔运算 保留共同属性 字面量类型(literal type)as const 作用 类型约束 TypeScript中的类型是一…

产品经理一定要学会的原型交互规范设计

一、主级按钮 序号1、序号2:主级按钮 一个按钮区最多一个主级按钮,也可以没有 二、线框按钮 序号3:如果不是非常为了突出“完成”、“推荐”的操作,可以多采用线框按钮 三、红色按钮 序号4:红色按钮不需要选中颜色这…

Vue3.0插槽:VOA模式

用法&#xff1a; 父组件App.vue <template><div><!--将html代码插入到子组件中带默认名称的插槽中--><AChild><!--这段html会插入到AChild组件中<slot></slot>插槽中--><!-- 注意&#xff1a;写在父组件中的html代码只能在父组…

Redis之持久化(RDB和AOF)

文章目录 前言一、RDB1.介绍2.redis.config有关配置3.触发4.恢复5.优缺点 二、AOF1.介绍2.redis.config配置3.启动4.恢复5.重写6.优缺点 总结 前言 Redis 是内存数据库&#xff0c;即数据存储在内存。 如果不将内存中的数据保存到磁盘&#xff0c;一旦服务器进程退出&#xff…

uniapp js-sdk插件之js实用工具包

插件介绍 插件为uniapp前端js工具包&#xff0c;工具包包含了众多模块&#xff0c;数组、颜色、日期、加解密、函数、数字、对象、请求、字符串、验证等模块&#xff0c;可以让您的开发得心应手&#xff0c;不需要为了一个功能需要花费大量的时间从网上再去搜索&#xff0c;本…

什么是覆盖索引?

覆盖索引是指一个索引包含了查询语句所需的所有数据&#xff0c;不仅能够提供索引的搜索能力&#xff0c;还可以完全覆盖查询需求&#xff0c;避免了回表操作&#xff08;即根据索引查找到主键&#xff0c;再根据主键获取数据的额外操作&#xff09;&#xff0c;从而提高查询性…

【AI数学】三维视觉中的四种坐标系

三维视觉中&#xff0c;需要掌握四种坐标系&#xff1a;世界坐标系、相机视角坐标系、NDC坐标系、屏幕坐标系。 世界坐标系&#xff08;World coordinate system&#xff09; 物体或者场景在真实世界中的位置。 相机视角坐标系&#xff08;Camera view coordinate system&…

数字孪生技术:强化紧急响应与决策

随着科技的不断进步&#xff0c;数字孪生技术已经逐渐渗透到了各个行业&#xff0c;其中包括了灾害管理领域。在灾害管理中&#xff0c;数字孪生提供了极大的帮助&#xff0c;使决策者更好地理解和应对各种灾害&#xff0c;包括自然灾害和人为灾害。本文带大家一起探索数字孪生…

WhatsApp Business为什么会被封号?该如何解决

目前&#xff0c;作为全球即时通讯领域的重要平台之一的WhatsApp已成为企业在营销和与客户沟通时的首选工具。但是长时间、高强度的营销行为很容易导致WhatsApp Business账户突然被封禁&#xff0c;无法再使用账号。即使后续再去进行申诉&#xff0c;要求官方解封该账户&#x…

LeetCode----124. 二叉树中的最大路径和

题目 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回其 最大路径和 。 示…