Non-Local neural networks 的理解与实现

date
Sep 29, 2022
Last edited time
Mar 27, 2023 08:46 AM
status
Published
slug
Non-Local_neural_networks的理解与实现
tags
DL
CV
summary
type
Post
Field
Plat

1. Non-local

Non-Local 是王小龙在 CVPR2018 年提出的一个自注意力模型。Non-Local NN 和 Non-Local Means 非局部均值去噪滤波有点相似的感觉。普通的滤波都是 3×3 的卷积核,然后在整个图片上进行移动,处理的是 3×3 局部的信息。Non-Local Means 操作则是结合了一个比较大的搜索范围,并进行加权。详见:https://blog.csdn.net/qianhen123/article/details/81043217
在 Non-Local NN 这篇文章中的 Local 也与以上有一定关系,主要是针对感受野来说的,一般的卷积的感受野都是 3×3 或 5×5 的大小,而使用 Non-Local 可以让感受野很大,而不是局限于一个局部领域。
与之前介绍的 CBAM 模块,SE 模块,BAM 模块,SK 模块类似,Non-Local 也是一个易于集成的模块,针对一个 feature map 进行信息的 refine, 也是一种比较好的 attention 机制的实现。不过相比前几种 attention 模块,Non-Local 中的 attention 拥有更多地理论支撑,稍微有点晦涩难懂。
Non-local 的通用公式表示:
  • 是输入信号,cv 中使用的一般是 feature map
  • 代表的是输出位置,如空间、时间或者时空的索引,他的响应应该对 进行枚举然后计算得到的
  • 函数式计算 的相似度
  • 函数计算 feature map 在 位置的表示
  • 最终的 是通过响应因子 进行标准化处理以后得到的
理解:与 Non local mean 相比,就很容易理解, 代表的是当前位置的响应, 代表全局响应,通过加权得到一个非局部的响应值。
Non-Local 的优点是什么?
  • 提出的 non-local operations 通过计算任意两个位置之间的交互直接捕捉远程依赖,而不用局限于相邻点,其相当于构造了一个和特征图谱尺寸一样大的卷积核, 从而可以维持更多信息。
  • non-local 可以作为一个组件,和其它网络结构结合,经过作者实验,证明了其可以应用于图像分类、目标检测、目标分割、姿态识别等视觉任务中,并且效果不错。
  • Non-local 在视频分类上效果很好,倾向于使用在视频分类这个领域中。

2. 细节

给了通用公式,然后分别介绍 函数和 函数的实例化表示:
函数:可以看做一个线性转化(Linear Embedding)公式如下:
是需要学习的权重矩阵,可以通过空间上的 卷积实现(实现起来比较简单)。
函数:这是一个用于计算 相似度的函数,作者提出了四个具体的函数可以用作 函数。
  • Gaussian function: 具体公式如下:
这里使用的是 一个点乘来计算相似度,之所以点积可以衡量相似度,这是通过余弦相似度简化而来的。
  • Embedded Gaussian: 具体公式如下:
  • Dot product: 具体公式如下:
  • Concatenation: 具体公式如下:
以上四个函数可能看起来感觉让人读起来很吃力,下边进行大概解释一下上边符号的意义, 结合示意图(以 Embeded Gaussian 为例,对原图进行细节上加工,具体参见代码,地址为 Github 中的 non_local_embedded_gaussian.py 文件):
notion image
  • 代表 feature map, 代表的是当前关注位置的信息; 代表的是全局信息。
  • 代表的是 , 实际操作是用一个 卷积进行学习的
  • 代表的是 , 实际操作是用一个 卷积进行学习的
  • 同理
  • 代表的是归一化操作,在 embedding gaussian 中使用的是 Sigmoid 实现的。
然后可以将上图 (实现角度) 与下图 (比较抽象) 进行结合理解:
notion image
具体解释如下:(ps: 以下解释带上了 bs,上图中由于 bs 不方便画图,所以没有添加 bs)
X 是一个 feature map, 形状为 [bs, c, h, w], 经过三个 1×1 卷积核,将通道缩减为原来一半(c/2)。然后将 h,w 两个维度进行 flatten,变为 h×w,最终形状为[bs, c/2, h×w] 的 tensor。对θ对应的 tensor 进行通道重排,在线性代数中也就是转置,得到形状为 [bs, h×w, c/2]。然后与φ代表的 tensor 进行矩阵乘法,得到一个形状为[bs, h×w,h×w] 的矩阵,这个矩阵计算的是相似度(或者理解为 attention)。然后经过 softmax 进行归一化,然后将该得到的矩阵 fc 与 g 经过 flatten 和转置的结果进行矩阵相乘,得到的形状为 [bs, h*w, c/2] 的结果 y。然后转置为 [bs, c/2, h×w] 的 tensor, 然后将 h×w 维度重新伸展为 [h, w],从而得到了形状为[bs, c/2, h, w] 的 tensor。然后对这个 tensor 再使用一个 1×1 卷积核,将通道扩展为原来的 c,这样得到了 [bs, c, h, w] 的 tensor, 与初始 X 的形状是一致的。最终一步操作是将 X 与得到的 tensor 进行相加(类似 resnet 中的 residual block)。
可能存在的问题
计算量偏大:在高阶语义层引入 non local layer, 也可以在具体实现的过程中添加 pooling 层来进一步减少计算量。

3. 代码

代码来自官方,修改了一点点以便于理解,推荐将代码的 forward 部分与上图进行对照理解。

4. 实验结论

  • 文中提出了四个计算相似度的模型,实验对四个方法都进行了实验,发现了这四个模型效果相差并不大,于是有一个结论:使用 non-local 对 baseline 结果是有提升的,但是不同相似度计算方法之间差距并不大,所以可以采用其中一个做实验即可,文中用 embedding gaussian 作为默认的相似度计算方法。
  • 作者做了一系列消融实验来证明 non local NN 的有效性:
使用四个相似度计算模型,发现影响不大,但是都比 baseline 效果好。
 
notion image
 

以 ResNet50 为例,测试加在不同 stage 下的结果。可以看出在 res2,3,4 部分得到的结果相对 baseline 提升比较大,但是 res5 就一般了,这有可能是由于第 5 个 stage 中的 feature map 的 spatial size 比较小,信息比较少,所以提升比较小。
 
notion image

尝试添加不同数量的 non local block , 结果如下。可以发现,添加越多的 non local 模块,其效果越好,但是与此同时带来的计算量也会比较大,所以要对速度和精度进行权衡。
 
notion image

Non-local 与 3D 卷积的对比,发现要比 3D 卷积计算量小的情况下,准确率有较为可观的提升。
notion image
  1. 作者还将 Non-local block 应用在目标检测、实例分割、关键点检测等领域。可以将 non-local block 作为一个 trick 添加到目标检测、实例分割、关键点检测等领域, 可能带来 1-3% 的提升。
notion image

5. 评价

Non local NN 从传统方法 Non local means 中获得灵感,然后接着在神经网络中应用了这个思想,直接融合了全局的信息,而不仅仅是通过堆叠多个卷积层获得较为全局的信息。这样可以为后边的层带来更为丰富的语义信息。
论文中也通过消融实验,完全证明了该模块在视频分类,目标检测,实例分割、关键点检测等领域的有效性,但是其中并没有给出其带来的参数量上的变化,或者计算速度的变化。但是可以猜得到,参数量的增加还是有一定的,如果对速度有要求的实验可能要进行速度和精度上的权衡,不能盲目添加 non local block。神经网络中还有一个常见的操作也是利用的全局信息,那就是 Linear 层,全连接层将 feature map 上每一个点的信息都进行了融合,Linear 可以看做一种特殊的 Non local 操作。

6. 参考内容


© Lazurite 2021 - 2024