YOLOv5改进系列(1)——添加CBAM注意力机制

一、如何理解注意力机制

假设你正在阅读一本书,同时有人在你旁边说话。当你听到某些关键字时,比如“你的名字”或者“你感兴趣的话题”,你会自动把注意力从书上转移到他们的谈话上,尽管你并没有完全忽略书本的内容。这就是注意力机制的核心思想:动态地根据重要性来分配注意力,而不是对输入的信息一视同仁地处理。

在计算机视觉或自然语言处理(NLP)中,注意力机制让模型能够灵活地聚焦于输入数据的某些重要部分。例如,在图像分类任务中,模型不需要对整张图像的每一个像素都一视同仁,而是可以专注于那些关键区域,如目标物体的边缘或特征。在句子处理时,模型可以根据句子的上下文,专注于那些对语义理解最为关键的单词或短语,而忽略不太重要的部分。

注意力机制就像在复杂信息处理中自动筛选和重点关注的过程,帮助模型更智能地选择和处理最有用的信息。


作用

  1. 提升准确性:注意力机制聚焦关键信息,提升预测精度。
  2. 增强可解释性:能更清晰展示模型决策过程。
  3. 处理变长数据:适用于文本、语音等不定长序列数据。

不足

  1. 计算开销大:需要计算每个位置的权重,耗时长。
  2. 易过拟合:复杂权重可能导致模型在训练集上表现过好,泛化能力弱。
  3. 数据需求高:需要大量数据训练,否则效果不佳。

二、CBAM注意力机制

论文名称:《CBAM: Convolutional Block Attention Module》

论文地址:https://arxiv.org/pdf/1807.06521

论文代码:GitHub - Jongchan/attention-module: Official PyTorch code for "BAM: Bottleneck Attention Module (BMVC2018)" and "CBAM: Convolutional Block Attention Module (ECCV2018)"

CBAM从通道channel和空间spatial两个作用域出发,实现从通道到空间的顺序注意力结构。空间注意力可使神经网络更加关注在图像分类中决定性作用的像素区域而忽略无关紧要的区域,通道注意力则用于处理特征图通道的分配关系,同时对两个维度进行注意力分配加强了注意力机制对模型性能的提升效果。

2.1 CAM通道注意力模块

shared MLP

  1. 输入特征图(H×W×C)

    • 先将输入的特征图(H×W×C)分别经过基于宽度和高度的最大池化和平均池化,对特征图按两个维度压缩,得到两个1×1×C的特征图。
  2. 池化后的特征图进行处理

    • 将最大池化和平均池化的结果利用共享的全连接层(Shared MLP)进行处理:
      • 先通过一
### 如何在 YOLOv5s 模型中添加 CBAM 注意力机制 要在 YOLOv5s 中集成 CBAM (Convolutional Block Attention Module),可以通过修改模型配置文件以及实现 CBAM 的代码来完成。以下是具体方法: #### 修改模型配置文件 YOLOv5 使用 YAML 文件定义模型结构。为了将 CBAM 集成到 YOLOv5s,可以在 `models/yolov5s.yaml` 或自定义的 `.yaml` 文件中调整网络架构。 假设我们希望在 backbone 和 head 层都加入 CBAM,则可以按照以下方式修改配置文件[^1]: ```yaml # yolov5s_cbam.yaml nc: 80 # 类别数 depth_multiple: 0.33 # 深度倍率 width_multiple: 0.25 # 宽度倍率 # Backbone with CBAM backbone: # [from, number, module, args] [[-1, 1, Focus, [64, 3]], # 0-PADDED/STRIDED CONVOLUTION [-1, 1, Conv, [64, 3, 1]], # 1-BASIC CONVOLUTION LAYER [-1, 1, C3, [64, 1]], # 2-CSP BOTTLENECK WITH 3 CONVS [-1, 1, CBAM, []], # 添加CBAM模块 [-1, 3, BottleneckCSP, [128, True]], # CSPBLOCKS WITH DOWN SAMPLING ... ] # Head with CBAM head: [[-1, 1, SPP, [768, [5, 9, 13]]], [-1, 1, CBAM, []], # 在Head部分也添加CBAM [-1, 3, BottleneckCSP, [768]], ... ] ``` 以上示例展示了如何通过简单的结构调整在网络的不同阶段引入 CBAM 模块。 --- #### 实现 CBAM 模块 接下来需要编写 CBAM 的 PyTorch 实现并将其嵌入到 YOLOv5 的代码库中。以下是完整的 CBAM 模块代码: ```python import torch import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3, 7), 'kernel size must be 3 or 7' padding = 3 if kernel_size == 7 else 1 self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avg_out, max_out], dim=1) x = self.conv1(x) return self.sigmoid(x) class CBAM(nn.Module): def __init__(self, planes, ratio=16, kernel_size=7): super(CBAM, self).__init__() self.channel_attention = ChannelAttention(planes, ratio) self.spatial_attention = SpatialAttention(kernel_size) def forward(self, x): x = x * self.channel_attention(x) # Apply channel attention first. x = x * self.spatial_attention(x) # Then apply spatial attention. return x ``` 此代码实现了 CBAM 的两个子模块——通道注意力和空间注意力,并组合为最终的 CBAM 模块。 --- #### 将 CBAM 嵌入到 YOLOv5 要让 YOLOv5 支持 CBAM,需将上述 CBAM 模块保存至 `models/common.py` 并注册到 YOLOv5 的构建函数中。例如,在 `common.py` 中新增如下内容: ```python def CBAM(c1, c2=None, *, ratio=16, k=7): """CBAM implementation.""" c2 = c2 if c2 is not None else c1 return CBAMModule(c2, ratio=ratio, kernel_size=k) ``` 随后更新 `detect.py`, `train.py` 等脚本中的导入路径以支持新模块。 --- #### 训练与验证 最后一步是在训练过程中加载新的配置文件 `yolov5s_cbam.yaml` 运行实验。命令如下所示: ```bash python train.py --img 640 --batch 16 --epochs 50 --data coco128.yaml --cfg models/yolov5s_cbam.yaml --weights yolov5s.pt ``` 这会基于预训练权重启动带有 CBAMYOLOv5s 模型训练过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值