赞
踩
点击上方“AI算法修炼营”,选择加星标或“置顶”
标题以下,全是干货
前面的文章中,我们关注了Non-local网络模块、视觉注意力机制在分类网络中的应用——SENet、SKNet、CBAM等、Non-local模块和SENet模块CBAM模块融合——GCNet、DANet。他们在注意力机制中以自注意力机制为基础延伸出来的模块,本节中,我们将主要介绍针对Non-local网络模块结构的更改——“阡陌交通”CCNet和非对称 Non-local 结构ANN。
前面的文章有详细讨论Non-local模块,Non-local Network(NLNet)使用自注意力机制来建模远程依赖。对于每个查询点(query position),NLNet 首先计算查询点与所有点之间的成对关系以得到注意力图,然后通过加权和的方式聚合所有点的特征,从而得到与此查询点相关的全局特征,最终再分别将全局特征加到每个查询点的特征中,完成远程依赖的建模过程。
但是,NLNet存在着计算量大的问题,并且non-local network的全局上下文在不同位置几乎是相同的,这表明学习到了无位置依赖的全局上下文。
Non Local在学术界的火热在于其确实能显著地改进效果。但根据笔者在工业界的实际使用来看,巨大的计算开销使得Non Local很难在实际工程项目中落地。因此,如何减小其计算开销是一个非常值得研究的话题。CCNet,ANN在内的许多算法都在尝试解决这个问题,而且其中许多在效果上超越了原版Non Local,笔者认为这是一个很好的发展趋势。
下面,将详细介绍CCNet和ANN。
论文地址:https://arxiv.org/abs/1811.11721
代码地址:https://github.com/speedinghzl/CCNet
CCNet最主要的工作就是重复十字交叉注意力模块 ( Recurrent Criss Cross Attention Moudle, 简称RCCA),该模块通过计算目标特征像素点与特征图中其它所有点之间的相互关系,并用这样的相互关系对目标像素点的特征进行加权,以此获得更加有效的目标特征。
最后实验得出:1) 本文的RCCA模块的GPU资源消耗只有Non Local 模块的1/11; 2) 相较于 Non Local 模块减少了85%的浮点计算量; 3) 语义分割和实例分割任务中,与现有的诸多模型进行对比,其中在 Cityscapes 和 ADEK20K 运行语义分割任务,获得了 SOTA 的结果,在 COCO 数据集中运行实例分割任务,也获得了不错的效果。
又想获得密集的上下文信息,保持长距离的空间依赖性,又不想引入巨大的计算量,到底有没有这种好事呢?
CCNet使用了两个 CCA 模块( 即RCCA )代替 Non Local 操作,在同样获得了密集上下文信息,保持长距离空间依赖性的同时,将时间复杂度和空间复杂度降低为. Non Local 和 CCA 的对比图如下:
上图中的左边的蓝色的点是当前的像素点,这两个模块的目的是为了获取该像素点下拥有丰富语义的表示,也就是最右面红色的点。关于Non-local模型中需要计算出一个(H*W)*c的矩阵,里面的每个数表示的是每个像素与当前的像素至今的相关性分数,最终将这个矩阵中的数与之前的蓝色表示相乘并累加最终得到一个语义丰富的像素点特征表示。而在十字交叉注意力模块中只需要计算每个像素点所在的行与列中的像素点之间的关系因此只需要计算(H+W-1)*c的矩阵就可以了,但是为什么要采用两次十字交叉注意力机制,后面在介绍。从这里出发可以看处十字交叉注意力模块大大减小了模块的计算复杂度。
十字交叉注意力(CCA)模块原理
循环十字交叉注意力(RCCA) 模块其实就是两个 CCA 模块串联而成。循环十字交叉注意力 作为一个独立的模块,输入和输出的尺寸一致,理论上可以嵌入在网络中的任意位置。实际应用中可以根据需要,结合具体的硬件条件,进行嵌入,是本文在进行分割任务时,嵌入 循环十字交叉注意力(RCCA) 模块后的模型示意图:
其中原始图像经过一个 CNN 基础网络,生成一个名为 X 的特征图,令其尺寸为,经过一个1*1卷积对X进行降维,获得特征图H,其尺寸为,以此减少后续RCCA模块的计算量。其中CCA模块的具体结构如下:
H 经过三个 1*1 卷积层,分别生成特征 Q,K 以及 V,其中 Q,K 尺寸均为,为了对通道进行降维,减少计算量,使得 小于 C ; V 的尺寸保持不变,仍然为 ; 三个基础特征图准备好了以后,就可以开始 CCA 操作了:
1) Affinity操作
这个操作的目的是为了获取大小为 的特征图中每一个像素点与其同行同列像素点的关系 ( 注意:这个操作获取的相互关系只跟位置有关,跟通道无关,下面会说明 ),具体操作如下图:
其中 表示特征图 Q 中位置 μ 处的特征向量, . 表示特征图 中位置 iμ 处的特征向量,, . 现在对将 与 分别向量相乘,组成一个维度为 W+H-1 的新向量,对 Q 中的每个位置都进行这样的操作,即可以获得一个新的特征图,该特征图的尺寸为 , 记为D.
2) 对D进行softmax操作
现需要对 D 进行 softmax 操作,由上知,D的尺寸为 ,即对W+H-1 维度的特征向量进行 softmax . 上面说了,D 记录的是特征图中每个像素点与同行同列像素之间的关系,softmax 操作的目的是对这样的位置关系进行归一化,使得每个位置的贡献度更明了,好理解。
3) Aggregation 操作
如上,已经获取了位置间的相互关系,现即可生成一个新的通过位置关系加权的特征图。论文中写的感觉不是很好理解,稍加转换后进行说明,具体操作方式见下图:
其中涉及 A, V, H 三个特征图的运算, 表示特征图A中位置μ处的特征向量, . 表示特征图第i层 ( ) 中位置 μ 与其同行同列像素组成的特征向量, , . 表示特征图 H 中位置 μ 处的特征向量, . 现在对 与 向量相乘再与 ( ) 相加,每个层都进行这样的操作,组成一个维度为C的新向量,再对每个位置都进行这样的操作,即可以获得一个新的特征图,该特征图的尺寸为 , 记为 .
如上三个步骤执行完,即完成一个十字交叉注意力(CCA)运算。
为什么要用循环十字交叉注意力(RCCA)?
经过上面的运算,已经可以捕捉到垂直方向和水平方向长连接的上下文信息,但是这与我们想要的像素级别的密集程度相比,现在还稍显稀疏,针对这种情况,CCNet指出,只要紧接着 CCA 模块串联着再做一次就可以获得丰富的上下文信息。但是为什么只要再串联一个就可以了呢?文中也给了解释,下面我们可以分析一下。
结合前面的叙述, 分别代表 CCA1 和 CCA2 中获得的相互关系映射图 ( attention maps ) , 因为我们只关心空间维度的上下文信息不关注通道维度的上下文信息,所以 1*1 的卷积可以认为直接相连就好 。
令 , 为特征图中的任意位置,则 表示计算 与 相互关系的权重。令 μ 是经过两轮CCA的特征图 上的任意位置, 是原始特征图 上的任意位置,当 μ 和 不在同行或者同列时, 可以通过下面公式映射成 :
示意图如下:
当 μ 和 在同行或者同列时,文中给的关系是:
读过文章后,感觉应该是:
这样比较符合逻辑。
以上就是CCNet的主要创新点,感觉类似于 Inception 中将 n*n 卷积拆分成 n*1 和1*n ,以降低计算量的意思。简洁的说,就是criss-cross attention module 获得上下文信息;循环操作, 每一个像素可以获得全图信息。
论文地址: https://arxiv.org/pdf/1908.07678.pdf
代码地址: https://github.com/MendelXu/ANN
Non-local模块作为语义分割任务中很有用的技术,但是由于其巨大的计算量个内存占用被诟病。因此如何设计一种计算量小并且内存占用不大的non-local模块称为现今的一个难题。
为了解决上述问题作者提出了一种非对称non-local网络结果来代替传统的non-local模型的作用,但是其计算复杂度与内存占用会大大减少。首先作者通过下图介绍了一下传统的non-local模型与非对称non-local模型。
上图中左边的结构是传统的non-local模型,首先根据Query与Key的特征图得到一个大小为N*N大小的相关性矩阵,最后将这个相关性矩阵与Value特征进行点乘得到最终的non-local模块的输出。图中的N=H*W,所以该模型的计算复杂度为 。
右侧的结构与传统的non-local模型有些不一样,首先对Key和Value的特征采用Sample操作将原始的N*C的矩阵进行了进一步的特征抽取,从而得到了C*S的特征矩阵,其中S<<N,所以该模型就大大减小了计算复和内存消耗。
具体来说:
Non-local的计算复杂度主要来自第2步和第4步:
Intuitive Observation:将N减小为S,不会改变输出的size。
但是由于作者将传统的non-local模型中的N经过Sample操作之后变成了较小的S,这样就不能捕捉到每个像素点之间的相关性信息,可能会造成效果不是很好,为了使模型性能进一步的提升,作者又在考虑长依赖性的情况下融合不同级别下的特征。
作者提出的非对称non-local网络的框架如下图所示:
非对称non-local网络含有两个主要的模块,其中一个是Asymmetric Pyramid Non-local Block(APNB)和Asymmetric Fusion Non-local Block(AFNB),下面将通过从左向右的方式讲解这个模型。
Asymmetric Fusion Non-local Block(AFNB)
在语义分割中,将不同层次的特征连接起来是一个非常常见且有效的操作。这个模块则是利用Non Local机制来连接特征,在具体操作时,该模块同样使用了金字塔结构来节省计算。
ANN网络结构首先作者采用ResNet-101网络作为模型的backbone,并且作者去掉了原模型中最后的两个下采样层,并使用扩张卷积来保持最后两个阶段得到的特征分辨率是原图像的1/8。作者将stage4和stage5的输出用AFNB模块进行融合,作者将Stage5得到的特征称之为高级特征,将stage4得到的特征称为低级特征,将这两个特征输入AFNB模块进行融合,其具体的过程如下图:
该模块将stage5产生的高级特征作为Query,将stage4得到的低级特征作为Key和Value,首先对Query,Key和Value分别使用1*1的卷积核进行降维,根据非对称non-local网络的特征需要进行Pyramid Pooling操作,来对Key和Value进行进一步的特征抽取。从而得到较小的特征表示。
Pyramid Pooling操作的具体过程如下图所示:该过程是针对输入的特征图进行多个池化操作,上图中现实的是Pooling1是要得到一个1*1的特征表示,然后在根据多个池化操作分别得到3*3、6*6和8*8的矩阵,然后将这些矩阵进行展开操作将其变成一个向量。得到的特征矩阵的大小是自己设定的。4种不同尺度的池化操作:{1,3,6,8},采样的锚点数量=110(作者认为,S不能太小)。
经过Pyramid Pooling操作后原本C*N大小的特征变成了大小为C*S的特征矩阵,然后计算Query和Key的相关性矩阵计算,就是将Query转置后与Key相乘最终得到一个N*S的相关性矩阵,最后将这个相关性矩阵与Value特征进行转置相乘最终得到了不同level下特征的融合表示 ,最后将这个表示与Stage5输出的特征拼接后得到原始图像最新的特征表示 。
Asymmetric Pyramid Non-local Block(APNB)
这个模块的整体结构与普通的Non Local模块相似。区别在于,普通的Non Local机制直接使用被处理的特征图进行计算,而该算法则使用了一个下采样的过程。对输入的特征图,算法利用PSPNet中的金字塔池化结构,从不同的尺度对特征进行平均池化,随后将金字塔的每一部分获得的特征连接起来,以此代替普通Non Local中直接被处理的特征。这样的操作一方面降低了计算量,另一方面金字塔本身也提取了丰富的多层次特征。
针对得到的最新的特征表示进行非对称金字塔non-local模块,其目的与self-attention的目的是相似的,但是其过程是不相同的。其具体的流程如下图所示:
其过程是对YF使用两次1*1的卷积操作,得到non-local模块中的Query、Key和Value。为了减少计算量,这里将Key=Value,所以针对Key和Value只用进行一次Pyramid Pooling操作,就得到了新的特征表示,其他的过程与AFNB的过程相同,都是根据Query和Key计算出相关性矩阵,然后将相关性矩阵与Value的特征转置相乘得到最终的特征,再将这个特征与YF拼接,得到作者较为满意的图像特征表示,最后再采用双线性插值的方法将特征分辨率还原,从而得到了分割结果。
亮点:
与Non-local 不同的是:Non-local:每个点(query)与每个点之间的相关;pixel-wise;APNB:每个点与局部内容之间的关系;patch-wise
融合不同level的的特征:AFNB
参考:
1.https://zhuanlan.zhihu.com/p/51393573
2.https://blog.csdn.net/gefeng1209/article/details/103241399
3.https://zhuanlan.zhihu.com/p/80716996
4.https://blog.csdn.net/Hi_maxin/article/details/89460746
推荐阅读
目标检测系列
语义分割系列
面试求职系列
一起学C++系列
竞赛与工程项目分享系列
SLAM系列
视觉注意力机制系列
-END-
扫描个人微信号,
拉你进AI算法修炼营学习交友群。
目标检测、图像分割、自动驾驶、机器人、面试经验
福利满满,名额已不多…
▲长按关注我们
觉得好看对你有帮助,就点个在看吧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。