Yolov7改进--添加注意力机制

本文介绍了如何在YOLOV7模型中添加注意力机制,包括修改配置文件、理解基础概念(如通道数、卷积核大小和步长)以及参考GitHub上的代码实现。详细步骤涉及对C7_1、C7_2层的改造以增强模型性能。

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

改进参考魔鬼导师:YOLOV7改进-添加注意力机制_哔哩哔哩_bilibili

视频教程:YOLOV7改进-添加注意力机制_哔哩哔哩_bilibili

GitHub改进项目地址:其中的cv_attentionGitHub - z1069614715/objectdetection_script: 一些关于目标检测的脚本的改进思路代码,详细请看readme.md

学习内容:

问:

涉及:

一些基本概念:通道数,卷积核大小,卷积步长:

一些基本概念_To-的博客-优快云博客  中进行解释

 根据视频--添加注意力机制的步骤:

1.打开Yolov7/cfg/training/yolov7.yaml 模型配置文件

   yolov7.yaml配置文件中存储这yolov7模型的一百多层卷积结构,通过代码注释和模型结构图搭配理解

# parameters
nc: 1  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple

# anchors
anchors:
  - [12,16, 19,36, 40,28]  # P3/8
  - [36,75, 76,55, 72,146]  # P4/16
  - [142,110, 192,243, 459,401]  # P5/32

# yolov7 backbone
backbone:
  # [from, number, module, args]     分别表示: 输入,重复次数,名称,参数数组
  [[-1, 1, Conv, [32, 3, 1]],  # 0 ##CBS  
  
   [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2 ##CBS      
   [-1, 1, Conv, [64, 3, 1]],  # ##CBS   实例:第一个-1表示以上一层的输出作为本层的输入,-1表示向前退一层,-2表示向前退两层,以此类推
   
   [-1, 1, Conv, [128, 3, 2]],  # 3-P2/4 ##CBS # 实例: 第二个1表示,该层操作一次
   [-1, 1, Conv, [64, 1, 1]],             # 实例: Conv表示该层操作的名称
   [-2, 1, Conv, [64, 1, 1]],   # [64, 1, 1]: 64表示输出特征图的通道数,来控制特征图的深度
   [-1, 1, Conv, [64, 3, 1]],   # [64, 3, 1]: 3表示卷积核大小,以3*3的卷积核对输入图像进行卷积,以提取图像特征
   [-1, 1, Conv, [64, 3, 1]],   # [64, 3, 1]: 1表示卷积步长,步长控制了每次卷积操作后特征图的大小变化
   [-1, 1, Conv, [64, 3, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [[-1, -3, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [256, 1, 1]],  # 11  ##C7_1
         
   [-1, 1, MP, []],
   [-1, 1, Conv, [128, 1, 1]],
   [-3, 1, Conv, [128, 1, 1]],
   [-1, 1, Conv, [128, 3, 2]],
   [[-1, -3], 1, Concat, [1]],  # 16-P3/8  ##MP-C3
   [-1, 1, Conv, [128, 1, 1]],
   [-2, 1, Conv, [128, 1, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [[-1, -3, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [512, 1, 1]],  # 24  ##C7_1 待插入点
         
   [-1, 1, MP, []],
   [-1, 1, Conv, [256, 1, 1]],
   [-3, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [256, 3, 2]],
   [[-1, -3], 1, Concat, [1]],  # 29-P4/16  ##MP-C3
   [-1, 1, Conv, [256, 1, 1]],
   [-2, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [[-1, -3, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [1024, 1, 1]],  # 37  ##C7_1  待插入点
         
   [-1, 1, MP, []],
   [-1, 1, Conv, [512, 1, 1]],
   [-3, 1, Conv, [512, 1, 1]],
   [-1, 1, Conv, [512, 3, 2]],
   [[-1, -3], 1, Concat, [1]],  # 42-P5/32  ##MP-C3
   [-1, 1, Conv, [256, 1, 1]],
   [-2, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [[-1, -3, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [1024, 1, 1]],  # 50  ##C7_1
  ]

# yolov7 head
head:
  [[-1, 1, SPPCSPC, [512]], # 51  ##SPPCSPC  待插入点
  
   [-1, 1, Conv, [256, 1, 1]],   ##CBS
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],  ##上采样
   [37, 1, Conv, [256, 1, 1]], # route backbone P4  ##CBS
   [[-1, -2], 1, Concat, [1]],
   
   [-1, 1, Conv, [256, 1, 1]],
   [-2, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [256, 1, 1]], # 63  ##C7_2
   
   [-1, 1, Conv, [128, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [24, 1, Conv, [128, 1, 1]], # route backbone P3
   [[-1, -2], 1, Concat, [1]],
   
   [-1, 1, Conv, [128, 1, 1]],
   [-2, 1, Conv, [128, 1, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [-1, 1, Conv, [64, 3, 1]],
   [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [128, 1, 1]], # 75  ##C7_2
      
   [-1, 1, MP, []],
   [-1, 1, Conv, [128, 1, 1]],
   [-3, 1, Conv, [128, 1, 1]],
   [-1, 1, Conv, [128, 3, 2]],
   [[-1, -3, 63], 1, Concat, [1]],
   
   [-1, 1, Conv, [256, 1, 1]],
   [-2, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [256, 1, 1]], # 88   ##C7_2
      
   [-1, 1, MP, []],
   [-1, 1, Conv, [256, 1, 1]],
   [-3, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [256, 3, 2]],
   [[-1, -3, 51], 1, Concat, [1]],
   
   [-1, 1, Conv, [512, 1, 1]],
   [-2, 1, Conv, [512, 1, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [512, 1, 1]], # 101  ##C7_2
   
   [75, 1, RepConv, [256, 3, 1]],
   [88, 1, RepConv, [512, 3, 1]],
   [101, 1, RepConv, [1024, 3, 1]],

   [[102,103,104], 1, IDetect, [nc, anchors]],   # Detect(P3, P4, P5)
  ]

相应的yolov7网络模型结构图:

在yolov7中的三个位置,如图所示:C7_1,C7_1,SPPCSPC后的三个特征层输出的位置添加注意力机制 = 等于对这三个模块用带有注意力机制的模块进行替换

在魔鬼老师的GitHub上找到要添加的注意力机制模块代码:GitHub - z1069614715/objectdetection_script: 一些关于目标检测的脚本的改进思路代码,详细请看readme.md

 

### 改进 YOLOv8n 模型中的注意力机制 #### 1. 现有注意力机制概述 目前主流的注意力机制包括但不限于 SE (Squeeze-and-Excitation)[^3]、CBAM (Convolutional Block Attention Module)[^4] 和 CA (Coordinate Attention)[^5]。这些方法通过调整通道权重或空间分布来增强模型对重要特征的关注能力。 对于 YOLOv8n 这样轻量化的模型,选择合适的注意力机制至关重要。CGAttention 是一种有效的改进方式[^2],它能够捕捉多尺度特征并提高模型在复杂场景下的表现。 #### 2. CGAttention 的实现原理 CGAttention(级联群体注意力机制)主要分为两个部分:通道注意力和空间注意力。其核心思想在于通过对不同尺度的信息进行加权融合,从而提升网络的感受野和表达能力。以下是其实现的关键步骤: - **通道注意力模块**:计算全局平均池化和最大池化后的特征图,并通过全连接层生成通道权重。 - **空间注意力模块**:利用卷积操作捕获像素间的依赖关系,进一步强化局部区域的重要性。 这种设计使得 CGAttention 能够更好地适应目标检测任务中多样化的物体尺寸需求。 #### 3. 实现代码示例 以下是一个基于 PyTorch 的简化版 CGAttention 实现代码: ```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 CGAttention(nn.Module): def __init__(self, channel_in, reduction_ratio=16, kernel_size=7): super(CGAttention, self).__init__() self.channel_attention = ChannelAttention(channel_in, reduction_ratio) self.spatial_attention = SpatialAttention(kernel_size) def forward(self, x): ca_feature = self.channel_attention(x) * x sa_feature = self.spatial_attention(ca_feature) * ca_feature return sa_feature ``` 此代码定义了一个完整的 CGAttention 结构,可直接集成到 YOLOv8n 中替换默认的注意力组件。 #### 4. 替代方案探讨 除了 CGAttention 外,还可以尝试其他高效注意力机制作为替代选项: - **ECA (Efficient Channel Attention)**[^6]:相比 SE 更简洁高效,在保持性能的同时减少参数数量。 - **BoTNet (Bottleneck Transformers)**[^7]:结合 Transformer 思想重新设计 CNN 架构,适用于高分辨率输入的任务。 每种方法都有各自的优势与局限性,需根据具体应用场景灵活选用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值