赞
踩
在深度学习目标检测领域,YOLOv5成为了备受关注的模型之一。本文给大家带来的是能够理解全局和局部信息的SE注意力机制。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。
目录
论文地址:Squeeze-and-Excitation Networks点击即可跳转
官方代码:SENet官方代码地址点击即可跳转
对于CNN网络来说,核心计算是卷积算子,通过卷积核从输入特征图学习到新特征图。从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(H和W维度)以及通道间(C维度)的特征融合。
对于卷积操作,很大一部分改进工作是提高感受野,即空间上融合更多特征,或者是提取多尺度空间信息,如Inception网络的多分支结构。对于channel维度的特征融合,卷积操作基本上默认对输入特征图的所有channel进行融合。而MobileNet网络中的组卷积(Group Convolution)和深度可分离卷积(Depthwise Separable Convolution)对channel进行分组也主要是为了使模型更加轻量级,减少计算量。
SENet网络的创新点在于关注channel之间的关系,希望模型可以自动学习到不同channel特征的重要程度。为此,SENet提出了Squeeze-and-Excitation (SE)模块,如下图所示
SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征(SENet提出Squeeze操作,将一个channel上整个空间特征编码为一个全局特征,采用global average pooling来实现),然后对全局特征进行Excitation操作(这里采用sigmoid形式的gating机制),学习各channel间的关系,得到不同channel的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在channel维度上做attention或者gating操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制不重要的channel特征。另外一点是SE模块是通用的,意味着其可以嵌入到现有的网络架构中。
关键步骤一:将下面代码添加到 yolov5/models/common.py中
- import torch
- import torch.nn as nn
- import torch.nn.functional as F
-
-
- class SE(nn.Module):
- '''Squeeze-and-Excitation block.'''
-
- def __init__(self, in_planes, se_planes):
- super(SE, self).__init__()
- self.se1 = nn.Conv2d(in_planes, se_planes, kernel_size=1, bias=True)
- self.se2 = nn.Conv2d(se_planes, in_planes, kernel_size=1, bias=True)
-
- def forward(self, x):
- out = F.adaptive_avg_pool2d(x, (1, 1))
- out = F.relu(self.se1(out))
- out = self.se2(out).sigmoid()
- out = x * out
- return out
SE类是一种用于卷积神经网络中的注意力机制模块,旨在增强网络对输入特征的关注。它通过学习得到每个通道的权重,以自适应的方式调整特征图,从而提升网络性能。
构成部分:
1. Squeeze(压缩)阶段:
通过全局平均池化操作将特征图压缩为一个向量,以捕获每个通道的全局特征信息。
然后通过一个或多个全连接层对压缩后的特征向量进行变换,以获得通道相关的表示。
2. Excitation(激励)阶段:
使用激活函数(通常是ReLU)对变换后的特征进行非线性映射,以增强模型的表达能力。
再通过一个或多个全连接层对特征进行进一步的变换,以生成通道注意力权重。
3. Scale(缩放)阶段:
使用Sigmoid函数将通道注意力权重归一化到0到1之间,以表示每个通道的重要性。
将归一化后的权重乘以原始特征图,以对特征进行加权。
流程:
1. 接收输入张量x,该张量的形状为(batch_size, channels, height, width)。
2. 通过全局平均池化操作将每个通道的特征进行压缩,得到一个大小为(batch_size, channels)的全局特征向量。
3. 将全局特征向量通过一个或多个全连接层进行变换,得到每个通道的权重。
4. 对权重进行非线性变换(通常是ReLU激活函数),以增强模型的表达能力。
5. 再次通过全连接层对特征进行变换,得到每个通道的注意力权重。
6. 使用Sigmoid函数将注意力权重归一化到0到1之间,表示每个通道的重要性。
7. 将归一化后的注意力权重与原始特征图相乘,得到加权后的特征表示。
8. 返回加权后的特征张量。
目的:
SE模块的主要目的是通过自适应地调整通道的注意力权重,使模型能够更有效地捕获输入特征的重要信息,从而提高模型的性能和泛化能力。
SE类的实现包括两个主要部分:Squeeze阶段和Excitation阶段,它们共同作用于输入特征,以产生加权后的特征表示,从而增强了模型的表达能力和性能。
关键步骤二:在 /yolov5/models/ 下新建文件 yolov5_se.yaml文件并将下面代码复制进去
- # YOLOv5 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/873845推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。