发布时间:2022-12-28 11:00
本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义,以期加深自己的印象,后续可以随时翻看并且学习其中好的tricks。这一期接着记录一下CV中的注意力机制这几年的经典论文。
论文全名为《Selective Kernel Networks》(原文链接:https://arxiv.org/abs/1903.06586),发表在CVPR 2019上。SKNet也是对于SENet的改进,其结合了Inception的思想,空间注意力这一部分就是使用多个不同大小的卷积核进行感知,以适配不同大小的目标,思路和操作都非常直观:
首先将输入的特征图使用3x3和5x5的卷积核卷积,其中5x5的卷积核可以用一个dilation为2的3x3的空洞卷积替换。然后对应位置相加,融合不同支路的信息流得到 U,通过全局平均池化得到 S (就是SENet中的Squeeze操作),接着使用一个全连接层降低通道数(类似PCA的思想,因为后面还要分支路),经由BN和ReLU输出得到 Z。对于 Z ,首先对于每个支路再用一个全连接层(下面的 A、B)恢复通道数,然后对每个通道都用一个softmax得到不同支路的权重:
最后再将初始支路上的特征图进行加权融合即可:
作者们其实对组合使用多大的卷积核进行了实验:
在确定了卷积核之后,作者们还做实验确认了 SK 卷积起效方式是否和想的一样。下图结果表明,对于更大的物体,5×5 卷积的那条支路的权重会更大:
不得不说,这篇论文的实验是比较完备的,考虑到了很多方面。论文中使用的是双支路,可以根据自己的需求变成三支路或者更多支路。SKNet其实在参数量和计算量上毫无疑问是没有优势的,但精度确实是有提升:
论文全名为《CBAM: Convolutional Block Attention Module》(原文链接:https://arxiv.org/abs/1807.06521),是ECCV 2018上的工作。CBAM同样也是思路和操作都非常一目了然的模块,下面直接看下其空间注意力和通道注意力的具体实现:
通道注意力——对于大小为 H×W×C 输入特征图 F,在空间维度上先分别进行全局的平均池化和最大池化得到两个大小为 1×1×C 的通道描述,接着再将它们分别送入同一个两层的多层感知机(其实就是 1×1卷积 + ReLU + 1×1卷积的组合,同样是 BottleNeck 结构,完成通道数的压缩与解压缩)。最后将得到的两个 tensor 相加,再经由 Sigmoid 输出就是融合后大小为 1×1×C 的通道注意力 MC 了。
空间注意力——对于已经经过通道注意力调整后的特征图 F’,在通道维度上同样分别进行全局的平均池化和最大池化得到两个 H×W×1 的空间描述,直接按通道维度拼接在一起。然后经过一个 7×7 的卷积层,再经由 Sigmoid 输出就得到了大小为 H×W×1 的空间注意力 MS。
接下来就是一些消融实验,比如如何更有效地计算通道注意力:
至于空间注意力,有趣的是用池化比用 1×1 卷积提取信息效果更好:
以及如何组合通道与空间注意力,串联或并联?串联的话谁先谁后?
总的来说 CBAM 模块真真正正是轻量级的,代码也少,增加的计算量和参数量也很少,也很好直接插入现有的模型。
论文全名为《BAM: Bottleneck Attention Module》(原文链接:https://arxiv.org/abs/1807.06514),有趣的是和上面的CBAM是出自同一个团队,只不过是一二作互换了,连上传到arxiv时间都差不多…和CBAM最大的区别我认为不是串联和并联,而是插入位置,先看看CBAM的插入位置:
可以看到CBAM其实是插入到block里面了,而BAM插入在整个block外面,池化层之前:
这一点和之前绝大部分注意力机制都有所不同。接下来看一下具体的细节:
通道注意力——其实跟SENet几乎一样,FC + BN + ReLU + FC的结构, 只不过是用的全连接层,但全连接层和 1×1卷积核在数学上是没有什么区别的,卷积可以处理任意大小输入罢了。
空间注意力——先经过一个1×1卷积层降低通道数,然后通过多个空洞卷积增大感受野,再经过一个1×1卷积把通道数降为1就得到了空间注意力。
两种注意力融合也需要注意,是通过广播机制逐元素相乘再经由Sigmoid输出的融合方式。整体上其实和CBAM差别还是很大的,那么结果呢?
与CBAM的结果对比一下:
显然还是CBAM更好,BAM模块有时甚至不如SE,但是BAM插入的位置其实是值得思考的。
第一篇论文全名为《Attentive Generative Adversarial Network for Raindrop Removal from A Single Image》(原文链接:https://arxiv.org/abs/1711.10098),来自CVPR 2018,用GAN+注意力机制做了除雨的任务,我不太了解除雨这方面的工作,直观上就是需要补全被雨点覆盖到的图像部分,但是我在B站上看到过一个大神用视频帧之差计算雨量的视频,如果只是对一张单帧图片除雨的话难度显然更大,所以题目后面才加上这么一个点吧。
生成器部分首先是一个循环网络,用注意力图与特征图融合作为输入,用来学习雨滴的位置,从图上来看经过一定时间步的学习后已经能比较好地定位雨点的位置了。然后输入一个AE框架结构里,目的是生成一个去除雨滴后的图像。感觉这个架构思路很好,值得学习,最后效果也是不错的:
第二篇论文全名为《ARGAN: Attentive Recurrent Generative Adversarial Network for Shadow Detection and Removal》(原文链接:https://arxiv.org/abs/1908.01323),来自ICCV 2019。
这篇论文做的是去除图像阴影的工作,整体架构和上一篇非常像,思路都是利用LSTM多时间步学习,然后AE负责图像变换:
起到去阴影的一步应该是上图的加法,那么前面的乘法部分自然是负责生成负的阴影部分。
其实注意力机制为什么有效也可以从另一个角度来说,卷积的过程实际上也是集 建模空间依赖、建模通道依赖、特征融合 于一体的操作,但卷积只能针对局部区域,导致感受野受限,而注意力机制可以对整个输入特征图进行建模,感受野覆盖全局,这应该说是一个有益的信息补充方式。另外,网络仅仅通过卷积堆叠来提取特征,可以认为是用同一个形式的函数来拟合,所以提取出来的特征缺乏多样性,而注意力机制可以相对弥补这一点,所以注意力机制和卷积也算是相辅相成的。