Attention Mechanisms in Computer Vision:A Survey论文
文章将近几年的注意力机制分为:通道注意力、空间注意力、时间注意力和branch注意力,以及两个组合注意力机制:空间通道注意力机制和时间空间注意力机制。
通道注意力机制讲解
SENet (squeeze and excitation):主要分为两部分:squeeze和excitation模块。前者使用全局平均池化用来压缩通道,将h×w×c特征图压缩为1×1×c,再经过非线性激活和全连接变为对应于每个通道的一个乘数,最后与输入特征图相乘。
GSoP-Net (Global second-order pooling):
下图就是GSoP模块的结构,它类似于SE模块,采用了squeeze-excitation两个步骤。squeeze操作是为了沿着输入张量的通道维度建模二阶统计信息。首先,输入的 h ′ × w ′ × c ′ 的张量(其实就是特征图)首先通过1x1卷积降维到 h ′ × w ′ × c ,然后通道之间两两之间计算相关性,得到 c × c的协方差矩阵,这个协方差矩阵意义鲜明,第 i 行元素表明第 i 个通道和其他通道的统计层面的依赖。由于二次运算涉及到改变数据的顺序,因此对协方差矩阵执行逐行归一化,保留固有的结构信息。SENet使用GAP只获得了每个通道的均值,限制了统计建模能力。
然后,excitation模块,对上面的协方差特征图进行非线性逐行卷积得到 4c的结构信息,再用卷积调整到输入的通道数 c ′ 维度,和输入进行逐通道相乘,完成通道注意力。
GSoP-Net在压缩方式上做出了改变,将SE-Net中的一维压缩形式改为Cov的二维压缩
SRM (sytel-based recalibration module):
squeeze模块:使用style pooling(SP),它结合了全局平均池化和全局标准差池化。如下图所示。(输出为C × d :当只用全局平均池化就是C × 1 ;当用了全局平均池化和全局标准差池化就是C × 2 ;当用了全局平均池化和全局标准差池化和全局最大池化就是C × 3。
excitation模块:与通道等宽的全连接层CFC(Channel-wise fully-connected layer) ,含义:通道维度由[ C , d ]变为[ C , 1 ],即对于每一个通道,都有一个全连接层输入为d,输出为1;利用BN层和sigmoid函数(σ)得到C维注意力向量。
SRM在squeeze上采用SP池化,在excitation上使用逐通道卷积,相较于SE中的全连接层计算量较小,可以安插在更多的位置上。
FcaNet (efficient channel attention):
GAP也有不可忽略的问题,那就是GAP没办法捕获丰富的输入表示,这就导致了经过GAP得到的特征缺乏多样性,这主要是因为GAP对一个通道所有空间元素取其均值,而这个均值其实不足以表达不同通道的信息。作者对全局平均池化即GAP进行了理论上的分析,最终得出如下结论:首先,不同的通道有极大概率出现相同的均值,然而它们的语义信息是不同的,换句话说,GAP抑制的通道之间的多样性;其次,从频域角度来看,作者证明了GAP其实是离散余弦变换(DCT)的最低频分量,这其实忽略了很多其他有用的分量。
在这些结论的基础上,作者设计了一种新的高效多谱通道注意力框架。该框架在GAP是DCT的一种特殊形式的基础上,在频域上推广了GAP通道注意力机制,提出使用有限制的多个频率分量代替只有最低频的GAP。
FcaNet从数学角度提出了GAP的不足之处,并对其进行完善,这点是十分可取的!但是既然模块保留了全连接的形式,那么它的计算复杂度就和SEnet不相上下了,也就不可能大面积地出现在卷积操作之后。关于GAP是DCT的理论推导在FcaNet解读中。
ECA (efficient channel attention):
本文提出了一种用于深层CNN的有效通道注意(ECA)模块,该模块避免了维度缩减,并有效捕获了跨通道交互。在不降低维度的情况下进行逐通道全局平均池化之后,我们的ECA通过考虑每个通道及其k个近邻来捕获本地跨通道交互 。pytorch实现代码如下所示:
所以ECA的核心有两个:根据输入通道C自适应变换的卷积核k和在excitation环节中的conv1d。k的公式如下所示,决定卷积核大小的除了输入通道C,还有两个超参数。另外是在上面的代码中,conv1d相当于,用k*1的卷积核对输入特征图进行逐行卷积。也即:将每个通道和附近k个通道的信息进行整合。
ECA避免了SE excitation中的降维操作,转而用conv1d卷积进行跨通道信息整合。只改变了excitation。提高了一定精度,但是在计算复杂度上和SEnet和FcaNet相近。
GCT (Gated channel transformation):
GCT模块包括三个部分:global context embedding, channel normalization, gating adaptation。三个步骤的公式如下图所示。具体原理参考GTC原理讲解。
squeeze模块:在global context embedding中将(B,C,H,W)变成(B,C,1,1)。完成空间信息的压缩,变为单纯的通道信息。并加入了可训练的α调整各通道的权重。
excitation模块:在gating adaptation中引入β和γ来对各个通道进行区分,用tanh进行激活。相较于SE的全连接层,GCT各个通道的独立性更强,表征也更明显。
GTC同时改进了squeeze和excitation,尤其是在后者中,取消了之前全连接或者卷积的激活方式,采取了tanh激活,整个结构的参数量更少。是最轻量化的,可以放在每个卷积后面。
空间注意力机制讲解
STN:
STN算法讲解
其实学过DCN后再看STN就不难理解了,STN相当于是在两个特征图之间引入了空间变换(缩放,旋转等)。具体流程分为三部分:参数预测:Localisation net、坐标映射:Grid generator、像素的采集:Sampler。
参数预测用于生成变换操作的矩阵,以缩放为例。这一步的目的就是生成这个[[2,0],[0,2]]矩阵。
坐标映射是让目标图片在原图片上采样,每次从原图片的不同坐标上采集像素到目标图片上,而且要把目标图片贴满,每次目标图片的坐标都要遍历一遍,是固定的,而采集的原图片的坐标是不固定的,因此用这样的映射。也就是说,坐标的映射关系是从目标图片映射到输入图片上的。
像素采集就类似于使用双线性插值来获取小数坐标的像素值。
self-attention and variants:
自注意力机制详解
这篇博文从基本原理和矩阵运算的角度具体介绍了自注意力机制中K、Q、V的含义,以及多头注意力机制的计算过程。
回到本篇论文上,这部分的变体模块讲解得较为简略,也不做过多研究了,直接进入下一个。
Vision Transformers:
Transformers in computational visual media: A survey这篇文献中有关于机器视觉中的transformer用法。
GENet:
这篇论文的解读资料很少,目前只了解概念性的功能:第一步中,它聚集了输入特征及其邻域特征,并对不同空间位置之间的关系进行建模。在第二步中,首先使用插值生成与输入特征图相同大小的注意图。然后将输入特征图中的每个位置乘以注意力图中的相应元素进行缩放。整个过程描述如下:
其实第一步中的gather可以用很多方法来进行替换,例如逐通道卷积或者全局平均池化,目的是为了将特征图上各个点的各个通道信息整合起来。应该说是SENet之后,自然而然可以联想到的一种注意力机制。
关于“when”施加注意力机制,多用于视频检测,不做过多研究
Highway networks:
highway network 是2015年提出的网络,当时的模型都在追求的方向是加深加宽,highway network就是其中之一。相较于resnet,它已经有了其中shorcut的思想,但是不够大胆。门控系数T不能为0或者1,只能为中间值,体现出了分支注意力的思想。
SKNet:
SKNet 使神经元能够自适应地调整其感受野大小,即在多个不同核大小的核之间进行“选择性核”(SK)卷积。输入特征图首先经过33和55卷积各自获得特征图,加和后送入全连接层最后生成两个权重系数a和b。V=a×U1+b×U2。所以输出特征图融合了两种卷积核作用的结果,也即拥有两种感受野下的特征。
CondConv:
为了打破传统卷积的特性,作者将CondConv中卷积核参数化为多个专家知识的线性组合(其中,a1,a2,a3,…an是通过梯度下降法学习的权重系数):(a1W1+a2W2+…+anWn)*x,x是输入样本.可以通过提升专家的数量来提升模型的容量,这比提升卷积核的尺寸更有效,同时专家知识只需要一次线性组合,就可以提升模型容量的同时保持高效的推理。
SKNet类似于下图中b图的方案,先对各个卷积核各自进行卷积,融合他们的特征图。CondConv则是a图的情况,先计算出各个“专家”卷积核的权重,融合卷积核之后只做一次卷积。CondConv的方案显然计算量要小于SKNet。
Dynamic Convolution:
Dynamic Convolution 的结构如下图所示。
输入x首先经过attention生成K个卷积核的权重(由于经过softmax,权重和为1,不用担心叠加后过大的情况),将权重和各个kernel_size的weight进行相乘叠加,然后进行卷积。
与CondConv相比,主要是约束参数。首先是在权重输出上,通过softmax缩放到0-1且和为1;然后是在各个卷积核的权重上:由于attention权重大多数是sparse的(与CondConv的实验异曲同工),所以大多数的kernal得不到训练,为解决这个问题,作者提出了下述公式进行平滑:
(这段可以看上面的链接) 这里z_{k} 表示第二层FC的输出。举个栗子方便理解:假设该层有K=2个kernal,z zz输出的结果为(0.01, 0.99),那么在反向传播时第二个kernal可以得到更好地学习,而第一个kernal的参数学习会被抑制。所以采用上述公式,假如超参数\tau=30,那么此时\pi_{1} 的值就比之前不做平滑的大很多。因为z_{1}即使缩小了30被,经指数函数仍然是趋近于1;而z_{2} 一旦缩小30倍,attention就从e{0.99}下降成了e{0.03},这个削弱幅度是巨大的。因此平滑操作有利于所有的kernel进行参数的迭代更新。
分支注意力机制小结
SKNet还是归为第一类,因为它是融合得特征图,而不是融合得卷积核。当然现在来看还是第二种计算量小嘛。
通道空间注意力机制讲解
CBAM
CBAM是个比较经典的注意力机制,核心算法就在这三张图上。看的时候结合着代码理解。
CBAM的整体框图:(注意两个模块的顺序)
通道注意力:(共享权重的MLP其实就是maxpool和avgpool输出共用一个全连接层)
空间注意力:(完成通道上的池化以后,再需要经过个7×7卷积(7×7比3×3效果要好)操作,降维为1个channel,即H×W×1)
BAM:
BAM 也是由CBAM的作者提出的。
不同于CBAM将通道注意力和空间注意力串联,这里采用了并联的思路。将通道注意力向量和空间注意力特征图经过广播叠加在一起,叠加后与原始输入向量F大小相同。最后通过一个残差结构结合到一起。
GALA:
全局和局部注意力(GALA)模块 这个通过下图就可以理解。全局注意力(通道注意力)是全局平均池化获得,局部注意力(空间注意力)是两个连续的1×1卷积获得。两个特征向量(矩阵)expand后送入tanh非线性激活函数获得最终的注意力矩阵,与原矩阵相乘即可。
虽然说是全局和局部注意力,但本质上还是通道和空间注意力。不过本文的处理方法与BAM有所不同的地方在于,引入了两个可训练参数a和m用于非线性激活。
scSE:
scSE 在通道注意力和空间注意力的结合方式都是并联叠加。区别就在于空间注意力的具体步骤上。实现原理很简单,看个图就跳过了。这个没啥意思,和之前的空间通道注意力机制相比,就是在耦合方式上,他们是注意力向量expand后相加,这个是各自耦合后再相加特征矩阵。
Triplet Attention:
三头注意力机制 的结构如下图所示。
上图中共有三个分支,每个分支都在捕获H、W和C中任意两个域之间的跨域交互中发挥作用。第一个支路就是最常见的空间注意力机制,它关注H和W的信息交互;第二个支路就是关注C和W的交互。获得三个支路后进行叠加最后输出。这个机制确实关注到了不同通道之间的交互重要性,但是在实际使用时发现,与其他注意力机制相比对于模型性能的提升并不明显,且会增加计算量。
coordinate attention:
CA 我认为应该算是空间注意力机制。
首先进行w和h上的平均池化,拼接以后送入1×1卷积中进行降维,然后通过BN和激活函数,再拆开分别进行卷积,最后变成权重系数和原输入相乘。
我觉得和三头的注意力机制很像,都是在关注跨通道的特征,只是这个取消掉了最常见的逐通道池化,而且加了spilt的操作。该模型设计的出发点是为了用在小模型上,所以比较起来计算量相对较少,和SE、CBAM相比性能也有较大提升。
Dual attention:
Dual attention 引入了自注意力机制的双注意力网络。主要特点就是轻量,性能比SE和CBAM的性能也都高。整体流程图如下所示:
上半部分用来提取空间信息。用三个卷积生成BCD三个特征图,相当于自注意机制的KQV。B和C经过矩阵相乘耦合在一起,然后再和C相乘,最后和输入特征图A叠加在一起。
下半部分用来提取通道信息。与上半部分不同的是,下面三个特征图并没有经过卷积,而是直接reshape进行叠加。
RGA
关系感知的全局注意力 :这个博文解释得不是特别清楚,需要结合通道空间注意力综述的那篇论文来进行理解。
下面就是其中最核心的两个模块,也就是通道和空间注意力机制的导入方法。以空间注意力模块为例,首先输入特征图会先生成各个像素点间的相关性矩阵。相关性矩阵的生成公式如下所示。将输入特征图与关系矩阵相乘后得到两个矩阵,看起来这两个矩阵应该是互为转置,三个矩阵拼接然后进行逐通道卷积。通道注意力模块也是一样的计算步骤。
模型性能的话在目标检测领域不好说,因为它主要与行人重识别的其他算法作比较。不过计算量不高,但是低计算量是因为采用1×1的卷积代替了全连接(全连接>3×3卷积>1×1卷积)。
Self-Calibrated Convolutions:
SCNet 它使每个空间位置能够自适应地编码来自远程区域的信息上下文,说白了就是自适应增加了感受野。
算法流程比较简单:输入特征一分为二,上一半经过平均池化下采和差值上采后,和X1相加取sigmoid,获得注意力矩阵。再与经过K3卷积核的X1相乘,最后经过K4卷积核输出得到Y1,Y1与Y2连接组成输出特征图。如何获取得远程区域的信息上下文呢?主要是在X1的注意力机制中。经过上采样和下采样的特征拥有更广阔的感受野。
它类似于双注意力机制,这个只在一个支路上进行了注意力机制的引入,本质上也是一种自注意力机制。另一个不同就是提取特征不同,Dual attention是分通道和空间的,这个就不是了。这个模块的好处在于虽然看似是四个卷积操作。但实际上每个卷积核都是之前的1/4(C/2,C/2,H,W),这样增加的计算量就相对有限了。
Strip Pooling
SPNet 仅从图片上就很好理解:分别进行水平和垂直池化,然后通过kernel=3的一维卷积再expand,通过相加或相乘等方式进行组合。对于模型来说,更容易获得全局视野。