修改YOLOv5的模型结构

本文介绍了YOLOv5模型中的C3模块结构,探讨了如何移除concat后的卷积操作以优化模型。实验显示,移除该层后准确率下降,表明特征融合的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

YOLOv5 模型结构

YOLOv5模型结构图

C3模块结构图

C3模块结构图

修改目标

修改目标是移除C3模块concat后的卷积操作
目标修改
YOLOv5的模型存储在项目目录下的models目录中。

  • 一些以yaml为后缀的文件保存了一些模型的超参数,通过不同的参数,形成了yolov5s,yolov5n,yolov5l等不同参数等级,不同性能的网络模型。
  • segment文件夹保存的是用于分割的配置
  • experimental.py 文件中保存了一些实验性质的模块
  • tf.py是tensorflow版本的YOLOv5
  • yolo.py 是pytorch版本的YOLOv5,这个文件中主要存放了yolo专用的模型
  • common.py 是pytorch版本的,YOLO用到的一些基本模块,例如上图中的C3模块、Conv卷积块、Bottleneck瓶颈块等。

要想实现修改C3模块,就要从common.py入手。

common.py的简单介绍

common.py中实现了yolov5所用到的一些模块

  • 将卷积、归一化、和激活函数合并成一个Conv模块
  • 将通道数先缩小后放大的Bottleneck模块
  • 结合跳跃连接、Conv、Bottleneck模块的C3模块
  • 为了下采样、降低计算量用的Focus模块
  • 融合多尺度特征的SPP(Sptaial Pyramid Pooling,空间金字塔)模块

然后在上层又创建了AutoShape进行非模型本身的预处理、后处理过程;创建了Detections用于控制检测的过程,记录状态等;创建了Classify用于二级分类。

修改代码

修改前代码

通过阅读源代码可知,想要删除上图中,concat后面的Conv模块,就要让concat的结果能够满足代码中原本cv3的输出格式。可以发现默认的伸缩因子就是0.5,会把cv1和cv2的输出变成c2的一半。这样concat后刚好就是c2,可以直接移除cv3层。但是有可能会出现c3是奇数的情况,这种时候我将通道大的部分分给了bottleneck模块。
修改后的代码如下:

修改后代码
训练修改后的模型,得到的准确率如下:
修改后结果
对比修改前的模型运行准确率:
修改前的模型运行准确率
对比修改前后的准确率,可以发现这层卷积的影响还是很大的,总体的准确率下降了5%。猜测是连接后的特征图直接进行接下来的处理,不能使C3模块两条向前传播的线路捕捉的特征很好的融合到一起,从而影响模型的准确率。

### 修改YOLOv5模型结构以满足特定需求 修改YOLOv5模型结构需要对多个文件进行调整,包括`models/common.py`、`models/yolo.py`、`models/yolov5*.yaml`以及`train.py`等。以下是详细的说明和代码示例。 #### 1. 修改网络结构 在`models/common.py`中添加新的网络模块或修改现有的模块。例如,如果要添加一个新的卷积层,可以定义如下代码: ```python import torch.nn as nn class CustomConv(nn.Module): def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): super(CustomConv, self).__init__() self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False) self.bn = nn.BatchNorm2d(c2) self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity()) def forward(self, x): return self.act(self.bn(self.conv(x))) ``` 将上述代码添加到`common.py`中,并确保其符合YOLOv5的命名规范[^1]。 #### 2. 配置网络结构参数 在`models/yolo.py`中设置网络结构的传递参数。例如,可以通过修改`Model`类中的初始化部分来支持新的模块: ```python def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None, anchors=None): # model, input channels, number of classes super().__init__() if isinstance(cfg, dict): self.yaml = cfg # model dict else: # is *.yaml import yaml # for torch hub self.yaml_file = Path(cfg).name with open(cfg) as f: self.yaml = yaml.safe_load(f) # model dict ``` 确保`cfg`文件能够正确加载自定义模块的配置[^2]。 #### 3. 修改模型配置文件 在`models/yolov5*.yaml`中调整模型的配置。例如,对于`yolov5s.yaml`,可以添加自定义模块: ```yaml # parameters nc: 80 # number of classes depth_multiple: 0.33 # model depth multiple width_multiple: 0.50 # layer channel multiple # anchors anchors: - [10,13, 16,30, 33,23] # P3/8 - [30,61, 62,45, 59,119] # P4/16 - [116,90, 156,198, 373,326] # P5/32 # YOLOv5 backbone backbone: # [from, number, module, args] [[-1, 1, Focus, [64, 3]], # 0-P1/2 [-1, 1, Conv, [128, 3, 2]], # 1-P2/4 [-1, 3, BottleneckCSP, [128]], # 2 [-1, 1, CustomConv, [256, 3, 2]], # 自定义模块 ... ``` 通过调整`depth_multiple`和`width_multiple`参数,可以控制模型的深度和宽度[^3]。 #### 4. 训练时指定配置文件 在`train.py`中指定使用修改后的配置文件。例如,在命令行中运行以下命令: ```bash python train.py --img 640 --batch 16 --epochs 50 --data coco128.yaml --cfg models/yolov5s_custom.yaml --weights yolov5s.pt ``` 确保`--cfg`参数指向修改后的`.yaml`文件[^4]。 #### 代码示例总结 以下是一个完整的流程示例: ```python # 在 common.py 中添加自定义模块 class CustomModule(nn.Module): def __init__(self, c1, c2, k=3, s=1, p=1): super(CustomModule, self).__init__() self.conv1 = nn.Conv2d(c1, c2, k, s, p) self.bn = nn.BatchNorm2d(c2) self.act = nn.ReLU() def forward(self, x): return self.act(self.bn(self.conv1(x))) # 在 yolov5s.yaml 中添加自定义模块 backbone: [[-1, 1, Focus, [64, 3]], [-1, 1, CustomModule, [128, 256]]] # 在 train.py 中指定配置文件 python train.py --cfg models/yolov5s_custom.yaml --weights yolov5s.pt ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值