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

前言

最近一直忙于模型移植板端,用了不少厂家的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,但原始作者没有回答。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: yolov3-tiny-pytorch是一个基于PyTorch框架实现的轻量级目标检测模型,它采用了YOLOv3算法,具有较高的检测精度和较快的检测速度。该模型适用于嵌入式设备和移动端应用等场景,具有广泛的应用前景。 ### 回答2: YoloV3-tiny-pytorch是一个基于PyTorch框架的目标检测算法。该算法是YOLOV3的简化版,主要用于小型目标检测和嵌入式设备等场景下的应用。 YoloV3-tiny-pytorch的特点在于采用了轻量级的网络结构,因此模型参数数量较少,运算速度更快,适用于低算力设备上的目标检测任务。与YOLOV3相比,YoloV3-tiny-pytorch具有更高的检测速度和更低的显存使用率。 作为一种目标检测算法,YoloV3-tiny-pytorch的核心在于特征提取和边界框预测。该算法采用了卷积神经网络提取图像的特征,并在输出层进行边界框预测。为了提高检测精度,YoloV3-tiny-pytorch使用了多层级尺度预测、多尺度训练、多级联分类器等技术。 此外,YoloV3-tiny-pytorch还使用了batch normalization和LeakyReLU等技术,来提高模型的鲁棒性和泛化能力,使得该算法对于不同领域和场景的目标检测任务具有更好的适应性。 总之,YoloV3-tiny-pytorch是一种高效、轻量级的目标检测算法,具有良好的运算速度和较高的检测精度,适用于嵌入式设备等资源有限的场景下的应用。 ### 回答3: Yolov3-tiny-pytorch是一种针对计算机视觉领域中目标检测任务的深度学习算法。它是在yolov3的基础上进行改进的,相比原版的yolov3,它在模型大小和速度上有了明显的优势,特别适合于在内存有限或者需要快速响应的场景下使用。 Yolov3-tiny-pytorch基于深度卷积神经网络架构,它将输入的图像分割成若干个网格,然后对每个网格预测出其中最可能包含目标的区域。同时,它使用类别感知的策略来判断每个网格可能包含哪种目标,并通过对不同网格的预测结果进行组合,得到整个图像中目标的检测结果。 相较于yolov3,yolov3-tiny-pytorch采用了一些优化措施,使得模型更加小巧,运行速度更快。例如,它采用了深度可分离卷积和1x1卷积核来减少参数数量,使用了跳跃式卷积的技术来加速计算,并通过网络层数的减少来进一步压缩模型,从而达到了更高的推理速度。同时,yolov3-tiny-pytorch仍然保持了yolov3在多目标检测方面的优势,在不牺牲精度的前提下,能够同时检测出多个目标。 总之,yolov3-tiny-pytorch是一种高效、轻量级的目标检测方法,它不仅在速度上有优势,而且能够准确地检测出多个目标,因此被广泛应用于各种需要高效目标检测的场景,例如安防监控、自动驾驶等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值