我们知道视频和图片的区别无非是多了时间的维度(time,视频的帧)。最直觉的做法是先用cnn,再用擅长时间序列的rnn;或者,直接用3D卷积去做。而实际情况是直接用3D卷积效果不是最好,于是有人用两个cnn去做(一个cnn分析时间,一个cnn分析空间),或者另外用一个分析轨迹(trajectories)的模块去加强时空感。
而非局部(non-local) 模块把非局部感受野的信息提取操作做成一个神经网络模块,方便了端到端的视频分析:
这个模块输入x可以理解为32帧的视频(32张图片帧数 T=32,长宽为H×W),输出z也是H×W大小的特征图。有没有注意到最左端的箭头是一个跳层连接?没错,non-local模块就是把视频额外的时空信息提取作为一个残差操作,这样整个模块可以任意插入到一个残差网络resnet中:
事实上,残差信息就是要学习一些额外的信息,下面画出红线的就是学习残差信息的部分:
上述non-local模块是依据下面公式给出的:
之所以叫做non-local模块,是对比卷积操作的局部感受野而言的,其中xi,xj 可以理解为不同帧i和j 的两张图片:
我们要知道这段视频是一个“踢球”的Action,我们对每一帧分析时要知道两个点:
关键点1. 与这一帧的关联性比较高的其他帧是哪些?上式中关联度的标量计算由f 函数给出:
f 函数度量两和位置之间的相关度,用高斯函数或点乘等操作都可以达到计算的效果,文章也指出,用各种方式计算,其实差别并不大:
关键点2. 这些关联性比较高的帧,可能在做什么是什么Action?这就需要上式的g 函数计算得到在xj 处的图像特征。其实仔细一开始的模块图,就可以发现其实这里的函数 g,超参数θ和Φ 都是用1×1的卷积去计算的。
注意到公式中j 是对每个位置的xj 都一一对比,所以该模块被称之为非局部(non-local)模块。
文章中的实验是基于ResNet-50 的卷积2D网络(C2D),数据集采用谷歌deepmind的Kinetics人体行为视频数据集。网络架构如下:
输入视频为32×224×224(32帧,长宽为224×224)。其中大的方括号中是一个残差块(Residual blocks),“×3”代表3个残差块组成的res2阶段的组。文章中称一组残差块为一个阶段(stage),如上图res2阶段有3个残差块,到了res3有4个残差块,而到了较后层的res4阶段,有6个残差块(不要以为阶段stage是训练的不同阶段。它其实是在网络的不同深度而已)。文章也指出把non-local模块放在不同阶段的位置,网络性能也有差异,最好不要放在最后res5那一层之后,因为到了res5之后的特征图空间已经比较小,学习不到太多空间关系了:
另外之前有人在知乎上说较长的视频可能效果就不好,但是文章的实验结果似乎在128帧的视频上预测效果还是比较好的:
最后看一下总体实验结果和在res3阶段后加non-local模块计算的效果:
参考文献:
- Non-local Neural Networks
- https://github.com/facebookresearch/video-nonlocal-net
- https://github.com/titu1994/keras-non-local-nets
- https://www.zhihu.com/question/68473183
- https://arxiv.org/pdf/1705.06950.pdf
- https://deepmind.com/research/open-source/open-source-datasets/kinetics/
- some accepted papers in cvpr 2018
- https://medium.com/mlreview/a-guide-to-receptive-field-arithmetic-for-convolutional-neural-networks-e0f514068807
- https://zhuanlan.zhihu.com/p/33345791