YOLOv5中添加SE模块详解——原理+代码

YOLOv5改进系列(一)添加注意力机制SE、CBAM、ECA、CA 在没有降维的通道全局平均池化之后,ECA使用1D卷积来实现跨通道信息交互,而卷积核的大小 k 则通过函数来自适应计算,k 也可以理解为局部跨通道交互的覆盖范围,即有多少邻居参与了一个通道的注意力预测。激活函数形成空间注意力权重[batch_size,1,H,W],和原来的输入[batch_size,channel,H,W]作哈达玛积。最后,将原始特征图的每个通道与对应的权重相乘,从而得到增强后的特征图。在这一阶段,网络从特征图中提取出每个通道的全局信息,得到一个描述每个通道重要性的特征向量。 阅读详情
AI摘要

SENet是一种关注通道关系的深度学习网络结构,通过Squeeze-and-Excitation模块自适应地调整通道特征响应。在YOLOv5中添加SENet,可以通过修改common.py、yolo.py和配置文件实现,以提升模型的特征提取能力。

一、SENet

论文地址:Squeeze-and-Excitation Networks [CVPR2017]
Caffe代码地址:SENet-Caffe
Pytorch代码地址:SENet-Pytorch

1. 设计原理

  论文中提到,在SENet提出之前,大部分工作专注于研究特征图的空间编码质量(可以理解为每个通道的特征图的特征提取质量),即只关注每个通道中特征图的表达能力,而没有关注不同通道的特征图的融合(如果一个特征图的维度为 C × H × W C×H×W C×H×W的话,SENet之前的工作只关注了 H H H和 W W W维度,而没有关注 C C C维度,不同通道的特征图融合还是通过卷积相加的方式完成)。

  SENet关注了通道关系,提出了Squeeze-and-Excitation模块,通过显式地模拟通道之间的相互依赖关系,自适应地重新校准通道的特征响应(普通卷积过程的通道关系本质上是隐式的和局部的(除了最顶层的通道关系,因为最顶层的通道与任务相关,比如分割网络的最顶层通道数为分割类别数,而中间层的通道数通常是经验所得))。

2. SE Block

在这里插入图片描述

图1 SE Block结构图

  SE Block的结构如图1所示,首先通过卷积操作 F t r F_{tr} Ftr​将输入特征图 X ∈ R H ′ × W ′ × C ′ X\in R^{H'\times W'\times C'} X∈RH′×W′×C′映射到特征图 U ∈ R H × W × C U\in R^{H\times W\times C} U∈RH×W×C,在这个过程中,用 V = [ v 1 , v 2 , . . . , v C ] V=[v_{1},v_{2},...,v_{C}] V=[v1​,v2​,...,vC​]表示卷积核的集合,输出可表示为 U = [ u 1 , u 2 , . . . , u C ] U=[u_{1},u_{2},...,u_{C}] U=[u1​,u2​,...,uC​],则:
u c = v c ∗ X = ∑ s = 1 C ′ v c s ∗ x s u_c=v_{c}*X=\sum_{s=1}^{C'}v_{c}^s*x^s uc​=vc​∗X=s=1∑C′​vcs​∗xs

  这里 ∗ * ∗ 表示卷积操作, u c ∈ R H × W u_{c}\in R^{H\times W} uc​∈RH×W, v c = [ v c 1 , v c 2 , . . . , v c C ′ ] v_{c}=[v_{c}^1,v_{c}^2,...,v_{c}^{C'}] vc​=[vc1​,vc2​,...,vcC′​], X = [ x 1 , x 2 , . . . , x C ′ ] X=[x^{1},x^{2},...,x^{C'}] X=[x1,x2,...,xC′], v c s v_{c}^s vcs​是一个二维卷积核,表示 v c v_{c} vc​的单个通道作用于 X X X的相应通道上。

2.1 Squeeze:Global Information Embedding

  为了考虑输出特征图中每个通道的信息,论文通过全局平均池化的方式,将全局空间信息压缩到一个通道描述符 z c z_{c} zc​中:

z c = F s q ( u c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W u c ( i , j ) z_{c}=F_{sq}(u_{c})=\frac{1}{H\times W}\sum_{i=1}^{H}\sum_{j=1}^{W}u_{c}(i,j) zc​=Fsq​(uc​)=H×W1​i=1∑H​j=1∑W​uc​(i,j)

2.2 Excitation:Adaptive Recalibration

  为了完全捕获通道依赖关系,论文选择使用一种简单的带有Sigmoid激活的门控机制:

s = F e x ( z , W ) = σ ( g ( z , W ) ) = σ ( W 2 δ ( W 1 z ) ) s=F_{ex}(z,W)=\sigma (g(z,W))=\sigma (W_{2}\delta (W_{1}z)) s=Fex​(z,W)=σ(g(z,W))=σ(W2​δ(W1​z))

  其中, δ \delta δ为ReLU函数, W 1 ∈ R C r × C W_{1}\in R^{\frac{C}{r}\times C} W1​∈RrC​×C, W 2 ∈ R C × C r W_{2}\in R^{C\times\frac{C}{r}} W2​∈RC×rC​。

  通过s重新缩放U,得到SE Block最后的输出:

x ˉ c = F s c a l e ( u c , s c ) = s c u c \bar{x}_{c}=F_{scale}(u_{c},s_{c})=s_{c}u_{c} xˉc​=Fscale​(uc​,sc​)=sc​uc​

3. SE-Inception and SE-ResNet

  图2为原文设计的SE-Inception模块和SE-ResNet模块,这是一个即插即用模块。为了解决通道之间的依赖关系,作者使用全局平均池化操作来压缩全局空间信息,这就是Sequeeze操作。为了利用在Sequeeze操作中聚合的信息,作者通过FC-ReLU-FC-Sigmoid操作来完全捕获通道依赖性,这就是Excitation操作。

在这里插入图片描述

图2 SE Module
class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)        #全局平均池化,输入BCHW -> 输出 B*C*1*1
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),   #可以看到channel得被reduction整除,否则可能出问题
            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)     #得到B*C*1*1,然后转成B*C,才能送入到FC层中。
        y = self.fc(y).view(b, c, 1, 1)     #得到B*C的向量,C个值就表示C个通道的权重。把B*C变为B*C*1*1是为了与四维的x运算。
        return x * y.expand_as(x)           #先把B*C*1*1变成B*C*H*W大小,其中每个通道上的H*W个值都相等。*表示对应位置相乘。

二、YOLOv5中添加SENet

1.修改common.py

  在models/common.py中添加下列代码

class SElayer(nn.Module):
    def __init__(self, c1, c2, ratio=16):
        super(SElayer, self).__init__()
        #c*1*1
        self.avgpool = nn.AdaptiveAvgPool2d(1)
        self.l1 = nn.Linear(c1, c1 // ratio, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.l2 = nn.Linear(c1 // ratio, c1, bias=False)
        self.sig = nn.Sigmoid()

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avgpool(x).view(b, c)
        y = self.l1(y)
        y = self.relu(y)
        y = self.l2(y)
        y = self.sig(y)
        y = y.view(b, c, 1, 1)
        return x * y.expand_as(x)

2.修改yolo.py

  在models/yolo.py中的parse_model函数中添加SElayer模块

        if m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP,
                 C3, C3TR, ASPP, SElayer]:
            c1, c2 = ch[f], args[0]  
            if c2 != no:  
                c2 = make_divisible(c2 * gw, 8)  
            args = [c1, c2, *args[1:]] 

3.修改yolov5s.yaml

  在Backbone的倒数第二层添加SElayer,修改后的yolov5s.yaml如下所示:

# parameters
nc: 20  # 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, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SElayer, [1024]],
   [-1, 1, SPPF, [512, 512]], # 10
  ]

head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 14

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 18 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 15], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 21 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 11], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 24 (P5/32-large)

   [[18, 21, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)  
  ]

参考文章

SE-ResNet的实现
YOLOv5-6.1添加注意力机制(SE、CBAM、ECA、CA)

YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制 Python、PyTorch、YOLOv5、注意力机制 阅读详情

相关推荐

YOLOV5添加 ECA CA SE CBAM 等八种注意力机制(小白可用)

⭐欢迎大家订阅我的专栏一起学习⭐。

kay_545 9174

YOLOV5引入SE注意力机制以及精度提升问题

YOLOV5引入SE注意力机制以及精度提升问题

qq_43419887的博客 7663

YOLOV5 改进:增加注意力机制模块(SE)

SE模块的介绍:主要包含Squeeze和Excitation两部分主要的思想就是为不同的像素点增加权重,因为人眼在观察物体进行识别的时候,对不同部分侧重点是不同的,所以注意力机制就是为了模拟这一特点Tips : 这里的输入和输出维度是一样的!

Henry的博客 1316

手把手带你YOLOv5/v7 添加注意力机制

手把手带你YOLOv5/v7 添加注意力机制

qwj的博客 3078

优化改进YOLOv5算法之添加SE、CBAM、CA模块(超详细)

本文主要是在YOLOv5算法中加入SE、CBAM和CA注意力机制模块,通过实验验证对比,加入CBAM和CA注意力机制后的效果均有所提升

qq_40716944的博客 1万+

【YOLOv5进阶】——引入注意力机制-以SE为例

首先需要在backbone的最后加上SE模块(相当于多了一层为第10层);其次考虑到backbone里多了一层,且在head里的输入层来源不止上一层(-1)一个,所以输入层来源大于等于第10层的都需要改为往后递推+1层。

weixin_51658186的博客 3525

YOLO源码解读:Yolov5的改进方案——注意力模块

在本项目中,他的作用是提取原始特征维度中的信息,并将其映射到更高的维度,从而增强模型的表达能力和分类精度,但似乎并没有用到所谓的share,作用相当于一般的MLP模块,即特征转换、特征提取。通道域旨在显示的建模出不同通道之间的相关性,通过网络学习的方式来自动获取到每个特征通道的重要程度,最后再为每个通道赋予不同的权重系数,从而来强化重要的特征抑制非重要的特征。3.对压缩后的特征图,进行通道特征学习,实现: 通过FC全连接层操作学习,得到具有通道注意力的特征图,它的维度还是1。该模块关注的是目标的位置信息。

wusuoweiieq的博客 1336

YOLOv5改进系列(一) YOLOv5添加注意力机制SE CBAM ECA CA SimAM S2-MLPv2 NAMAttention Criss-CrossAttention等

注意力机制(Attention Mechanism)源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。为了合理利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部分,然后集中关注它。例如,人们在阅读时,通常只有少量要被读取的词会被关注和处理。综上,注意力机制主要有两个方面:决定需要关注输入的哪部分;分配有限的信息处理资源给重要的部分。

专注于人工智能学习,总结 1723

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

手把手带你添加SE注意力机制

路人贾的博客 1万+

在yolov5的网络结构中添加注意力机制模块

会点就总结

XingshiXu 4万+

YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

注意力机制(Attention Mechanism)是一种在机器学习和自然语言处理领域中广泛应用的重要概念。它的出现解决了模型在处理长序列或大型输入时的困难,使得模型能够更加关注与当前任务相关的信息,从而提高模型的性能和效果。

学Java,找哪吒 4026

YOLOv5-6.1添加注意力机制(SE、CBAM、ECA、CA)

0. 添加方法 主要步骤: (1)在models/common.py中注册注意力模块 (2)在models/yolo.py中的parse_model函数中添加注意力模块 (3)修改配置文件yolov5s.yaml (4)运行yolo.py进行验证 各个注意力机制模块的添加方法类似,各注意力模块的修改参照SE。 完整代码链接: 1. SE (1)在models/common.py中注册SE模块 class SE(nn.Module): def __init__(self, c1, c2, ratio=

weixin_50008473的博客 4万+

改进YOLOv5 | 在 C3 模块中添加【SE】【CBAM】【 ECA 】【CA】注意力机制 | 附详细结构图

在 C3 模块中添加【SE】【CBAM】【 ECA 】【CA】注意力机制 | 附详细结构图

Coding... 1万+

[YOLOv7/YOLOv5系列算法改进NO.1]添加SE注意力机制

前 沿:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是在处理一些复杂背景问题的时候,还是容易出现错漏检的问题。此后的系列文章,将重点对YOLOv5的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。解决问题:加入SE通道注意力机制,可以让网络更加关注待检测目标,提高检测效果添加方法:第一步:确定添加的位置,作为即插即用的注意力模块,可以添加到YOLOv5网络中的任何地方。...

m0_70388905的博客 1万+

YOLOv5改进(一) 本文(7万字) | 添加注意力机制 | SE | CBAM | ECA | CA | SimAM | S2-MLPv2 | NAMAttention | 等 | 共计二十种 |

《人工智能专栏》 Python与Python | 机器学习 | 深度学习 | 目标检测 | YOLOv5及其改进 | YOLOv8及其改进 | 关键知识点 | 各种工具教程获取添加完成的注意力机制代码:注意力机制(Attention Mechanism)源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。为了合理利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部分,然后集中关注它。

专注于人工智能学习,总结 4510

番外篇 | 20+ 种注意力机制及代码 适用于YOLOv5/v7/v8(新增5种v7模板)

番外篇 | 20+ 种注意力机制及代码 适用于YOLOv5/v7

Coding... 2万+

YOLOv5更换激活函数(FReLU+SE机制)

本次我们在卷积层添加SE注意力模块来改进YOLOv5算法,同时用FReLU替换SILU激活函数,并通过添加跳转连接来改进PANet特征融合网络。

恐龙先生的博客 1万+

CST STUDIO SUITE 2023安装

破解工具的Crack文件夹内有一个名为「CST Studio Suite 2022」的文件夹,这也是于CST的安装目录同名的文件夹,直接把它拷贝到CST Studio Suite 2022的同级路径下即可,比如你的CST安装路径为:D:\Program Files\CST Studio Suite 2022,则将Crack目录内的「CST Studio Suite 2022」文件夹复制到 D:\Program Files\ 这个级别的路径下即可。软件百度网盘链接放在文章末尾啦!先不着急启动CST或者激活。

m0_49516223的博客 4124
上一篇: Pytorch语义分割网络的详细训练过程——以NYUv2数据集为例
下一篇: OpenMV入门介绍
晓shuo
晓shuo 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄6年 4万+粉丝 113原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

晓shuo

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值