yolov4-tiny通过pytorch导出不带split算子的onnx

news2024/11/16 11:26:30

前言

最近一直忙于模型移植板端,用了不少厂家的sdk,发现挺多厂家的sdk都处于起步阶段,缺少一些技术支持,比如不支持五维向量,不支持一些onnx算子,不支持过深的模型结构,我最爱的Yolov5,v6,v7等高精度目标检测模型都无法移植上去,那就只能把眼光放回几年前尝试移植yolov3tiny和yolov4tiny,结果发现这玩意它要么darknet转onnx,要么是非官方实现的pytorch转onnx,转了之后还要求版本,算子,才能移植。
比如yolov3tiny网上下载的预训练权重本身就有问题(虽然之后修复但因为未知原因仍然没法移植过去),而yolov4tiny的问题在于不支持split算子,所以本文我来分享一下修改yolov4tiny的结构从而导出能移植的onnx,免得后来人又像我一样浪费几天时间折腾。

注:修改onnx有两种方式,导出前改和导出后改,在这里不推荐导出后改,难改也容易出问题,另外网上的onnx可视化修改工具我也试过了,十个里八个修改错误,基本没用。

准备

onnx
onnxsim
pytorch

这些前置要求请根据自己的环境配置。
我这里onnx1.12.0,torch1.11.0+cpu,onnxsim0.4.10。
1.下载yolov4的pytorch版源码和对应pth文件。

git clone https://github.com/bubbliiiing/yolov4-tiny-pytorch

进github页面里附带的百度网盘地址:
在这里插入图片描述
下载yolov4_tiny_weights_coco.pth即可。这里给不懂pytorch的说明一下,pth需配合模型网络代码才能成功加载,你如果只load pth只有一串字典。。

2.下载解压后打开目录下predict.py文件:
在这里插入图片描述
把mode里的值修改为export_onnx,就可以运行python predict.py产生onnx了

3.打开同一目录下yolo.py文件,查看或修改如下:

在这里插入图片描述
如果你没有显卡或者说没有安装cuda,把cuda设为False,这里默认是True。

在这里插入图片描述
这里是控制torch导出onnx的行为,其中最重要的是opset_version,请根据你所需要的算子版本来,这里默认是12,我需要的也是12,就不改了。此外默认是开启onnxsim简化的,这个简化很重要,能避免torch导出一些不必要的算子。

4.修改nets文件夹里的CSPdarknet53_tiny.py:

经过查找,这里面残差块的torch.split函数导致torch导出onnx时产生了split算子:

c = self.out_channels
# 对特征层的通道进行分割,取第二部分作为主干部分。
x = torch.split(x, c//2, dim = 1)[1]
# 对主干部分进行3x3卷积
x = self.conv2(x)

在netron里表现如下:
在这里插入图片描述
就是沿着第二个维度分成两半然后取第二部分。这其实和torch.chunk函数表现是相同的。
所以我们修改代码如下:

c = self.out_channels
# 对特征层的通道进行分割,取第二部分作为主干部分。
x = torch.chunk(x, 2, dim=1)[1]
# 对主干部分进行3x3卷积
x = self.conv2(x)

5.最后导出,命令行里运行python predict.py,并在model_data文件夹下用netron查看模型。
这里先展示没有开启onnxsim,导出的模型图,你会发现整了多余的shape和gather算子:
在这里插入图片描述
如果按照默认设置开启了onnxsim,就可以导出正确的模型结构图:
在这里插入图片描述
发现split已经完美变成了Slice,达到了我们的目的。

总结

我估计可能有看完的读者会问,既然如此为啥不直接用onnx的api来删除然后插入一个Slice算子呢?之前也讲过了,不仅很复杂,而且你插入之后onnx它不认!与其继续折腾不如在导出前就修改网络结构,只要明白torch和onnx算子的对应关系还是很容易做到的。另外这里预告一下,下一篇文章将介绍如何修改darknet转onnx的结构使得yolov3tiny.onnx能够正确运行,那个东西在github上被提了一堆issue反映shape inference error,但原始作者没有回答。

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

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

相关文章

阿里云公网部署openyurt集群添加本地边缘节点并支持metrics-server和prometheus

公网部署openyurt集群并支持metrics-server和prometheus删除以前的集群创建虚拟网卡初始化主节点安装kubeadm等初始化安装网络插件flannel根据官方文档调整部署OpenYurt的Control-Plane组件部署openyurt/openyurt组件部署kuboard方便可视化主节点改造使其可以部署metrics-serve…

字节算法中了80%!靠着这份GitHub上的算法小抄,成功斩获字节Offer

最近,GitHub上的算法小抄又火了!已经有不少人靠它手撕算法题,拿下了字节、腾讯等大厂offer! 不问不知道,这份刷题笔记来自FB高级架构师、ACM金牌选手。 这位大佬在刷题和打ACM比赛中总结出了经验和套路,又…

C#基础知识体系框架图,及起对应我发过的博客

自己工作开发C#上位机总结的,不好勿喷,更多资料去微软官网搜索就好 下面按照从基础到开发使用的顺序,对应我以前发过的链接(后面再附上我自己的框架图): C#与C不同的一些基础命令_花开莫与流年错_的博客-…

深入理解Java中的三个修饰符(抽象(abstract)、静态(static)和最终的,不可变(final))【配视频】

🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习…

Linux文件系统上的特殊权限

Linux 的文件权限,远不止 rwx 那么简单,还有一些特殊权限是用来打破限制和默认的安全上下文规则的,除了之前介绍过的隐藏属性,还有几个显式的特殊权限。下面就来说说 Linux 文件系统上的 SUID,SGID 和 Sticky 权限。 …

Vue2基础篇-20-生命周期回调函数

1.vue2的生命周期 beforeCreate :在实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用; created: 在实例创建完成后被立即同步调用; beforeMount: 在挂载开始之前被调用 mounted : 实例被挂载后调用; beforeUpdate: 在数据发生…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java民生租赁车辆管理信息系统w29s0

如果你自己基础不好或者是小白的情况下那就建议你选择网站、系统类的去做,但是还得问问你们导师,如果你们导师没问题就可以,因为有的导师是不愿意你们选择做网站、系统的,毕竟做的人比较多,重复率调高,选择…

springboot中统一日志管理

Springboot中统一日志管理 一、为什么要用日志? 一般分为两个大类:操作日志和系统日志 **操作日志:**用户在操作软件时记录下来的操作步骤,便于用户自己查看。主要针对的是用户。 **系统日志:**系统日志是记录系统…

zeno封装子图

选中想要封装的节点,点击编辑->简易子图 2. 设置输入输出(可以有多个) 最后,在main图中测试

CDGA|6大核心环节,详解医疗机构如何做好数据治理

医疗机构进行数据治理的过程,就是对其数据资产进行管理和控制,支撑并保障数据被安全高效地交换与应用的过程。 我们接下来主要从6个核心环节来详解医疗机构如何做好数据治理。 环节一:设立数据治理组织结构 设计健全的数据治理组织结构&…

网络配置(桥接仅主机自定义网络)

目录 一、网络模式简介 1.bridge模式(默认桥接模式) 总结:桥接模式的特点就在于,它所虚拟的服务器都有独立的IP 初始网络模式 2.host模式(仅主机模式) 总结:仅主机它不会分配IP&#xff0c…

java计算机毕业设计ssm校园考研互助网站71747(附源码、数据库)

java计算机毕业设计ssm校园考研互助网站71747(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

基于Android的校园二手闲置物品交易系统设计与实现

一、选题背景和意义 随着商品经济的快速发展,人们的生活中出现了大量的闲置物品,这种现象在当代大学生中尤为显著。大多数学生是通过摆地摊的方式来交易闲置物品,这种交易方式效率低下并且信息滞后。还有一部分学生通过BBS论坛来交易闲置物品…

springboot--web开发

使用springboot开发web项目 1)、创建SpringBoot应用,选中我们需要的模块; web 2)、SpringBoot会默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以将项目运行起来 ;/ 3)、自己编…

Paddle 点灯人 之 Paddle介绍

Paddle 点灯人 之 Paddle介绍 文章目录Paddle 点灯人 之 Paddle介绍选择Paddle学习的原因Paddle免费提供的强大算力资源Paddle简单介绍Paddle的优势Paddle相关资料汇总选择Paddle学习的原因 首先,我想讲一下,为什么我想学习paddle,或者说为什…

【C++】STL——vector的模拟实现

vector的模拟实现 文章目录vector的模拟实现一、vector模拟实现总览二、模拟实现vector函数接口1. 默认成员函数1.1. 构造函数1.2. 析构函数1.3.拷贝构造函数(深拷贝)1.4. 赋值运算符重载函数2. 容量操作函数2.1. size和capacity2.2. resize2.3. reserve…

高数 | 【数一专项】真题回顾整理及知识点总结

本文摘录于周洋鑫2023考研数学真题刷题班串讲~ 均为自用笔记整理。 ヾ(◍∇◍)ノ゙ 加油! 对密度的积分 一、空间几何 1.1、旋转面方程 ☆ 常见二次曲面

MINRES(极小残差算法)求解线性系统详细解读

本博客参考了添加链接描述这篇知乎 先看我这篇博客介绍添加链接描述 QkRk−1Q_k R_{k}^{-1}Qk​Rk−1​的处理 假设Dk[d1,d2,…,dk]QkRk−1D_k [d_1,d_2, \ldots, d_k] Q_k R_{k}^{-1}Dk​[d1​,d2​,…,dk​]Qk​Rk−1​,假设RkR_kRk​的第iii行第jjj列元素为ri,…

在无控制点的条件下如何用RTK定线定位

作为测量人的你,是否遇到过暂时没有测区范围内的控制点资料,或者虽然有控制点资料,但没有这些点的 WGS84坐标的情况?这时候如何处理呢? 其实在没有控制点的情况下,可以利用RTK技术提供的在任意点上地方化功…

JavaSe-泛型机制详解

1 理解泛型的本质 JDK 1.5开始引入Java泛型(generics)这个特性,该特性提供了编译时类型安全检测机制,允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再…