重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。
一、参考资料
通道注意力,空间注意力,像素注意力
通道注意力机制和空间注意力机制
视觉 注意力机制——通道注意力、空间注意力、自注意力
二、通道注意力与空间注意力机制
1. 通道注意力机制(CAM)
通道注意力机制(Channel Attention Mechanism, CAM),通过特征内部之间的关系来通道注意力机制。特征图的每个通道都被视作一个特征检测器,所以通道特征聚焦的是图像中有用的信息是"什么"(what)。
1.1 通道注意力的结构
通道注意力模块的结构,如下图所示:
图片来源于:[4]
1.2 通道注意力流程
通道注意力的思路流程是:
- 首先,对一个尺寸为 H×W×C的输入特征图F进行空间维度的全局最大池化和全局平均池化,得到两个 1×1×C 的特征图;(在空间维度进行池化,压缩空间尺寸,便于后面学习通道的特征)
- 然后,将全局最大池化和全局平均池化的结果,分别送入一个共享的多层感知机(MLP)中学习,得到两个 1×1×C 的特征图。MLP的第一层神经元个数为 C/r,激活函数为 Relu,第二层神经元个数为 C;(基于MLP学习通道维度的特征,和各个通道的重要性)
- 最后,将MLP输出的结果进行Add操作,接着经过Sigmoid激活函数的映射处理,最终得到通道注意力权重矩阵 M c M_c Mc;
1.3 通道注意力的计算公式
空间注意力权重矩阵
M
c
M_c
Mc,可以表示为:
M
c
∈
R
C
×
1
×
1
M_{c}\in R^{C\times1\times1}
Mc∈RC×1×1
为了降低计算参数,在MLP中采用一个降维系数r,
M
c
∈
R
C
/
r
×
1
×
1
M_{c}\in R^{C/r\times1\times1}
Mc∈RC/r×1×1。
综上,通道注意力计算公式如下:
M
c
(
F
)
=
σ
(
M
L
P
(
A
v
g
P
o
o
l
(
F
)
)
+
M
L
P
(
M
a
x
P
o
o
l
(
F
)
)
)
=
σ
(
W
1
(
W
0
(
F
a
v
g
c
)
)
+
W
1
(
W
0
(
F
m
a
x
c
)
)
)
\begin{aligned} M_{c}(F)& =\sigma(MLP(AvgPool(F))+MLP(MaxPool(F))) \\ & =\sigma(W_{1}(W_{0}(F_{avg}^{c}))+W_{1}(W_{0}(F_{max}^{c}))) \end{aligned}
Mc(F)=σ(MLP(AvgPool(F))+MLP(MaxPool(F)))=σ(W1(W0(Favgc))+W1(W0(Fmaxc)))
上式中,
F
a
v
g
c
F_{avg}^{c}
Favgc 和
F
m
a
x
c
F_{max}^{c}
Fmaxc 分别表示全局平均池化特征和最大池化特征。
2. 空间注意力(SAM)
通过对特征图空间内部的关系来产生空间注意力特征图。不同于通道注意力,空间注意力(Spatial Attention Mechanism, SAM)聚焦于特征图上的有效信息在"哪里"(where)。
2.1 空间注意力的结构
图片来源于:[4]
2.2 空间注意力流程
空间注意力的思路流程是:
- 首先,对一个尺寸为 H×W×C的输入特征图F进行通道维度的全局最大池化和全局平均池化,得到两个 H×W×1 的特征图;(在通道维度进行池化,压缩通道大小,便于后面学习空间的特征)
- 然后,将全局最大池化和全局平均池化的结果,按照通道拼接(concat),得到特征图尺寸为HxWx2,
- 最后,对拼接的结果进行7x7的卷积操作,得到特征图尺寸为 HxWx1,接着通过Sigmoid激活函数 ,得到空间注意力权重矩阵 M s M_s Ms;
2.3 空间注意力的计算公式
空间注意力权重矩阵
M
s
M_s
Ms,可以表示为:
M
s
(
F
)
∈
R
H
,
W
M_{s}(F)\in R^{H,W}
Ms(F)∈RH,W
同上,在通道维度使用两种池化方法产生2D特征图:
F
a
v
g
s
∈
R
1
×
H
×
W
F
m
a
x
s
∈
R
1
×
H
×
W
F_{avg}^s\in R^{1\times H\times W}\\F_{max}^s\in R^{1\times H\times W}
Favgs∈R1×H×WFmaxs∈R1×H×W
综上,空间注意力的计算公式如下:
M
s
(
F
)
=
σ
(
f
7
×
7
(
[
A
v
g
P
o
o
l
(
F
)
;
M
a
x
P
o
o
l
(
F
)
]
)
)
=
σ
(
f
7
×
7
[
F
a
v
g
s
;
F
m
a
x
s
]
)
\begin{aligned} M_{s}(F)& =\sigma(f^{7\times7}([AvgPool(F);MaxPool(F)])) \\ &=\sigma(f^{7\times7}[F_{avg}^{s};F_{max}^{s}]) \end{aligned}
Ms(F)=σ(f7×7([AvgPool(F);MaxPool(F)]))=σ(f7×7[Favgs;Fmaxs])
3. 混合注意力机制
在混合注意力机制中,通道注意力和空间注意力可以通过串联、或者并联的方式进行组合。关于混合注意力机制的介绍,请参考下文的CBAM网络模型。
三、SENet:通道注意力
原始论文:[1]
注意力机制——SENet原理详解及源码解析
深入理解SENet:自适应特征提取的注意力机制
【SENet 解读】通道注意力:Squeeze-and-Excitation Networks
1. SENet原理
压缩和激励网络(Squeeze-and-Excitation Networks,SENet)是通道注意力机制的代表模型。
SENet 分为压缩和激励两个部分,压缩部分先对输入特征图的空间维度(全局空间信息)进行压缩,激励部分对输入特征图的通道维度进行学习,得到各个通道的权重。最后输入特征图与权重相乘,得到最终的输出特征图。SE block
的结构如下图所示:
给定输入特征 X ∈ R H ′ × W ′ × C ′ X\in\mathbb{R}^{H^{\prime}\times W^{\prime}\times C^{\prime}} X∈RH′×W′×C′,经过一系列卷积操作后,得到特征图 U ∈ R H × W × C U\in\mathbb{R}^{H\times W\times C} U∈RH×W×C 。其实从特征图 U U U 开始向后才是真正的SENet结构,这一步变换只是一些特征图维度变化。得到 U U U后,先对 U U U 进行全局平均池化操作,也就是将 U U U 的维度由 H × W × C H \times W \times C H×W×C 变成 1 × 1 × C 1 \times 1 \times C 1×1×C,此步骤对应上图中的 F s q ( ⋅ ) \mathbf{F}_{sq}\left(\cdot\right) Fsq(⋅)。然后执行步骤 F e x ( ⋅ , W ) \mathbf{F}_{ex}\left(\cdot,\mathbf{W}\right) Fex(⋅,W),此步骤包含两个全连接层和两个激活函数,该过程如下图所示:
从上图可以看出,第一个FC层后使用Relu激活函数,输出特征图尺寸为 1 × 1 × C ′ ′ 1\times1\times\mathbb{C}^{\prime\prime} 1×1×C′′,通常情况下 C ′ ′ \mathbb{C}^{\prime\prime} C′′ 设置为 C C C 的 1 4 \frac {1}{4} 41。第二个FC层后使用Sigmoid激活函数,将每层数值归一化到(0, 1)范围内,以此表示每个通道的权重,第二个FC层的输出特征图尺寸为 1 × 1 × C 1 \times 1 \times C 1×1×C。最后,将 U U U 和 1 × 1 × C 1 \times 1 \times C 1×1×C 相乘,得到最终的输出特征图 X ~ ∈ R H × W × C \tilde{\mathbf{X}}\in\mathbb{R}^{H\times W\times C} X~∈RH×W×C。
2. 通俗理解 SE block
首先,下图左上角表示两个通道的特征图,通过全局平均池化,得到左下角的特征图;然后经过两次FC层和激活函数后,得到右下角的特征图。最后,用0.5、0.6分别与原始特征图相乘,得到最终右上角的特征图。可以发现,SENet的输入特征图和输出特征图的尺寸不变,但其值发生变化。
3. (PyTorch)代码实现
import torch.nn as nn
import torch.nn.functional as F
import math
def _make_divisible(v, divisor, min_value=None):
"""
This function is taken from the original tf repo.
It ensures that all layers have a channel number that is divisible by 8
It can be seen here:
/tensorflow/models/blob/master/research/slim/nets/mobilenet/
"""
if min_value is None:
min_value = divisor
new_v = max(min_value, int(v + divisor / 2) // divisor * divisor)
# Make sure that round down does not go down by more than 10%.
if new_v < 0.9 * v:
new_v += divisor
return new_v
def hard_sigmoid(x, inplace: bool = False):
if inplace:
return x.add_(3.).clamp_(0., 6.).div_(6.)
else:
return F.relu6(x + 3.) / 6.
class SqueezeExcite(nn.Module):
def __init__(self, in_chs, se_ratio=0.25, reduced_base_chs=None,
act_layer=nn.ReLU, gate_fn=hard_sigmoid, divisor=4, **_):
super(SqueezeExcite, self).__init__()
self.gate_fn = gate_fn
reduced_chs = _make_divisible((reduced_base_chs or in_chs) * se_ratio, divisor)
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.conv_reduce = nn.Conv2d(in_chs, reduced_chs, 1, bias=True)
self.act1 = act_layer(inplace=True)
self.conv_expand = nn.Conv2d(reduced_chs, in_chs, 1, bias=True)
def forward(self, x):
x_se = self.avg_pool(x)
x_se = self.conv_reduce(x_se)
x_se = self.act1(x_se)
x_se = self.conv_expand(x_se)
x = x * self.gate_fn(x_se)
return x
4. (TensorFlow)代码实现
ghostnetv2_torch.py
class SqueezeExcite(nn.Module):
def __init__(self, in_chs, se_ratio=0.25, reduced_base_chs=None,
act_layer=nn.ReLU, gate_fn=hard_sigmoid, divisor=4, **_):
super(SqueezeExcite, self).__init__()
self.gate_fn = gate_fn
reduced_chs = _make_divisible((reduced_base_chs or in_chs) * se_ratio, divisor)
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.conv_reduce = nn.Conv2d(in_chs, reduced_chs, 1, bias=True)
self.act1 = act_layer(inplace=True)
self.conv_expand = nn.Conv2d(reduced_chs, in_chs, 1, bias=True)
def forward(self, x):
x_se = self.avg_pool(x)
x_se = self.conv_reduce(x_se)
x_se = self.act1(x_se)
x_se = self.conv_expand(x_se)
x = x * self.gate_fn(x_se)
return x
四、STN:空间注意力
原始论文:[2]
空间变形网络——STN
详细解读Spatial Transformer Networks(STN)一篇文章让你完全理解STN了
通俗易懂的Spatial Transformer Networks(STN)(一)
通俗易懂的Spatial Transformer Networks(STN)(二)
从仿射变化到STN网络
1. STN网络简介
空间变换神经网络 (Spatial Transformer Networks,STN)是空间注意力机制的代表模型,STN 能够对各种形变数据在空间中进行转换并自动捕获重要区域特征。它能够保证图像在经过裁剪、平移或者旋转等操作后,依然可以获得和操作前的原始图像相同的结果。
举个例子,在MNIST 数字分类的中应用STN,该分类过程一共包含 4 个步骤:
- MNIST中的数字,是经过随机平移、缩放和旋转处理;把它们输入到STN网络中;
- 通过STN网络,预测前面输入数字的变换(是平移了?还是缩放了?或是旋转了?)
- STN网络预测出“变换前的数字”,即没经过变换的数字是怎样的
- 最终进行分类预测
上图中,a是输入图片,b 是 STN 中的 localisation 网络检测到的物体区域,c是 STN 对检测到的区域进行线性变换后输出,d 是有 STN 的分类网络的最终输出。
2. STN网络结构
STN更准确地说应该是 STL(spatial transformer layer),它就是网络中的一层,并且可以在任何两层之间添加一个或者多个。如下图所示,STL由三部分组成,分为是局部网络(localisation net)、网格生成器(grid generator, 参数化网络采样))和差分图像采样。
上图中,输入的特征图U被局部网络处理得到参数 θ \theta θ,然后经过网格生成器得到采样器,映射到原图U上,从而得到输出V。
2.1 局部网络
局部网络 用于预测输入数字的变换(是平移了?还是缩放了?或是旋转了?)
2.2 网格生成器
网格生成器获得输出特征图坐标点在输入特征图中坐标点的对应位置。
五、CBAM:混合注意力
BAM:[3]
CBAM:[4]
github代码:attention-module
注意力机制BAM和CBAM详细解析(附代码)
CBAM:通道注意力和空间注意力的集成者
CBAM网络简介
卷积注意力模块(Convolutional Block Attention Module,CBAM)是混合注意力机制的代表模型,它包括通道注意力模块和空间注意力模块。
CBAM的模型结构如下,它对输入的特征图,首先进行通道注意力模块处理;得到的结果,再经过空间注意力模块处理,最后得到调整后特征。
六、参考文献
[1] Hu J, Shen L, Sun G. Squeeze-and-excitation networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 7132-7141.
[2] Jaderberg M, Simonyan K, Zisserman A. Spatial transformer networks[J]. Advances in neural information processing systems, 2015, 28.
[3] Park J, Woo S, Lee J Y, et al. Bam: Bottleneck attention module[J]. arxiv preprint arxiv:1807.06514, 2018.
[4] Woo S, Park J, Lee J Y, et al. Cbam: Convolutional block attention module[C]//Proceedings of the European conference on computer vision (ECCV). 2018: 3-19.