Yolov5导出模型修改Output格式

部署运行你感兴趣的模型镜像

1.Yolov基本使用

1.创建conda虚拟环境
conda create -n yolov5 python=3.7.5
conda activate yolov5
pip install -r requirements_yolov5.txt

requirements_yolov5.txt 内容如下

gitpython
ipython  # interactive notebook
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.1
Pillow>=7.1.2
psutil  # system resources
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
thop>=0.1.1  # FLOPs computation
torch>=1.7.0  # see https://pytorch.org/get-started/locally (recommended)
torchvision>=0.8.1
tqdm>=4.64.0
tensorboard>=2.4.1
pandas>=1.1.4
seaborn>=0.11.0

下载代码

git clone -b v7.0 --single-branch https://github.com/ultralytics/yolov5.git
2.PT文件导出为onnx

执行下面的指令会,下载pt文件,并且转换为对应的onnx文件

python export.py --weights yolov5s.pt --include onnx
3.如果修改ONNX的输出参数
1.onnx的输出参数

原始代码导出的ONNX,把yolov5输出的三个层的数据,合并为一个输出,如下面图输出为【1,25200,85】,这个在嵌入式设备上数据快比较大,不太好处理,用CPU处理后续nms的时候稍微有点麻烦,可以修改导出的代码变为3个output,【255,80,80】【255,40,40】【255,20,20】
在这里插入图片描述
在这里插入图片描述

2.代码修改如下

参考资料:https://github.com/sophgo/sophon-demo/blob/release/sample/YOLOv5/docs/YOLOv5_Export_Guide.md

yolov5/models/yolo.py
#大约在54行左右
    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.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
                    self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)

                if isinstance(self, Segment):  # (boxes + masks)
                    xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4)
                    xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i]  # xy
                    wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, conf.sigmoid(), mask), 4)
                else:  # Detect (boxes only)
                    xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4)
                    xy = (xy * 2 + self.grid[i]) * self.stride[i]  # xy
                    wh = (wh * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, conf), 4)
                z.append(y.view(bs, self.na * nx * ny, self.no))

        # return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x)
        # return x if self.training else (torch.cat(z, 1), x)  # 4个输出
        return x                                             # 3个输出
        # return x if self.training else (torch.cat(z, 1))     # 1个输出
	export.py 注释下面三行
    # shape = tuple((y[0] if isinstance(y, tuple) else y).shape)  # model output shape
    metadata = {'stride': int(max(model.stride)), 'names': model.names}  # model metadata
    # LOGGER.info(f"\n{colorstr('PyTorch:')} starting from {file} with output shape {shape} ({file_size(file):.1f} MB)")

3.重新导出yolov5,可以用于atc转换工具.

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 将YOLOv5模型转换为适用于OpenMV的格式 为了使YOLOv5能够在OpenMV上运行,通常需要将其转换为适合嵌入式设备处理的形式。由于OpenMV资源有限,直接支持复杂的深度学习框架较为困难;因此,一般做法是先通过中间表示形式简化并优化模型结构。 #### 转换流程概述 1. **导出ONNX模型** 利用官方提供的工具或自定义脚本将PyTorch(.pt)版本的YOLOv5转化为ONNX格式。此过程可以借助`torch.onnx.export()`函数完成[^1]: ```python import torch model = torch.load('yolov5s.pt')['model'].float() # 加载预训练权重 model.eval() dummy_input = torch.randn(1, 3, 640, 640) # 创建虚拟输入张量 output_names = ["output"] torch.onnx.export( model, dummy_input, 'yolov5s.onnx', opset_version=11, input_names=['input'], output_names=output_names, dynamic_axes={'input': {0: 'batch_size'}} ) ``` 2. **利用OpenVINO进一步优化** 接下来,采用Intel OpenVINO Toolkit来加载上述生成的`.onnx`文件,并执行一系列针对性能提升的操作,最终产出适配于目标硬件平台(即OpenMV)需求的IR (Intermediate Representation) 文件——具体来说就是一对`.xml`和`.bin`组合[^3]: ```bash mo --input_model yolov5s.onnx \ --data_type FP16 \ --scale_values [255.,255.,255.] \ --mean_values [0.,0.,0.] \ --reverse_input_channels \ --output_dir ./openmv_ir/ ``` 3. **移植到OpenMV环境** 完成了前面两步之后,还需要编写相应的C/C++程序以便在OpenMV内部调用这些经过编译后的二进制文件实现图像识别功能。这一步骤涉及到具体的API接口应用以及可能存在的内存管理等问题,建议参考官方文档获取最新指导说明。 需要注意的是,尽管理论上可以通过这种方式让YOLOv5工作在OpenMV之上,但由于后者计算能力和存储空间都非常受限,在实际操作过程中可能会遇到诸多挑战,比如精度损失较大、实时性不足等现象。对于这类小型化边缘计算场景而言,选择更加轻量化的目标检测算法可能是更为明智的选择。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱爬山的木木

佛系111

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值