本文对图像处理中的注意力机制进行了全面综述,介绍了注意力机制的基本概念和分类,并对多种方法进行了具体解读。
目录
- 概要
- 为什么需要视觉注意力
- 注意力分类与基本概念
- 软注意力
- The application of two-level attention models in deep convolutional neural network for fine-grained image classification---CVPR2015
- 1. Spatial Transformer Networks(空间域注意力)---2015 nips
- 2. SENET (通道域)---2017CPVR
- 3. Residual Attention Network(混合域)---2017
- Non-local Neural Networks, CVPR2018](#Nonlocal_Neural_Networks_CVPR2018_120)
- Interaction-aware Attention, ECCV2018
- CBAM: Convolutional Block Attention Module(通道域+空间域), ECCV2018
- DANet:Dual Attention Network for Scene Segmentation(空间域+通道域), CPVR2019
- CCNet
- OCNet
- GCNet:Non-local Networks Meet Squeeze-Excitation Networks and Beyond
- 注意增强型卷积
- PAN: Pyramid Attention Network for Semantic Segmentation(层域)---CVPR2018
- Multi-Context Attention for Human Pose Estimation
- Tell Me Where to Look: Guided Attention Inference Network
- 硬注意力
- 一种通过引入硬注意力机制来引导学习视觉回答任务的研究
- 1. Diversified visual attention networks for fine-grained object classification---2016
- 2. Deep networks with internal selective attention through feedback connections (通道域)---NIPS 2014
- 3.Fully Convolutional Attention Networks for Fine-Grained Recognition
- 4 . 时间域注意力(RNN)
- 自注意力
- RelatedWorks
- 自注意力的缺点和改进策略
- 自注意力小结
概要
为什么需要视觉注意力
计算机视觉(computer vision)中的注意力机制(attention)的基本思想就是想让系统学会注意力——能够忽略无关信息而关注重点信息。为什么要忽略无关信息呢?
注意力分类与基本概念
神经网络中的「注意力」是什么?怎么用?这里有一篇详解
该文分为: 硬注意力、软注意力、此外,还有高斯注意力、空间变换
就注意力的可微性来分:
- Hard-attention,就是0/1问题,哪些区域是被 attentioned,哪些区域不关注.硬注意力在图像中的应用已经被人们熟知多年:图像裁剪(image cropping)
硬注意力(强注意力)与软注意力不同点在于,首先强注意力是更加关注点,也就是图像中的每个点都有可能延伸出注意力,同时强注意力是一个随机的预测过程,更强调动态变化。当然,最关键是强注意力是一个不可微的注意力,训练过程往往是通过增强学习(reinforcement learning)来完成的。(参考文章:Mnih, Volodymyr, Nicolas Heess, and AlexGraves. “Recurrent models of visual attention.” Advances inneural information processing systems. 2014.)
硬注意力可以用Python(或Tensorflow)实现为:
g = I[y:y+h, x:x+w]
上述存在的唯一的问题是它是不可微分的;你如果想要学习模型参数的话,就必须使用分数评估器(score-function estimator)关于这一点,我的前一篇文章中有对其的简要介绍。
1、Soft-attention,[0,1]间连续分布问题,每个区域被关注的程度高低,用0~1的score表示.
软注意力的关键点在于,这种注意力更关注区域或者通道,而且软注意力是确定性的注意力,学习完成后直接可以通过网络生成,最关键的地方是软注意力是可微的,这是一个非常重要的地方。可以微分的注意力就可以通过神经网络算出梯度并且前向传播和后向反馈来学习得到注意力的权重。
然而,这种类型的软注意力在计算上是非常浪费的。输入的黑色部分对结果没有任何影响,但仍然需要处理。同时它也是过度参数化的:实现注意力的sigmoid 激活函数是彼此相互独立的。它可以一次选择多个目标,但实际操作中,我们经常希望具有选择性,并且只能关注场景中的一个单一元素。由DRAW和空间变换网络(Spatial Transformer Networks)引入的以下两种机制很好地别解决了这个问题。它们也可以调整输入的大小,从而进一步提高性能。
就注意力关注的域来分:
- 空间域(spatial domain)
- 通道域(channel domain)
- 层域(layer domain)
- 混合域(mixed domain)
- 时间域(time domain):还有另一种比较特殊的强注意力实现的注意力域,时间域(time domain),但是因为强注意力是使用reinforcement learning来实现的,训练起来有所不同
一个概念:Self-attention自注意力,就是 feature map 间的自主学习,分配权重(可以是 spatial,可以是 temporal,也可以是 channel间)
软注意力
The application of two-level attention models in deep convolutional neural network for fine-grained image classification—CVPR2015
1. Spatial Transformer Networks(空间域注意力)—2015 nips
Spatial Transformer Networks(STN)模型[4]是15年NIPS上的文章,这篇文章通过注意力机制,将原始图片中的空间信息变换到另一个空间中并保留了关键信息。
这篇文章认为之前pooling的方法太过于暴力,直接将信息合并会导致关键信息无法识别出来,所以提出了一个叫空间转换器(spatial transformer)的模块,将图片中的的空间域信息做对应的空间变换,从而能将关键的信息提取出来。
spatial transformer其实就是注意力机制的实现,因为训练出的spatial transformer能够找出图片信息中需要被关注的区域,同时这个transformer又能够具有旋转、缩放变换的功能,这样图片局部的重要信息能够通过变换而被框盒提取出来。
比如这个直观的实验图:
(a)列是原始的图片信息,其中第一个手写数字7没有做任何变换,第二个手写数字5,做了一定的旋转变化,而第三个手写数字6,加上了一些噪声信号;
(b)列中的彩色边框是学习到的spatial transformer的框盒(bounding box),每一个框盒其实就是对应图片学习出来的一个spatial transformer;
©列中是通过spatial transformer转换之后的特征图,可以看出7的关键区域被选择出来,5被旋转成为了正向的图片,6的噪声信息没有被识别进入。
2. SENET (通道域)—2017CPVR

中间的模块就是SENet的创新部分,也就是注意力机制模块。这个注意力机制分成三个部分:挤压(squeeze),激励(excitation),以及scale(attention)。
流程:
- 将输入特征进行 Global AVE pooling,得到 1_1_ Channel
- 然后bottleneck特征交互一下,先压缩 channel数,再重构回channel数
- 最后接个 sigmoid,生成channel 间0~1的 attention weights,最后 scale 乘回原输入特征
3. Residual Attention Network(混合域)—2017
文章中注意力的机制是软注意力基本的加掩码(mask)机制,但是不同的是,这种注意力机制的mask借鉴了残差网络的想法,不只根据当前网络层的信息加上mask,还把上一层的信息传递下来,这样就防止mask之后的信息量过少引起的网络层数不能堆叠很深的问题。
文提出的注意力mask,不仅仅只是对空间域或者通道域注意,这种mask可以看作是每一个特征元素(element)的权重。通过给每个特征元素都找到其对应的注意力权重,就可以同时形成了空间域和通道域的注意力机制。
很多人看到这里就会有疑问,这种做法应该是从空间域或者通道域非常自然的一个过渡,怎么做单一域注意力的人都没有想到呢?原因有:
- 如果你给每一个特征元素都赋予一个mask权重的话,mask之后的信息就会非常少,可能直接就破坏了网络深层的特征信息;
- 另外,如果你可以加上注意力机制之后,残差单元(Residual Unit)的恒等映射(identical mapping)特性会被破坏,从而很难训练。
该文章的注意力机制的创新点在于提出了残差注意力学习(residual attention learning),不仅只把mask之后的特征张量作为下一层的输入,同时也将mask之前的特征张量作为下一层的输入,这时候可以得到的特征更为丰富,从而能够更好的注意关键特征。
文章中模型结构是非常清晰的,整体结构上,是三阶注意力模块(3-stage attention module)。每一个注意力模块可以分成两个分支(看stage2),上面的分支叫主分支(trunk branch),是基本的残差网络(ResNet)的结构。而下面的分支是软掩码分支(soft mask branch),而软掩码分支中包含的主要部分就是残差注意力学习机制。通过下采样(down sampling)和上采样(up sampling),以及残差模块(residual unit),组成了注意力的机制。
模型结构中比较创新的残差注意力机制是:
H是注意力模块的输出,F是上一层的图片张量特征,M是软掩码的注意力参数。这就构成了残差注意力模块,能将图片特征和加强注意力之后的特征一同输入到下一模块中。F函数可以选择不同的函数,就可以得到不同注意力域的结果:
- f1是对图片特征张量直接sigmoid激活函数,就是混合域的注意力;
- f2是对图片特征张量直接做全局平均池化(global average pooling),所以得到的是通道域的注意力(类比SENet);
- f3 是求图片特征张量在通道域上的平均值的激活函数,类似于忽略了通道域的信息,从而得到空间域的注意力。
Non-local Neural Networks, CVPR2018
FAIR的杰作,主要 inspired by 传统方法用non-local similarity来做图像 denoise
主要思想也很简单,CNN中的 convolution单元每次只关注邻域 kernel size 的区域,就算后期感受野越来越大,终究还是局部区域的运算,这样就忽略了全局其他片区(比如很远的像素)对当前区域的贡献。
所以 non-local blocks 要做的是,捕获这种 long-range 关系:对于2D图像,就是图像中任何像素对当前像素的关系权值;对于3D视频,就是所有帧中的所有像素,对当前帧的像素的关系权值。
网络框架图也是简单粗暴:
文中有谈及多种实现方式,在这里简单说说在DL框架中最好实现的 Matmul 方式:
- 首先对输入的 feature map X 进行线性映射(说白了就是 1x1x1 卷积,来压缩通道数),然后得到θ,ϕ,g特征
- 通过reshape操作,强行合并上述的三个特征除通道数外的维度,然后对 进行矩阵点乘操作,得到类似协方差矩阵的东西(这个过程很重要,计算出特征中的自相关性,即得到每帧中每个像素对其他所有帧所有像素的关系)
- 然后对自相关特征 以列or以行(具体看矩阵 g 的形式而定) 进行 Softmax 操作,得到0~1的weights,这里就是我们需要的 Self-attention 系数
- 最后将 attention系数,对应乘回特征矩阵 g 中,然后再上扩 channel 数,与原输入 feature map X 残差一下,完整的 bottleneck
嵌入在 action recognition 框架中的attention map 可视化效果:
图中的箭头表示,previous 若干帧中的某些像素 对最后图(当前帧)的脚关节像素的贡献关系。由于是soft-attention,其实每帧每个像素对对其有贡献关系,图中黄色箭头是把响应最大的关系描述出来。
总结
Pros:non-local blocks很通用的,容易嵌入在任何现有的 2D 和 3D 卷积网络里,来改善或者可视化理解相关的CV任务。比如前不久已有文章把 non-local 用在 Video ReID [2] 的任务里。
Cons:文中的结果建议把non-local 尽量放在靠前的层里,但是实际上做 3D 任务,靠前的层由于 temporal T 相对较大,构造及点乘操作那步,超多的参数,需要耗费很大的GPU Memory。
Interaction-aware Attention, ECCV2018
美图联合中科院的文章
这文章扯了很多 Multi-scale 特征融合,讲了一堆 story,然并卵;直接说重点贡献,就是在 non-local block 的协方差矩阵基础上,设计了基于 PCA 的新loss,更好地进行特征交互。作者认为,这个过程,特征会在channel维度进行更好的 non-local interact,故称为 Interaction-aware attention
那么问题来了,怎么实现 通过PCA来获得 Attention weights呢?
文中不直接使用 协方差矩阵的特征值分解 来实现,而是使用下述等价形式:
CBAM: Convolutional Block Attention Module(通道域+空间域), ECCV2018
这货就是基于 SE-Net [5]中的 Squeeze-and-Excitation module 来进行进一步拓展,
具体来说,文中把 channel-wise attention 看成是教网络 Look 'what’;而spatial attention 看成是教网络 Look ‘where’,所以它比 SE Module 的主要优势就多了后者
通道注意力公式:
空间注意力公式:(空间域注意力是通过对通道axis进行AvgPool和MaxPool得来的)
CBAM 特别轻量级,也方便在端部署。
DANet:Dual Attention Network for Scene Segmentation(空间域+通道域), CPVR2019
把Self-attention的思想用在图像分割,可通过long-range上下文关系更好地做到精准分割。
主要思想也是上述文章 CBAM 和 non-local 的融合变形:
把deep feature map进行spatial-wise self-attention,同时也进行channel-wise self-attetnion,最后将两个结果进行 element-wise sum 融合。
这样做的好处是:
在 CBAM 分别进行空间和通道 self-attention的思想上,直接使用了 non-local 的自相关矩阵 Matmul 的形式进行运算,避免了 CBAM 手工设计 pooling,多层感知器 等复杂操作。
CCNet
本篇文章的亮点在于用了巧妙的方法减少了参数量。在上面的DANet中,attention map计算的是所有像素与所有像素之间的相似性,空间复杂度为(HxW)x(HxW),而本文采用了criss-cross思想,只计算每个像素与其同行同列即十字上的像素的相似性,通过进行循环(两次相同操作),间接计算到每个像素与每个像素的相似性,将空间复杂度降为(HxW)x(H+W-1),以图为例为下:
整个网络的架构与DANet相同,只不过attention模块有所不同,如下图:在计算矩阵相乘时每个像素只抽取特征图中对应十字位置的像素进行点乘,计算相似度。
经过一轮此attention计算得到的attention map如下图R1所示,对于每个元素只有十字上的相似性,而通过两轮此计算,对于每个元素就会得到整张图的相似性,如R2。
得到此结果的原因如下图,经过一轮计算,每个像素可以得到在其十字上的相似性,对于不同列不同行(不在其十字上)的像素是没有相似性的,但是这个不同行不同列像素同样也进行了相似性计算,计算了在其十字上的相似性,那么两个十字必有相交,在第二次attention计算的时候,通过交点,相当于是间接计算了这两个不同列不同行像素之间的相似性。
实验结果达到了SOTA水平,但没有计算全部像素的attention方法准确率高。
OCNet
自注意力小结
自注意力机制作为一个有效的对上下文进行建模的方式,在很多视觉任务上都取得了不错的效果。同时,这种建模方式的缺点也是显而易见的,一是没有考虑channel上信息,二是计算复杂度仍然很大。相应的改进策,一方面是如何进行spatial和channel上信息的有效结合,另外一方面是如何进行捕捉信息的稀疏化,关于稀疏的好处是可以更加鲁棒的同时保持着更小的计算量和显存。最后,图卷积作为最近几年很火热的研究方向,如何联系自注意力机制和图卷积,以及自注意力机制的更加深层的理解都是未来的很重要的方向。
内容中包含的图片若涉及版权问题,请及时与我们联系删除
评论
沙发等你来抢