YOLOv5改进 添加注意力机制(yolov5修改backbone)

YOLOv5 添加注意力机制全流程:原理、实现与代码调试

一、注意力机制原理

注意力机制的核心是通过动态调整特征权重,使模型聚焦于关键信息。在YOLOv5中,常见注意力机制分为三类:

  1. 通道注意力(Channel Attention)
  • 原理:通过建模通道间相关性,强化重要通道特征,抑制冗余通道。
  • 代表模块:SE(Squeeze-and-Excitation)、ECA(Efficient Channel Attention)。
  • 操作流程:
  • 压缩(Squeeze):全局平均池化生成通道描述符(1×1×C)。
  • 激励(Excitation):全连接层学习通道权重,Sigmoid激活生成0-1权重。
  • 加权:权重与原始特征图逐通道相乘。
  1. 空间注意力(Spatial Attention)
  • 原理:聚焦于目标空间位置,增强关键区域特征。
  • 代表模块:CBAM(Convolutional Block Attention Module)中的空间分支。
  • 操作流程:
  • 池化:沿通道维度进行全局最大/平均池化,生成两个空间特征图(H×W×1)。
  • 拼接与卷积:拼接特征图后通过卷积生成空间权重。
  • 加权:权重与特征图逐元素相乘。
  1. 混合注意力(Hybrid Attention)
  • 原理:结合通道与空间注意力,提升多维度特征表达能力。
  • 代表模块:CBAM(串联通道与空间注意力)。
  • 操作流程:
  • 通道注意力:先处理通道维度。
  • 空间注意力:再处理空间维度,逐级强化特征。

二、实现步骤

以添加SE和CBAM模块为例,详细说明实现流程。

1. 模块定义(common.py)

在models/common.py中添加注意力模块类:

python

import torchimport torch.nn as nn # SE模块class SEBlock(nn.Module): def __init__(self, channel, reduction=16): super().__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction, bias=False), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x) # CBAM模块(简化版)class ChannelAttention(nn.Module): def __init__(self, channel, reduction=16): super().__init__() self.max_pool = nn.AdaptiveMaxPool2d(1) self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Conv2d(channel, channel // reduction, 1, bias=False), nn.ReLU(), nn.Conv2d(channel // reduction, channel, 1, bias=False) ) self.sigmoid = nn.Sigmoid() def forward(self, x): max_out = self.fc(self.max_pool(x)) avg_out = self.fc(self.avg_pool(x)) return self.sigmoid(max_out + avg_out) class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super().__init__() self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): max_out, _ = torch.max(x, dim=1, keepdim=True) avg_out = torch.mean(x, dim=1, keepdim=True) x = torch.cat([max_out, avg_out], dim=1) return self.sigmoid(self.conv(x)) class CBAM(nn.Module): def __init__(self, channel, reduction=16, kernel_size=7): super().__init__() self.ca = ChannelAttention(channel, reduction) self.sa = SpatialAttention(kernel_size) def forward(self, x): x = x * self.ca(x) return x * self.sa(x)

2. 模型配置(yaml文件)

修改models/yolov5s.yaml,在Backbone或Head中插入注意力模块。例如,在C3模块后添加SE:

yaml

backbone: # [from, number, module, args] [[-1, 1, Conv, [64, 6, 2, 2]], # 0 [-1, 1, Conv, [128, 3, 2]], # 1 [-1, 3, C3, [128]], # 2 [-1, 1, SEBlock, [128]], # 新增SE模块 [-1, 1, Conv, [256, 3, 2]], # 3 [-1, 6, C3, [256]], # 4 [-1, 1, Conv, [512, 3, 2]], # 5 [-1, 9, C3, [512]], # 6 [-1, 1, Conv, [1024, 3, 2]], # 7 [-1, 3, C3, [1024]], # 8 [-1, 1, SPPF, [1024, 5]]] # 9

3. 模型解析(yolo.py)

在models/yolo.py的parse_model函数中注册注意力模块:

python

def parse_model(d, ch): # 注册自定义模块 modules = { 'Conv': Conv, 'C3': C3, 'SEBlock': SEBlock, # 新增SE模块 'CBAM': CBAM # 新增CBAM模块 } # ... 原有解析逻辑 ...

4. 训练与调试

  1. 层号调整:插入模块后,后续层编号需递增。例如,原Detect层引用[17, 20, 23],插入SE后需改为[18, 21, 24]。
  2. 超参数调优:调整注意力模块的缩放因子(如SE的reduction)或卷积核大小(如CBAM的kernel_size)。
  3. 训练验证:使用小批量数据测试模型能否正常加载,观察损失曲线是否收敛。

三、代码调试技巧

  1. 模块注册检查:确保parse_model中注册了所有自定义模块,否则会报错ModuleNotFoundError。
  2. 层号验证:插入模块后,打印模型结构(model.model)确认层号与配置一致。
  3. 梯度检查:若训练损失异常,检查注意力模块的梯度是否为0(可能因Sigmoid饱和导致)。
  4. 可视化工具:使用TensorBoard或Netron可视化模型结构,确认注意力模块位置正确。

四、效果对比

注意力机制插入位置mAP提升参数量变化推理速度变化SEBackbone(C3后)+1.2%+0.3M-5%CBAMHead输出前+1.8%+0.8M-8%无注意力基准模型---

结论:

  • SE模块轻量高效,适合资源受限场景。
  • CBAM模块提升显著,但增加计算开销。
  • 插入位置:Backbone适合全局特征增强,Head适合精细检测。

特别声明:[YOLOv5改进 添加注意力机制(yolov5修改backbone)] 该文观点仅代表作者本人,今日霍州系信息发布平台,霍州网仅提供信息存储空间服务。

猜你喜欢

3个月砸6000万的富婆分手了:这场爱情从一开始就是生意(3个月大赚1147亿)

在这三个月里,她不仅为男友送上了豪车和名表,还频繁带他出现在自己的『直播间』,让这段姐弟恋成了热议的话题。乍一看,这似乎是一场奢华的浪漫,但细心观察便能发现,所有的礼物🎁和资产都登记在她自己的名下——那辆劳斯莱斯的…

3个月砸6000万的富婆分手了:这场爱情从一开始就是生意(3个月大赚1147亿)

没有阳刚之气就别演大侠,《镖人》中『谢霆锋』,给内娱上了一课(没有阳刚之气的男人有什么表现)

对待服装和细节,他也从不马虎,甚至自己提出更换腰带材质的建议,让整个角色的外形更加符合人物的设定,这种细致入微的态度,让他的每一场动作戏都充满了力量感。如今,他所呈现出的侠肝义胆和大侠风范,不仅仅让他在剧中角…

没有阳刚之气就别演大侠,《<strong>镖人</strong>》中『谢霆锋』,给内娱上了一课(没有阳刚之气的男人有什么表现)

REDMI Turbo 5系列正式官宣,2.5K价位,居然能解决电量焦虑(redmiggta5)

你想啊,旗舰级3nm『芯片』、9000mAh超大电池、100W快充、金属中框、玻璃纤维后盖...这一堆东西要是放在友商这里,怎么也得3000往上了吧。 最后说两句2500块钱的机器,能把旗舰性能、超长续航、快充…

REDMI Turbo 5系列正式官宣,2.5K价位,居然能解决电量焦虑(redmiggta5)

易梦玲被曝在冰川上穿吊带裙拍照,作者解释:是陪好友拍婚纱照(易梦玲被曝在冰川上穿吊带裙)

视频里,她站在新疆赛里木湖的冰川区,赤臂出镜,与周遭的茫茫白雪形成刺眼对比,瞬间点燃了网友关于“美丽与温度”的激烈辩论。 事情起因于1月30日网友的爆料,视频中的易梦玲在极寒环境下衣着单薄,让不少看客直呼“看…

易梦玲被曝在冰川上穿吊带裙拍照,作者解释:是陪好友拍婚纱照(易梦玲被曝在冰川上穿吊带裙)

年轻漂亮的继母》:从抗拒到依赖,亲情从不止一种模样(年轻漂亮的记者韩剧)

3.2 需要更多的理解和包容重组家庭中的每一个成员都需要面对各种各样的情感挑战和生活困难,他们的内心世界往往比外界所看到的要复杂得多。 希望更多的影视作品能够关注重组家庭这一社会现象,通过真实的情感展现和生…

《<strong>年轻漂亮的继母</strong>》:从抗拒到依赖,亲情从不止一种模样(年轻漂亮的记者韩剧)