【YOLOv8改进 - 注意力机制】EffectiveSE : 改进的通道注意力模块,减少计算复杂性和信息丢失

YOLOv8目标检测创新改进与实战案例专栏

专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLOv8基础解析+创新改进+实战案例

介绍

image-20240723141955037

摘要

我们提出了一种简单而高效的无锚实例分割方法,称为CenterMask,它在无锚单阶段目标检测器(FCOS [33])中添加了一个新颖的空间注意力引导掩码(SAG-Mask)分支,类似于Mask R-CNN [9]。在FCOS目标检测器中插入SAG-Mask分支,该分支使用空间注意力图在每个检测框上预测分割掩码,从而有助于关注有用的像素并抑制噪声。我们还提出了改进的骨干网络VoVNetV2,并采用了两种有效策略:(1)残差连接以缓解较大VoVNet [19]的优化问题;(2)有效的挤压-激励(eSE)处理原始SE的通道信息丢失问题。结合SAG-Mask和VoVNetV2,我们设计了针对大模型和小模型的CenterMask和CenterMask-Lite。使用相同的ResNet-101-FPN骨干网络,CenterMask达到了38.3%的AP,超过了所有以前的最先进方法,同时速度更快。CenterMask-Lite在Titan Xp上以超过35fps的速度也大幅超越了最先进的方法。我们希望CenterMask和VoVNetV2可以分别作为实时实例分割和各种视觉任务的骨干网络的坚实基准。代码可在https://github.com/youngwanLEE/CenterMask获取。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

EffectiveSE (Effective Squeeze-Excitation) 是一种改进的通道注意力模块,其目的是在保持模型性能的同时减少计算复杂性和信息丢失。它基于原始的 Squeeze-Excitation (SE) 模块,但通过一些关键的改进来提高效率。以下是对 EffectiveSE 及其技术原理的详细介绍:

背景

Squeeze-Excitation 网络(SE-Net)是一种通道注意力机制,通过建模特征图通道之间的相互依赖性来增强模型的表现。SE 模块的主要步骤包括:

  1. Squeeze 操作:对每个通道进行全局平均池化,生成通道描述符。
  2. Excitation 操作:通过两个全连接层和 ReLU 激活函数来重新计算每个通道的权重。
  3. Scale 操作:将计算得到的权重应用到原始特征图的每个通道上。

虽然 SE-Net 提高了网络性能,但其两个全连接层的设计带来了额外的计算开销,并且在通道维度上进行了压缩和扩展,可能导致信息丢失。

EffectiveSE 的技术原理

EffectiveSE (eSE) 模块通过简化 SE 模块的结构来提高效率,同时避免信息丢失。具体改进包括:

  1. 去除维度压缩:原始 SE 模块使用两个全连接层来压缩和扩展通道维度,这可能导致信息丢失。eSE 模块使用单个全连接层,保持通道维度不变,从而避免了这种信息丢失。
  2. 更高效的计算:通过简化网络结构,减少计算量,提升模型的整体效率。

具体实现

eSE 的具体实现步骤如下:

  1. 全局平均池化 (Global Average Pooling):对输入特征图 $ X$ 进行全局平均池化,生成一个通道描述符 F g a p ( X ) F_{gap}(X) Fgap(X)
  2. 全连接层 (Fully Connected Layer):通过一个全连接层 W C W_C WC 对通道描述符进行线性变换,并应用 sigmoid 激活函数,生成通道注意力权重 A e S E A_{eSE} AeSE
    A e S E ( X ) = σ ( W C ( F g a p ( X ) ) ) A_{eSE}(X) = \sigma(W_C(F_{gap}(X))) AeSE(X)=σ(WC(Fgap(X)))
  3. 通道重标定 (Channel Recalibration):将通道注意力权重 $ A_{eSE}$ 应用于输入特征图 $ X的每个通道上,生成加权后的特征图 X r e f i n e X_{refine} Xrefine
    X r e f i n e = A e S E ( X ) ⊗ X X_{refine} = A_{eSE}(X) \otimes X Xrefine=AeSE(X)X
    其中, ⊗ \otimes 表示元素级别的乘法。

优势

  1. 减少信息丢失:通过保持通道维度不变,避免了由于维度压缩带来的信息丢失。
  2. 计算效率高:简化了网络结构,减少了计算量,提高了模型的整体效率。
  3. 性能提升:在保持或提高模型准确率的同时,显著减少了计算开销。

实验结果

实验表明,应用 eSE 模块的网络(如 VoVNetV2)在各种视觉任务中均表现出色。例如,使用 eSE 模块的 VoVNetV2 相较于原始的 SE 模块和其他骨干网络在速度和准确率上都表现更好。

总体而言,EffectiveSE 通过简化结构和避免信息丢失,提供了一种高效的通道注意力机制,显著提升了模型的性能和计算效率。

核心代码

import torch
from torch import nn as nn
from timm.models.layers.create_act import create_act_layer

class EffectiveSEModule(nn.Module):
    def __init__(self, channels, add_maxpool=False, gate_layer='hard_sigmoid'):
        super(EffectiveSEModule, self).__init__()
        self.add_maxpool = add_maxpool
        self.fc = nn.Conv2d(channels, channels, kernel_size=1, padding=0)
        self.gate = create_act_layer(gate_layer)

    def forward(self, x):
        x_se = x.mean((2, 3), keepdim=True)
        if self.add_maxpool:
            # experimental codepath, may remove or change
            x_se = 0.5 * x_se + 0.5 * x.amax((2, 3), keepdim=True)
        x_se = self.fc(x_se)
        return x * self.gate(x_se)

if __name__ == '__main__':
    input=torch.randn(50,512,7,7)
    Ese = EffectiveSEModule(512)
    output=Ese(input)
    print(output.shape)

下载YoloV8代码

直接下载

GitHub地址

image-20240116225427653

Git Clone

git clone https://github.com/ultralytics/ultralytics

安装环境

进入代码根目录并安装依赖。

image-20240116230741813

image-20240116230741813

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

在最新版本中,官方已经废弃了requirements.txt文件,转而将所有必要的代码和依赖整合进了ultralytics包中。因此,用户只需安装这个单一的ultralytics库,就能获得所需的全部功能和环境依赖。

pip install ultralytics

引入代码

在根目录下的ultralytics/nn/目录,新建一个 attention目录,然后新建一个以 EffectiveSE为文件名的py文件, 把代码拷贝进去。

代码参考:https://blog.csdn.net/DM_zx/article/details/132321429

import torch
import torch.nn as nn
from timm.layers.create_act import create_act_layer

class EffectiveSE(nn.Module):
    def __init__(self, channels, add_maxpool=False, gate_layer="hard_sigmoid"):
        super(EffectiveSE, self).__init__()
        self.add_maxpool = add_maxpool
        self.fc = nn.Conv2d(channels, channels, kernel_size=1, padding=0)
        self.gate = create_act_layer(gate_layer)

    def forward(self, x):
        x_se = x.mean((2, 3), keepdim=True)
        if self.add_maxpool:
            # experimental codepath, may remove or change
            x_se = 0.5 * x_se + 0.5 * x.amax((2, 3), keepdim=True)
        x_se = self.fc(x_se)
        return x * self.gate(x_se)

注册

ultralytics/nn/tasks.py中进行如下操作:

步骤1:

from ultralytics.nn.attention.EffectiveSE import EffectiveSE

步骤2

修改def parse_model(d, ch, verbose=True):

        elif m is EffectiveSE:
            c1 = ch[f]
            args = [c1, *args[0:]]

image-20240723143843226

配置yolov8_EffectiveSE.yaml

ultralytics/cfg/models/v8/yolov8_EffectiveSE.yaml


# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]
  s: [0.33, 0.50, 1024]
  m: [0.67, 0.75, 768]
  l: [1.00, 1.00, 512]
  x: [1.00, 1.25, 512]

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 12

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 15 (P3/8-small)
  - [-1, 1, EffectiveSE, []] #16

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 19 (P4/16-medium)
  - [-1, 1, EffectiveSE, []] #20

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2f, [1024]] # 23 (P5/32-large)
  - [-1, 1, EffectiveSE, []] #24

  - [[16, 20, 24], 1, Detect, [nc]] # Detect(P3, P4, P5)

实验

脚本

import os
from ultralytics import YOLO
 
yaml = 'ultralytics/cfg/models/v8/yolov8_EffectiveSE.yaml'

 
model = YOLO(yaml) 
 
model.info()
if __name__ == "__main__":
   
    results = model.train(data='coco128.yaml',
                          name='yolov8_EffectiveSE',
                          epochs=10, 
                          workers=8, 
                          batch=1)


结果

image-20240723143818074


在这里插入图片描述

EffectiveSE是一种用于图像分类的卷积神经网络结构,它是SENet(Squeeze-and-Excitation Networks)的改进版本。它借鉴了SENet的思想,通过学习一种“通道注意力”,来自适应地调整每个通道的权重,以提高网络的性能。在SENet的基础上,EffectiveSE将SE模块应用于ResNet和ResNeXt等经典网络结构中,并使用了一种新的损失函数来训练网络。实验证明,EffectiveSE相比于SENet和其他经典网络结构,具有更高的分类精度和更快的收敛速度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Yolov8改进---注意力机制:ShuffleAttention、ECA、EffectiveSE、SE](https://blog.csdn.net/m0_63774211/article/details/130560700)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [【注意力】ESE:Effective Squeeze-and-Excitation Block](https://blog.csdn.net/qq_22764813/article/details/125640920)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YOLO大师

你的打赏,我的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值