简介

在上篇文章中,我介绍了视觉注意力机制一些比较新的作品,包括 A 2 A^2 A2-Nets、GSoP-Net、GCNet和ECA-Net,本篇文章主要介绍一些近年以来最新的成果,包括SKNet、CCNet、ResNeSt和Triplet Attention。

本系列包括的所有文章如下,分为上中下三篇,本文是中篇。

  1. NL(Non-local Neural Networks)
  2. SENet(Squeeze-and-Excitation Networks)
  3. CBAM(Convolutional Block Attention Module)
  4. BAM(Bottleneck Attention Module)
  5. A 2 \mathbf{A^2} A2-Nets(Double Attention Networks)
  6. GSoP-Net(Global Second-order Pooling Convolutional Networks)
  7. GCNet(Non-local Networks Meet Squeeze-Excitation Networks and Beyond)
  8. ECA-Net(Efficient Channel Attention for Deep Convolutional Neural Networks)
  9. SKNet(Selective Kernel Networks)
  10. CCNet(Criss-Cross Attention for Semantic Segmentation)
  11. ResNeSt(ResNeSt: Split-Attention Networks)
  12. Triplet Attention(Convolutional Triplet Attention Module)

回顾

我们首先还是来回顾一下卷积神经网络中常用的注意力,主要有两种,即空间注意力和通道注意力,当然也有融合两者的混合注意力画了个示意图如下。

我们知道,卷积神经网络输出的是维度为 C × H × W C\times H \times W C×H×W的特征图,其中 C C C指的是通道数,它等于作用与输入的卷积核数目,每个卷积核代表提取一种特征,所以每个通道代表一种特征构成的矩阵。 H × W H \times W H×W这两个维度很好理解,这是一个平面,里面的每个值代表一个位置的信息,尽管经过下采样这个位置已经不是原始输入图像的像素位置了,但是依然是一种位置信息。如果,对每个通道的所有位置的值都乘上一个权重值,那么总共需要 C C C个值,构成的就是一个 C C C维向量,将这个 C C C维向量作用于特征图的通道维度,这就叫通道注意力。同样的,如果我学习一个 H × W H\times W H×W的权重矩阵,这个矩阵每一个元素作用于特征图上所有通道的对应位置元素进行乘法,不就相当于对空间位置加权了吗,这就叫做空间注意力

上篇文章介绍的GCNet是一种空间注意力机制,而ECA-Net是典型的通道注意力。

网络详解

SKNet

SENet 设计了 SE 模块来提升模型对 channel 特征的敏感性,CVPR2019 的 SKNet 和 SENet 非常相似,它主要是为了提升模型对感受野的自适应能力,这种自适应能力类似 SENet 对各个通道做类似 attention,只不过是对不同尺度的卷积分支做了这种 attention。

上图就是SK卷积的一个基础实现,为了方便描述,作者只采用了两个分支,事实上可以按需增加分支,原理是一样的。可以看到,从左往右分别是三个part:Split、Fuse和Select,下面我就一步步来解释这三个操作是如何获得自适应感受野信息的,解释是完全对照上面这个图来的。

Split:对给定的特征图 X ∈ R H ′ × W ′ × C ′ \mathbf{X} \in \mathbb{R}^{H^{\prime} \times W^{\prime} \times C^{\prime}} X∈RH′×W′×C′,对其采用两种卷积变换 F ~ : X → U ~ ∈ R H × W × C \widetilde{\mathcal{F}}: \mathbf{X} \rightarrow \tilde{\mathbf{U}} \in \mathbb{R}^{H \times W \times C} F :X→U~∈RH×W×C和 X → U ^ ∈ R H × W × C \mathbf{X} \rightarrow \widehat{\mathbf{U}} \in \mathbb{R}^{H \times W \times C} X→U ∈RH×W×C,它们只有卷积核size不同(这里以3和5为例),其余配置一致(卷积采用深度可分离卷积,5x5卷积采用3x3卷进进行膨胀)。这一步,通过两个变换构建了两个感受野的分支,形成了两个特征图 U ~ \tilde{\mathbf{U}} U~和 U ^ \widehat{\mathbf{U}} U ,它们的维度都是 H × W × C H\times W \times C H×W×C。

Fuse:这一步也就是自适应感受野的核心,这里采用最简单的gates机制控制进入下一层的多尺度信息流。因此,这个gates需要集成来自所有分支的信息,还要有权重的集成。首先,通过逐元素相加获得特征图 U \mathbf{U} U( U = U ~ + U ^ \mathbf{U}=\tilde{\mathbf{U}}+\widehat{\mathbf{U}} U=U~+U ),然后采用SENet类似的思路,通过GAP生成逐通道的统计信息 s ∈ R C \mathbf{s} \in \mathbb{R}^{C} s∈RC,计算式如下。

s c = F g p ( U c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W U c ( i , j ) s_{c}=\mathcal{F}_{g p}\left(\mathbf{U}_{c}\right)=\frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} \mathbf{U}_{c}(i, j) sc​=Fgp​(Uc​)=H×W1​i=1∑H​j=1∑W​Uc​(i,j)

接着,为了更紧凑的表示,通过一个全连接层对 s \mathbf{s} s进行降维,获得 z = F f c ( s ) = δ ( B ( W s ) ) \mathbf{z}=\mathcal{F}_{f c}(\mathbf{s})=\delta(\mathcal{B}(\mathbf{W} \mathbf{s})) z=Ffc​(s)=δ(B(Ws)),这里先是和 W ∈ R d × C \mathbf{W} \in \mathbb{R}^{d \times C} W∈Rd×C相乘然后经过BN和ReLU, d d d作为一个超参使用下降比 r r r来控制,不过 d d d同时通过 d = max ⁡ ( C / r , L ) d=\max (C / r, L) d=max(C/r,L)约束下界( L L L设置为32)。接着,又一个全连接用于升维度,得到分支数个 C C C维向量,论文中这里就是 a a a和 b b b,然后按照通道维度进行soft attention,也就是说 a c + b c = 1 a_{c}+b_{c}=1 ac​+bc​=1,这样可以反映不同尺度的特征的重要性,然后用 a a a和 b b b采用类似SE的方式对原始特征图 U ~ \tilde{\mathbf{U}} U~和 U ^ \widehat{\mathbf{U}} U 进行逐通道相乘加权,得到有通道区分度的特征图,再相加到一起得到输出特征图 V \mathbf{V} V。这个特征图,就是自适应不同感受野获得的特征图。

SKNet是尺度层面的注意力,虽然其本质还是通道注意力,但这种自适应卷积核的思路确实为卷积神经网络带来了很大的性能提升,被一些新的论文采用了进去。

CCNet

CCNet,翻译应该是十字交叉注意力(Criss-Cross Attention),设计用于语义分割。这不是一篇新文章,2018年就出来了,收录于ICCV2019,后来扩充内容之后发表再TPAMI这个视觉顶级期刊上了。这篇文章主要针对的是Non-local进行改进的,Non-local主要用来捕获不同位置像素之间的长程依赖,具体解析我之前的文章已经提到了,这里就不多赘述。

熟悉Non-local的,上图应该不会陌生,图a表示的就是Non-local的操作,它对输入特征图进行了两个分支处理,其中一个分支计算注意力图,一个分支对特征图进行信息变换 g g g。图中的蓝色格子代表待处理像素位置 x i x_i xi​,红色格子代表结果 y i y_i yi​,绿色网格的分支代表求得的注意力图,每个格子(i,j)代表 x i x_i xi​和 x j x_j xj​之间的相关性,颜色越深,相关性越强。灰色网格的分支代表信息变换函数 g g g处理,将处理后的结果和上面分支得到的注意力图相乘,就得到注意力后的结果。

图b就是论文提出的CC注意力块,可以发现论文题目的由来,它只计算了当前像素周围十字区域位置与自己的相关性,但是我们需要知道所有像素和它的相关性,所以这个结构需要堆叠,实验表明,循环堆叠两层即可覆盖所有的位置,所以作者设计了循环CC注意力模块RCCA。

在具体讲解CC模块的细节之前,我们先来比较抽象地解释一下怎么样两次循环就覆盖整个像素空间的,作者做了一个严格的数学证明,我这里直观上解释一下。最极端的情况下, ( u x , u y ) (u_x, u_y) (ux​,uy​)想要计算自己和 ( θ x , θ y ) (\theta_x,\theta_y) (θx​,θy​)的相关性,但是第一轮循环的时候它是永远也不可能在 ( θ x , θ y ) (\theta_x,\theta_y) (θx​,θy​)的十字路径上的, ( θ x , θ y ) (\theta_x,\theta_y) (θx​,θy​)的信息最多传给了 ( u x , θ y ) (u_x, \theta_y) (ux​,θy​)这个左上角的点和 ( θ x , u y ) (\theta_x, u_y) (θx​,uy​)这个右上角的点。但是,第二轮循环的时候,这两个点就在 ( u x , u y ) (u_x,u_y) (ux​,uy​)的十字路径上了,且这两个点聚集了 ( θ x , θ y ) (\theta_x,\theta_y) (θx​,θy​)的信息,因此左下角和右上角间接交互上了。其他点也类似,可以将信息通过两次循环传递给左下角的点,由此,左下角其实遍历了所有的点。

CCA模块的设计使得Non-local的计算量从 ( H ∗ W ) 2 (H * W)^{2} (H∗W)2减少为 ( H ∗ W ) ∗ ( H + W − 1 ) (H * W) *(H+W-1) (H∗W)∗(H+W−1),计算效率相比于Non-local到15%,内存占用仅为1/11。下图就是该模块的具体实现,首先,输入特征图 H ∈ R C × W × H \mathbf{H} \in \mathbb{R}^{C \times W \times H} H∈RC×W×H经过两个1x1卷积得到通道降维的特征图 { Q , K } ∈ R C ′ × W × H \{\mathbf{Q}, \mathbf{K}\} \in \mathbb{R}^{C^{\prime} \times W \times H} {Q,K}∈RC′×W×H。

现在,按照设计我们需要得到一个注意力图 A ∈ R ( H + W − 1 ) × ( W × H ) \mathbf{A} \in \mathbb{R}^{(H+W-1) \times(W \times H)} A∈R(H+W−1)×(W×H)(每个位置,都有 H + W − 1 H+W-1 H+W−1个位置要计算相关性,原始的Non-local中,这里的特征图维度为 ( H ∗ W ) 2 (H * W)^{2} (H∗W)2),所以设计了一个下式表示的亲和度操作来获取注意力图。在 Q Q Q的空间维度上,每个位置 u \mathbf{u} u都有一个特征向量 Q u ∈ R C ′ \mathrm{Q}_{\mathrm{u}} \in \mathbb{R}^{C^{\prime}} Qu​∈RC′,同时,在 K \mathbf{K} K上选择和 u \mathbf{u} u同行同列的位置的特征向量,它们组成集合 Ω u ∈ R ( H + W − 1 ) × C ′ \Omega_{\mathrm{u}} \in \mathbb{R}^{(H+W-1) \times C^{\prime}} Ωu​∈R(H+W−1)×C′, Ω i , u ∈ R C ′ \boldsymbol{\Omega}_{i, \mathbf{u}} \in \mathbb{R}^{C^{\prime}} Ωi,u​∈RC′是 Ω u \Omega_{\mathrm{u}} Ωu​的第 i i i个元素。

d i , u = Q u Ω i , u ⊤ d_{i, \mathbf{u}}=\mathbf{Q}_{\mathbf{u}} \boldsymbol{\Omega}_{i, \mathbf{u}}^{\top} di,u​=Qu​Ωi,u⊤​

上式所示的亲和度操作中, d i , u ∈ D d_{i, \mathrm{u}} \in \mathbf{D} di,u​∈D表示 Q u \mathrm{Q}_{\mathrm{u}} Qu​和 Ω i , u , i = [ 1 , … , H + W − 1 ] \boldsymbol{\Omega}_{i, \mathbf{u}}, i=[1, \ldots, H+W-1] Ωi,u​,i=[1,…,H+W−1]之间的相关性程度,其中 D ∈ R ( H + W − 1 ) × ( W × H ) \mathbf{D} \in \mathbb{R}^{(H+W-1) \times(W \times H)} D∈R(H+W−1)×(W×H)。此时,对 D \mathbf{D} D沿着通道维度进行softmax就得到了注意力图 A \mathbf{A} A。

接着,对 V \mathbf{V} V进行类似的操作,在 V \mathbf{V} V的每个位置 u \mathbf{u} u都可以得到 V u ∈ R C \mathbf{V}_{\mathbf{u}} \in \mathbb{R}^{C} Vu​∈RC和 Φ u ∈ R ( H + W − 1 ) × C \boldsymbol{\Phi}_{\mathbf{u}} \in \mathbb{R}^{(H+W-1) \times C} Φu​∈R(H+W−1)×C,这个 Φ u \boldsymbol{\Phi}_{\mathbf{u}} Φu​同样是 V \mathbf{V} V中和 u \mathbf{u} u同行同列的所有位置的特征向量集合。

至此,上下文信息通过下面的式子聚合,得到一个CCA模块的输出,重复堆叠两次即可。

H u ′ = ∑ i = 0 H + W − 1 A i , u Φ i , u + H u \mathbf{H}_{\mathbf{u}}^{\prime}=\sum_{i=0}^{H+W-1} \mathbf{A}_{i, \mathbf{u}} \boldsymbol{\Phi}_{\mathbf{i}, \mathbf{u}}+\mathbf{H}_{\mathbf{u}} Hu′​=i=0∑H+W−1​Ai,u​Φi,u​+Hu​

此外,作者还设计了三维的CCA模块,这里我就不多赘述了。总之,CCNet通过独有的十字交叉注意力对Non-local进行了改进,并获得了更好的效果,在当时,是很有突破的成果。

ResNeSt

ResNeSt,又叫Split-Attention Networks(分割注意力网络),是今年争议比较多的一篇文章,文章的质量其实还是不错的。这篇文章是基于ResNeXt的一个工作,在ResNeXt中,其对深度和宽度外增加了一个维度—基数(cardinality),对同一个特征图采用不同的卷积核进行卷积,最后将结果融合。

上图是SE模块、SK模块以及文章提出的ResNeSt的模块设计图,其将输入特征图切分为多路(共 k k k路),每路的拓扑结构一致,又将每一路划分为 r r r个组,特征图再次被切分,每组的拓扑结构也是一样的。

在每一路中,每个组会对自己切分得到的通道数为 c ′ / k / r c'/k/r c′/k/r的特征图进行1x1卷积核3x3卷积,再将这一路的 r r r个结果送入一个分割注意力模块(Split Attention,SA)中,每个路将自己注意力后的结果concat到一起,再经过1x1卷积恢复维度后和原始输入相加。

现在,这个Split Attention如何实现的呢,如下图所示, r r r个输入逐元素求和后通过全局平均池化得到 r r r个 c c c维度的向量,经过全连接层学习到通道注意力向量,再和各自的输入做乘法进行通道注意力, r r r个通道注意力的结果,最后相加。

整体来看,每一路的处理都是一个SK卷积,所以ResNeSt其实是对ResNeXt、SENet和SKNet的结构的融合,但是融合并用好本身也是挺不错的工作了。

Triplet Attention

最后,聊聊最近的一个注意力成果,Triplet Attention。这篇文章的目标是研究如何在不涉及任何维数降低的情况下建立廉价但有效的通道注意力模型。Triplet Attention不像CBAM和SENet需要一定数量的可学习参数来建立通道间的依赖关系,它提出了一个几乎无参数的注意机制来建模通道注意力和空间注意力。

如上图,顾名思义,Triplet Attention由3个平行的分支组成,其中两个负责捕获通道C和空间H或W之间的跨维交互。最后一个分支类似于CBAM,用于构建空间注意力。最终3个分支的输出通过求和平均进行聚合。

首先,为了解决此前注意力方法通道注意力和空间注意力分离的问题,论文提出跨维交互这个概念,下图是Triplet Attention的概念图,通过旋转输入张量实现不同维度之间的交互捕获。

为了实现一个维度上关键信息的捕获,Z-pool通过取最大值和平均值并将其连接的方式,将任意维度特征调整为2维,这样既能保留丰富的表示又能降维减少计算量。这里之所以采用这个Z-pool降维而不是1x1卷积就是为了减少计算量。

Z -pool  ( χ ) = [ MaxPool ⁡ 0 d ( χ ) , AvgPool  0 d ( χ ) ] Z \text { -pool }(\chi)=\left[\operatorname{MaxPool}_{0 d}(\chi), \text { AvgPool }_{0 d}(\chi)\right] Z -pool (χ)=[MaxPool0d​(χ), AvgPool 0d​(χ)]

给定输入张量 χ ∈ R C × H × W \chi \in R^{C \times H \times W} χ∈RC×H×W,它被分配给三个分支进行处理。

首先,看Triplet Attention的第一个分支,其目的是对 H H H维度和 C C C维度之间建立交互。输入张量 χ \chi χ先沿着 H H H轴进行旋转90度,得到 χ ^ 1 ∈ R W × H × C \hat{\chi}_{1} \in R^{W \times H \times C} χ^​1​∈RW×H×C。这个 χ ^ \hat{\chi} χ^​先是通过Z-pool降维到 ( 2 × H × C ) (2 \times H \times C) (2×H×C)然后经过卷积和BN层,得到 ( 1 × H × C ) (1 \times H \times C) (1×H×C)的特征图再经过Sigmoid输出注意力图,这个注意力图和 χ ^ \hat{\chi} χ^​相乘,得到 H H H和 C C C的交互注意力结果。然后,再反转90度回去,得到和输入维度匹配的注意力图。

同样的,第二个分支类似,只是旋转方式的不同,因而得到的是 C C C和 W W W的交互注意力结果。其实,这个文章的创新之处就在这个旋转操作上,这个所谓的跨维度交互就是旋转后最后两个维度上的空间注意力而已。

最后,第三个分支其实一模一样,只是没有旋转,那自然捕获的就是原本的 H H H和 W W W的空间注意力了。然后,简单的求和平均就得到了最终的特征图了。

上面说的这些,也就是Triplet Attention的全部了。它抓住了张量中各个维度特征的重要性并使用了一种有效的注意力计算方法,不存在任何信息瓶颈。实验证明,Triplet Attention提高了ResNet和MobileNet等标准神经网络架构在图像分类和目标检测等任务性能,而只引入了最小的计算开销。是一个非常不错的即插即用的注意力模块。

总结

本文简单介绍了计算机视觉中几种最新的采用注意力机制的卷积神经网络,它们都是基于前人的成果进行优化,获得了相当亮眼的表现,值得借鉴。最后补充一个实战项目,我在ResNet50的基础上使用这三篇视觉注意力机制博文中提到的典型注意力模块进行拓展,在Caltech数据集上进行了实验,源码开源在我的Github,欢迎star或者fork。

视觉注意力机制(下)相关推荐

  1. 华为诺亚方舟加拿大实验室提出BANet,双向视觉注意力机制用于单目相机深度估计...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 这篇文章的作者是华为加拿大诺亚方舟实验室,是一篇将双向注意力机制用于弹幕深度估计的工作.主要的创新点在 ...

  2. 视觉注意力机制(中)

    简介 在上篇文章中,我介绍了视觉注意力机制比较早期的作品,包括Non-local.SENet.BAM和CBAM,本篇文章主要介绍一些后来的成果,包括A2A^2A2-Nets.GSoP-Net.GCNe ...

  3. .Net Discovery 系列之六--深入浅出.Net实时编译机制(下)

    接上文 在初始化时,HashTable中各个方法指向的并不是对应的内存入口地址,而是一个JIT预编译代理,这个函数负责将方法编译为本地代码.注意,这里JIT还没有进行编译,只是建立了方法表! 下表(表 ...

  4. 深度残差收缩网络:(四)注意力机制下的阈值设置

    对于基于深度学习的分类算法,其关键不仅在于提取与标签相关的目标信息,剔除无关的信息也是非常重要的,所以要在深度神经网络中引入软阈值化.阈值的自动设置,是深度残差收缩网络的核心贡献.需要注意的是,软阈值 ...

  5. 计算机视觉注意力机制-Attention

    注意力机制本质上与人类对外界事物的观察机制相似.通常来说,人们在观察外界事物的时候,首先会比较关注比较倾向于观察事物某些重要的局部信息,然后再把不同区域的信息组合起来,从而形成一个对被观察事物的整体印 ...

  6. 【每周CV论文推荐】初学视觉注意力机制有哪些值得阅读的论文?

    欢迎来到<每周CV论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 注意力机制是当下计算机视觉和自然语言处理中非 ...

  7. 1.综合能源系统优化运行(碳交易机制下考虑需求响应的综合能源系统优化运行)

    目录 复现文章: 主程序: 结果图 结论 私聊即可! 主要内容: 碳交易机制下考虑需求响应的综合能源系统优化运行--魏震波 摘要: 综合能源系统是实现"双碳"目标的有效途径,为进一 ...

  8. 碳交易机制下考虑需求响应的综合能源系统优化运行

    碳交易机制下考虑需求响应的综合能源系统优化运行 首先,根据负荷响应特性将需求响应分为价格型和替代型 2 类,分别建立了基于价格弹性矩阵的价格型需求响应模型,及考虑用能侧电能和热能相互转换的替代型需求响 ...

  9. 碳交易机制下考虑需求响应的综合能源系统优化运行论文复现——附代码

    目录 摘要: 一.区域综合能源系统(IEHS)的基本结构: 二.IEHS 优化运行模型: 三.求解方法: 四.求解结果: 五.Matlab复现代码 摘要: 综合能源系统是实现"双碳" ...

最新文章

  1. JVM:垃圾回收概述
  2. oracle删除表不等待,oracle故障处理之删除大表空间hang住
  3. 阿里巴巴人工智能实验室“黄”了
  4. “cannot resolve symbol R” in Android Studio
  5. Nginx 中 last、break、permanent、redirect
  6. 就业形势如此的严峻,你为何不努力?
  7. CSS3酷炫样式集合
  8. linux中死锁的概念,【Linux】死锁概念总结
  9. 30号晚直播丨数据操作加速器,CloudQuery v1.3.5 发布!
  10. python制作射击游戏_零基础用Python开发的第一个小游戏——太空射击
  11. 关于三角函数图像的思考
  12. WPF-TreeView遍历硬盘所有目录
  13. [2018.05.05 T2] 互质2
  14. 2017-12-24 手机编程环境初尝试-用AIDE开发Android应用
  15. 希尔密码 matlab,非数学专业线性代数教学设计
  16. 设置电脑屏保全屏显示时间,酷!
  17. 华师计算机考研英语过线,华师大学长:考研英语我是如何考到77分的!
  18. Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)
  19. java实现一个整数分解为两个质数乘积
  20. 调用C# System.Drawing 画图

热门文章

  1. 使用又拍云加速后的HTTPS访问和DNS设置
  2. 二进制运算——位移运算
  3. 论文写作的武功招式和内功心法
  4. 解决Windows无法打开exe文件的问题
  5. 漫谈互联网产品设计之人性的弱点
  6. angular.js自定义指令
  7. 网络编程 : 几种语言使用 Socket 实现 TCP
  8. OV7670带FIFO入坑指南
  9. 软件测试面试题:缺陷等级应如何划分?
  10. C++ 三角函数引用