锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

视觉注意力机制(下)

时间:2023-06-05 04:37:00 gsop光电传感器

简介

在最后一篇文章中,我介绍了一些视觉注意机制的新作品,包括 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}} XRH×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 :XU~RH×W×C X → U ^ ∈ R H × W × C \mathbf{X} \rightarrow \widehat{\mathbf{U}} \in \mathbb{R}^{H \times W \times C} XU 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} sRC,计算式如下。

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×W1i=1Hj=1WUc(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} WRd×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} (HW)2减少为 ( H ∗ W ) ∗ ( H + W − 1 ) (H * W) *(H+W-1) (H元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章