SEnet和ECA与CBAM以及Coordinate attention

358 阅读10分钟

(1)SEnet

image.png

通道注意力机制的思想是,对于输入进来的特征层,我们在每一个通道学习不同的权重,这些权重与不同通道的特征相关,决定了每个通道在任务中的重要性。

详细步骤 对于SENet而言,它会对输入特征层进行这些操作:

global average pooling

首先对输入特征层做了global average pooling,也就是全局平均池化,全局平均池化将对当前特征层取平均值,高、宽分别为H、W的特征层经过平均池化操作后会得到一个实数,这个实数就是所有输入特征层的平均值;另外,池化操作是在每个通道独立进行的,平均池化并不影响通道数,因此,输入为CHW的特征经过平均池化后,H和W两个维度被压缩,就将得到只剩下C(也就是通道数)这一个维度的特征层。

全连接

然后,对于平均池化输出的矩阵,进行两次全连接,第一次全连接和第二次是不完全相同的,区别在于:第一次全连接的通道数不完整,而是取原通道数的1/r,也就是这边的C/r,第二次则是用正常的通道数进行全连接。

这样做的目的是——能够减少通道个数从而降低计算量,并在一定程度上防止网络模型过拟合。

这个操作有点类似于dropout,通过随机让神经网络中的部分神经元暂时失活,从而减少模型的过拟合风险而SEnet在这里是固定减少特征图的通道数,dropout往往也是在全连接层这类参数比较多的层中使用

对于一个正常的全连接网络而言,当前层每个神经元的值由前一层所有神经元共同决定,对于输入X,沿着网络前向传播,然后将误差回传,以此更新神经元之间的权重以及偏置参数。
当我们对其中的隐藏层使用Dropout后,隐藏层中的神经元以一定概率“睡眠”,通过对其随机置零实现,其更新参数的过程也发生了一些改变,具体地,过程如下:

(1)网络首先按照一定概率将隐藏层中的部分神经元随机置零,此时这些神经元将暂时处于“睡眠”状态;

(2)输入X沿着网络前向传播,然后通过误差回传更新神经元参数,需要注意的是此时只有未被“置零”的神经元参数被更新,处于“睡眠”状态的神经元参数与上一次参数更新的结果保持一致;

(3)将隐藏层所有神经元激活,此时之前未被“睡眠”的部分神经元参数得到更新,“睡眠”状态的神经元参数与上一次更新结果保持一致,然后重复(1)、(2)步骤;

全连接1只取原通道数的1/r以此来减少计算量与防止过拟合,但是全连接2又用回原通道数——这样做是为了输出与原特征层相同的通道数,以便后续通过乘法逐通道加权到原先的输入特征层上。

两个全连接层不是简单的直接相连,而是在全连接1后面经过一个relu激活函数,这是全连接层中很常规的操作,用来对一个全连接层的输出结果进行非线性变换,如果不这样做,所有的全连接层都只是普通的线性组合,这样训练出来的模型无法理解复杂的非线性数据和特征,差。

relu激活函数的公式其实很简单:f(x) = max(0, x),在x大于等于零时是线性函数,但当输入为负数时,输出为零,在负数部分截断了线性部分,将其映射到了一个确定的点上,从而实现了非线性变换。

sigmoid

再然后,需要对全连接2的输出结果映射到sigmoid函数中,sigmoid是很经典的激活函数,它的值域是0到1,画一下函数图像(显然x=0时函数值等于0.5)……然后,它的定义域是整个实数集,值域是0到1,也就是说,全连接2的输出结果映射到sigmoid函数中后,就将得到一组0到1之间的值(因此称此操作为归一化),也就是所谓的不同通道的权重。

image.png

image.png

最后最后,将这组通道权重与原输入特征层通过乘法逐通道加权,就实现了增强重要的通道,抑制不重要的通道,也就是所谓的通道注意力机制。

(2)ECAnet

senet中间是进行了维度的转变的。但是降维会给通道注意力预测带来副作用,降维虽然可以降低模型复杂度,但破坏了信道与其权值的直接对应关系,并且捕获所有通道之间的依存关系效率不高而且没有必要。例如,单个FC层使用所有信道的线性组合来预测每个信道的权值。但是首先将信道特征投影到低维空间,然后再映射回来,使得信道与其权重之间的对应是间接的。

同时作者表示,基于SENet的扩展大多都只致力于开发复杂的attention模型,这就无可避免地增加了模型的复杂性。本文的ECANet只涉及少量的参数,可以达到两个目的:(1)避免特征维度的缩减;(2)增加channel间信息的交互,在降低复杂度的同时保持性能(通过一维卷积)。

image.png

我们的ECA可以通过大小为k的快速一维卷积有效实现,其中内核大小k代表本地跨通道交互的覆盖范围,即有多少个相近邻参与一个通道的注意力预测。

单个 FC 层的 SEVar3 的性能优于两个 FC 层,SE 块的降维。以上所有结果清楚地表明,避免降维有助于学习有效的通道注意力。因此,我们开发了没有通道降维的 ECA 模块。

针对SEBlock的步骤(3),将MLP模块(FC->ReLU>FC->Sigmoid),转变为一维卷积的形式,有效减少了参数计算量(我们都知道在CNN网络中,往往连接层是参数量巨大的,因此将全连接层改为一维卷积的形式)

(3)CBAM

SEnet只关注了通道注意力机制而忽略了空间上的一些简单特征,相比之下,CBAM将通道注意力机制和空间注意力机制进行一个结合,对输入进来的特征层,分别进行通道注意力机制的处理和空间注意力机制的处理,而是是先通道后空间

下接具体结构

通道机制

image.png

保持通道维度不变,压缩空间维度。该模块关注输入图片中有意义的信息

此处的通道机制和SEnet通道机制的不同点在于加了一个并行的最大池化层,提取到的高层特征更全面,更丰富。

对于输入特征层,分别作全局最大池化和全局平均池化,输出结果分别送入一个共享全连接层(官方源码在这里和SEnet的全连接层一模一样),为什么叫共享全连接层?因为最大池化和平均池化的两条路线用的是这同一个全连接层。然后对两个结果(maxout和avgout)做加法,最后进行归一化操作,获得通道上的权重矩阵。

在channel attention中,对于pooling的使用进行了实验对比,发现avg & max的并行池化的效果要更好。这里也有可能是池化丢失的信息太多,avg&max的并行连接方式比单一的池化丢失的信息更少,所以效果会更好一点。

image.png

空间机制

image.png

空间维度不变,压缩通道维度。该模块关注的是目标的位置信息 将Channel Attention的输出结果通过最大池化和平均池化得到两个1 ∗ H ∗ W的特征图

然后对两个结果拼接Concat,也就是maxout的1HW与avgout的1 ∗ H ∗ W进行拼接,得到2 ∗ H ∗ W的张量,因此紧接着下一步就要进行一个7*7的卷积(conv)将通道压缩回1,最后还是进行归一化操作,获得空间上的权重矩阵。

CBAM等方法通过减少通道数继而使用大尺寸卷积来利用位置信息。然而,卷积仅仅能够捕获局部相关性,建模对视觉任务非常重要的长程依赖则显得有些有心无力。

image.png 通道注意力和空间注意力这两个模块能够以并行或者串行顺序的方式组合在一块儿,关于通道和空间上的串行顺序和并行作者进行了实验对比,发现先通道再空间的结果会稍微好一点。

(4) Coordinate attention

作者利用两个一维(1-D)全局池化操作沿着垂直(vertical)和水平(horizontal)方向将输入特征聚合(aggregate)成两个独立的(separate)方向感知(direction-aware)特征图。

然后,这两个嵌入特定方向信息的特征图分别被编码为两个注意力图,每个注意力图都捕获了输入特征图沿着一个空间方向的长程依赖。因此,位置信息就被保存在生成的注意力图里了,两个注意力图接着被乘到输入特征图上来增强特征图的表示能力。

不仅考虑了通道信息,还考虑了方向相关的位置信息。 足够的灵活和轻量,能够简单的插入到轻量级网络的核心模块中。

image.png

池化

为了避免空间信息全部压缩到通道中,这里没有使用全局平均池化。为了能够捕获具有精准位置信息的远程空间交互,对全局平均池化进行的分解。

C ∗ H ∗ W 输入特征图分别按照X方向和Y方向进行池化,分别生成尺寸为C ∗ H ∗ 1 和C ∗ 1 ∗ W的特征图。

image.png

这两种变换也允许注意力模块捕捉到沿着一个空间方向的长程依赖,并保存沿着另一个空间方向的精确位置信息,这有助于网络更准确地定位感兴趣的目标。

concat

we first concatenate them and then send them to a shared 1 × 1 convolutional transformation function F1, yielding

将生成的C ∗ 1 ∗ W 的特征图进行变换,然后进行concat,进行concat后生成如下图所示的特征图,然后进行F1操作(利用1*1卷积核进行降维,如SE注意力中操作)和激活操作,生成特征图 C/r ∗ H+w ∗ 1

image.png

Coordinate Attention Generation

将特征图f分为两个不同的张量:fh和fw,使用1×1卷积将通道调整到与输入x相同数量的通道数,并使用sigmoid函数得到最终空间位置在垂直和水平上的注意力权重。

它不仅仅能捕获跨通道的信息,还能捕获方向感知和位置感知的信息

由于检测网络模型中的SPP属于池化操作,因此本文引入了用CA来代替SPP。它将全局池化分解为一对一维(1-D)特征编码操作。然后,两个一维全局池化操作沿着垂直和水平方向将输入特征聚合成两个独立的方向感知特征图,通过特征在空间中的转换,动态(dynamically)捕获特征图的长程依赖性(long-range dependency)