论文:《Non-local Neural Networks》

代码:https://github.com/facebookresearch/video-nonlocal-net

卷积操作只关注于局部的感受野,是典型的local operation,如果要增大神经元的感受野,一般是堆叠卷积层和池化层来实现,但是这样计算量和复杂度都会增加,并且feature map的尺寸会较小。为了突破,作者借鉴图像去噪这个领域的non-local操作,提出了non-local neural network,用来捕捉长距离像素之间的信息,最终实现每个像素的全局感受野。并且通过不同的操作,还可以得到不同空间、时间、通道的像素之间的信息相关性。

定义

convolution是对局部区域进行的操作,所以是典型的local operations,本文中,提出一种non-local操作来捕获长距离的依赖(long-range dependencies)即如何建立图像上两个有一定距离的像素之间的联系,如何建立视频里两帧的联系,如何建立一段话中不同词的联系等。 

non-local operations在计算某个位置的响应时,是考虑所有位置features的加权——所有位置可以是空间的,时间的,时空的。这个结构可以被插入到很多计算机视觉结构中。(就是在提取某处特征时利用其周围点的信息,这个“周围”既可以是时间维度的,也可以是空间维度的。时间维度的话就如这篇文章中的视频分类例子一样,可以更好地利用时序上的信息。 )

按照非局部均值的定义,我们定义在深度神经网络中的non-local操作如下:

其中x表示输入信号(图片,序列,视频等,也可能是它们的features),y表示输出信号,其size和x相同。f(xi,xj)用来计算i和所有可能关联的位置j之间pairwise的关系,这个关系可以是比如i和j的位置距离越远,f值越小,表示j位置对i影响越小。g(xj)用于计算输入信号在j位置的特征值。C(x)是归一化参数。从上式中可以看出任意位置上的j,可以是时间的、空间的、时空的任意位置,都可以影响到i的输出值。作为对比,conv的操作是对一个局部邻域内的特征值进行加权求和,比如kernel size=3时,i−1≤j≤i+1。

另外作为对比,non-local的操作也和fc层不同。公式(1)计算的输出值受到输入值之间的关系的影响(因为要计算pairwise function),而fc则使用学习到的权重计算输入到输出的映射,在fc中xjxj和xixi的关系是不会影响到输出的,这一定程度上损失了位置的相关性。另外,non-local能够接受任意size的输入,并且得到的输出保持和输入size一致。而fc层则只能有固定大小的输入输出。non-local是一个很灵活的building block,它可以很容易地和conv层一起使用,它可以被插入到dnn的浅层位置,不像fc通常要在网络的最后使用。这使得我们可以通过结合non-local以及local的信息构造出更丰富的结构。
作者通过接讨论f和g的几种形式。有意思的是实验显示不同的表现形式其实对non-local的结果并没有太大影响,表明non-local这个行为才是主要的提升因素

non-local block

将上式中的non-local操作变形成一个non-local block,以便其可以被插入到已有的结构中。 定义一个non-local block为:

其中yi已经在(1)式中给出了,+xi则表示的是一个residual connection。residual connection的结构使得我们可以在任意的pretrain模型中插入一个新的non-local block而不需要改变其原有的结构。给出non-local block的示例

feature map size为temporal, h, w, size。 通过三个1x1卷积减少一半的通道后(有助于减少计算量)进行reshape,再进行embedded gaussian操作后得到feature map, 通过1x1的输出卷积层恢复通道数量后,最后进行跳连作为最终的输出。

 

参考资料

https://blog.csdn.net/elaine_bao/article/details/80821306

 

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐