视频理解开山之作——双流卷积网络

  结合部分博客,和李沐老师的课程,总结一下自己理解的双流卷积网络。

为什么要有双流网络?

  视频理解的一大难题是,不同帧之间的内容是相互关联的,因此我们需要学习到不同帧之间的关联信息。直觉做法是丢入全部图片进入网络,让网络自己学习图片信息和图片间的关联信息。但是这样效果不好,因为网络很难学到这么多信息。因此我们有个主意,能不能用两个网络,一个网络学习图片信息,另一个网络学习时序信息。然后将这两个网络汇总起来判断。

双流模型结构

在这里插入图片描述
  如上图所示,模型分为两部分,spatial stream部分以单帧图片作为输入,temporal stream 部分以多帧图像的的光流作为输入,两部分在经过softmax后进行late fusion。论文提出了两种融合方法,一种是采用平均的方式,另一种是训练一个多分类的SVM分类器,SVM分类器采用L2-Softmax作为输入。

光流是什么?

  光流是通过对两张图进行梯度计算得到,抽象层面可以理解成是其关键点的像素点信息移动的信息; 光流图是选择视频中的任意一帧的时间然后及其后面的N帧叠合成一个光流栈进入训练。
在这里插入图片描述
  论文中采用L+1帧图像进行光流计算(这些都是在模型开始之前就计算好了的),得到2L(每2帧图像可得到一个x方向和y方向的光流)帧,这2L帧的顺序是2k-1为x方向,2k为y方向。(论文对L的取值进行了对比实验,发现取10比较好)。
  通俗点解释就是,每两个相邻帧就有一个光流图,三个相邻帧就是两个光流图,那么5个相邻帧就是4个光流图,N+1个相邻帧就有N个光流图。然后每个光流图可以拆分为X方向和Y方向,于是就有了2N个图,经过实测,发现N取10比较好。

光流的配置?

(1)光流堆叠:
  密集光流可以描述为连续的多个的相邻两帧的位移矢量场的集合,将矢量场分解为水平垂直两个方向成分,并将其作为两个通道的特征,为了表示一系列的帧间运动,本文堆叠了L帧的相邻帧的位移场组成2L通道的输入特征。(为什么叫密集光流?因为一幅图中每个像素点都会发生位移变化,就很密集,dense)
(2)运动轨迹堆叠:
  光流堆叠形式的输入只是描述了下一帧相对于上一帧的某一个固定点(u,v)的位移矢量,而轨迹堆叠描述的是上一帧的点位移之后的下一帧的点的位移矢量,多帧之间以此类推。
在这里插入图片描述
  总结一下是什么意思: 光流堆叠就是简单粗暴的将2N张光流直接堆叠在一起丢进网络中,是每一张光流图中像素点的变化。运动轨迹堆叠是上一帧的点运动到某个位置后,下一帧从该位置继续运动,是轨迹的变化,所以肯定是运动轨迹堆叠法更合理一些(不过可惜在该论文中没能取得很好的效果,在之后的工作中,运动轨迹堆叠取得了很好的效果)。

光流的应用技巧?

(1)双向光流
  在正向光流的基础上,添加一反向的帧间位移场集合。
  比如说我们从A点投球到B点,反过来从B点投球到A点也是成立的。 因此本文采用的方法是在连续的L帧视频帧间构建光流表示,前L/2帧使用前向光流,后L/2使用反向光流。如此堆叠仍是一2L通道特征表示。这种bi-direction思路在bert、ViT等nlp、cv领域也有应用。

(2)减平均光流(0中心化)
  目的:为了缓解相机移动造成的干扰(我们希望的是相机不动,人动,但是实际上相机可能会抖动,这样我们用光流减去全局均值)。
  普遍认为,对网络的输入采用0中心化可以使得模型更好地使用矫正非线性,当然就跨越大量运动而言,本模型的光流可以表现为正值与负值,自然地0中心的,即运动方向在正反方向的概率是等同的。
  由于两帧之间的光流是包含着相机运动位移的,在论文[10,26]中,强调了相机全局运动的重要性,故需要估计相机的运动并将其从光流中减除,而在本文,采用将光流减去均值的方法,进而缓解相机运动的影响。

多任务训练

  数据集太少会导致过拟合,为了避免这种情况,论文设置了两个softmax Layer,一个用在UCF-101上,另一个在HMDB-51,它们有各自的loss函数,两者求和作为训练的loss。

参考博客:https://blog.csdn.net/weixin_41041772/article/details/84652164
     https://www.cnblogs.com/wxkang/p/13782296.html

猜你喜欢

转载自blog.csdn.net/gailj/article/details/123797614