首页 > 其他分享 >晟腾 YOLOV5 转onnx

晟腾 YOLOV5 转onnx

时间:2023-02-03 15:55:32浏览次数:61  
标签:... YOLOV5 onnx self torch 修改 export

晟腾 pytorch 转onnx
以下操作都是基于官方yolov5s.pt 为案例

1 修改yolov5 export.py 文件
/YOLOv5/yolov5/models/common.py 中 Foucs 类中的 forward方法。

修改yolov5 网络的 Focus 结构。添加逻辑,当作为onnx 导出时修改Foucus 的结构。

def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
    if torch.onnx.is_in_onnx_export():
        a, b = x[..., ::2, :].transpose(-2, -1), x[..., 1::2, :].transpose(-2, -1)
        c = torch.cat([a[..., ::2, :], b[..., ::2, :], a[..., 1::2, :], b[..., 1::2, :]], 1).transpose(-2, -1)
        return self.conv(c)
    else:
        return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))

说明 torch的transpose方法 是交换两个维度。假如x.shape=(1,3,320,640)

x.transpose(-2,-1)---->shape(1,3,640,320) 类似于转置操作。

下图为修改之前的Focus 操作图表示。


DeepinScreenshot_select-area_20230104153056

下图为修改后的图表示focus


DeepinScreenshot_select-area_20230104153037​

2 修改 yolo.py 文件
主要目的是控制转换成onnx 的 后处理部分,也就是还原成三个输出的格式:

1x255x80x80; 1x255x40x40; 1x255x20x20;

class Detect(nn.Module):
def forward(self, x):
for i in range(self.nl):
x[i] = self.mi # conv
# ******* 修改内容 *****
if torch.onnx.is_in_onnx_export():
continue
# **********************
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()

原始的yolov5 会将三个输出进一步整理格式(1x3x85x20x20)

修改 onnx 的算子版本为11
修改 models.export.py 文件。

torch.onnx.export(model, img, f, verbose=False, opset_version=11, input_names=['images'],
output_names=['classes', 'boxes'] if y is None else ['output'],
dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # size(1,3,640,640)
'output': {0: 'batch', 2: 'y', 3: 'x'}} if opt.dynamic else None)
3 最后 使用onnx-simplifer工具进行简化
此工具主要用于简化onnx的算子,比如算子融合等。

python3 -m onnxsim --skip-optimization yolov5s.onnx yolov5s_sim.onnx

标签:...,YOLOV5,onnx,self,torch,修改,export
From: https://www.cnblogs.com/ryzemagic/p/17089528.html

相关文章

  • 车牌识别服务-JAVA+ONNX版本,支持全类型的车牌
    1、车牌识别简介车牌识别分为车牌检测与识别,检测模型一般需要检查车牌的位置识别模型一般为识别车牌号及车牌的颜色类型等,目前有较多的深度学习模型能支持,这里就不详细......
  • yolov5训练前准备工作(采样、制作数据集、数据集增强、数据集预处理)
    写在前面训练数据可以有多种输入方式,本文提到了其中一种。使用的时候注意工作路径。使用方法:收集图片,或使用video_2_jpg.py采样视频,(用cam_video.py拍视频,用get_img.py拍照......
  • yolov5检测框重合重复,手动调参方法(调整detect,val的conf,iou)
    一、问题描述:检测框重复出现上述问题一般是整体检测方向没错,但conf-thres和iou-thres的参数需要调整。(在默认值0.25和0.45的基础上,提高置信区间,降低iou)conf-thres:置信......
  • yolov5 优化——mosaic相关
    概述Mosaic利用了四张图片重新排布成一张图片,根据论文所说其拥有一个巨大的优点是丰富检测物体的背景:随机缩放增加了很多小目标,让网络的鲁棒性更好;且在BN计算的时候一下子......
  • yolov5 提速多GPU训练显存低的问题
    修改前:按照配置,在train.py配置如下:运行pythontrain.py后nvidia-smi显示显存占用如下:修改后参考yolov5官方中的issue中,有人提到的分布式多进程的方法:在yolov5运行......
  • 关于yolov5训练后权重较大的原因及其解决方案
    yolov5在官方预训练权重的基础之上再训练后权重较预训练权重大很多,为了大家更加直观的了解为什么及其解决方案,此篇简单介绍一下。精度变化官方给的预训练权重是FP16,而我们......
  • 将keras的h5模型转化为onnx
    将keras的h5模型转化为onnx先安装pipinstallkeras2onnximportkerasimportkeras2onnximportonnxfromkeras.modelsimportload_modelmodel=load_model('/root/noteb......
  • jetson nano yolov5
    ​​Yolov5学习笔记(2)——部署在jetsonnano上​​​​tensorrtx​​3.利用TRT加速部署模型3.1下载tensorrtx的源码很高兴你能来到这里,到这里已经完成了一半,是不是觉得很......
  • onnx模型部署(一) ONNXRuntime
        通常我们在训练模型时可以使用很多不同的框架,比如有的同学喜欢用Pytorch,有的同学喜欢使用TensorFLow,也有的喜欢MXNet,以及深度学习最开始流行的Caffe等等,这样不......
  • Yolov5_v6.2训练数据集进行预测
    Yolov5_v6.2训练数据集进行预测学习笔记记录一下第一次进行Yolov5的部署,调试,训练,预测。第一次发布在了CSDN:链接:https://blog.csdn.net/C_1Y1_T/article/details/12769......