论文 | 《Two-stream Convolution Networks for Action Recognition in Videos》文章及optical flow视频光流学习笔记

一 写在前面

未经允许,不得转载,谢谢~~~

这是一篇超级老也超级经典的文章了,2014年发表在NIPS上。在我之前的几篇视频识别的博客中也多次提到过这一篇two-stream结构。

整篇文章的思想和模型结构都很简单,之所以再拿出来完整地读一读是最近一门课程需要做个综述。

而且对于文章中的optical flow一直也只是闻其名,但没有真正学习过(/捂脸),所以也趁机学习一波。

二 基本介绍

2.1 任务描述

视频相比于图像而言,是一帧帧图像的集合。因此,很自然可以想到从两个维度去提取视频信息:

  • 空间:单帧图像包含的信息;
  • 时间:多帧图像之间包含的运动信息;

所以文章就想能否同时利用视频的空间信息与时间信息,来更好的提取视频特征,进而进行视频分类任务。

2.2 main contribution

文章的主要contribution:

  1. 提出了大名鼎鼎的two stream ConvNet;
  2. 实验发现利用optical flow即使只有很少的训练样本也能达到不错的实验结果;
  3. 在两个不用的数据集上用multitask-learning, 可以增加训练样本的数量,进而提升在单个数据集上的识别性能。

第3点在现在看来其实都不算是很创新的东西了,只是把两个数据集UCF101及HMDB51叠加在一起作为训练集训练网络,用相同的网络结构,不同的softmax进行分类,得到两个分类loss,然后对两个loss做一个相加后进行梯度回传。

这里主要介绍一下two stream的结构及optical flow相关的部分。

三 模型及方法介绍

还是先看网络结构图吧:

论文 | 《Two-stream Convolution Networks for Action Recognition in Videos》文章及optical flow视频光流学习笔记_第1张图片
模型结构图

整体网络简单清晰:

  • 上面一层:spatial stream convNet负责提取空间信息;
  • 下面一层:temporal stream convnet负责提取时间信息;
  1. 如图中所示,对于spatial convNet来说,输入图像是单张RGB图像,然后经过一系列的卷积层、fc层后接到一个sofmax中,得到一个概率分布值;

  2. 然后对于Temporal ConvNet来说,输入是多帧图像之间的optical flow,同样经过一系列网络层后接到一个softmax中,得到一个概率分布值。

  3. 除了下面的temporal ConvNet少了一层normalization层, 上下两个stream的基本网络构成都是一样的。

  4. 最后的class score fusion将两个stream的score值融合在一起,文章一共尝试了:average、SVM这两种方法。(实验结果显示SVM融合的方式更优)

四 optical flow视频光流

4.1 optical flow stacking

我们先从下面的例子来看一下optical flow的定义:

  1. 光流可以看成是2帧连续帧t,t+1之间的移位向量场(displacement vector)。
    如图(a),(b)所示为2帧连续帧,其中绿色框中是前后两帧运动信息比较明显的部分。

  2. 图(c)展示的就是绿色框中对应的光流情况,可以看到各个位置的移动情况。

  3. 图(d)(e)分别是对移位场进行水平和垂直两个方向进行分解后的示意图。
    这两个就就可以很方便的用神经网络来识别。

论文 | 《Two-stream Convolution Networks for Action Recognition in Videos》文章及optical flow视频光流学习笔记_第2张图片

对于大小为 w, h, 帧长度为L的一个视频片段来说,将L帧的dx,dy给堆叠起来,就能得到长度为2L的input channels, 即整个输入的体积形状为:[ w,h,2L ]

对于L中的任意一帧τ而言,下式成立:


其实整个数学公式表达的就是将每一帧的dx,dy按序stack在一起的意思:

论文 | 《Two-stream Convolution Networks for Action Recognition in Videos》文章及optical flow视频光流学习笔记_第3张图片

而对于任意一个点(u,v),Iτ(u,v,c), c = [1;2L] 就是表示这一个坐标位置点在长度为L帧中的动作进行编码。

4.2 trajectory stacking

整体思路跟optical 类似,只是这里记录的是轨迹信息。

看如下公式:

唯一与optical flow不一样的地方的地方就在在于等式的右边不再是位置(u,v),而是轨迹Pk。

Pk的数学解释在这里:

其实就是记录的从点(u,v)出发,后面每一个轨迹上的点的位置。即pk上的点是从运动轨迹上sample出来的。

下面这张图很好的表示了optical flow和trajectory之间的关系和区别:

论文 | 《Two-stream Convolution Networks for Action Recognition in Videos》文章及optical flow视频光流学习笔记_第4张图片
  1. 左边是optical flow;
  2. 右边是trajectory;
  3. 注意看左边的点在各帧上始终是p1,即记录的自始至终都是同一个坐标点(u,v)在各帧上的移动情况。
  4. 而右边的点从最开始的p1(u,v),到后面各帧,它指向的坐标位置是在变化的。它记录的是这个点的运动轨迹。

目前用的比较多的应该还是optical flow的表示方式。

4.3 learn more

  1. optical flow具体计算方法参考:T. Brox, A. Bruhn, N. Papenberg, and J. Weickert. High accuracy optical flow estimation based on a theory for warping. In Proc. ECCV, pages 25–36, 2004.
  2. trajectory具体计算方法参考:H. Wang, A. Kl¨aser, C. Schmid, and C.-L. Liu. Action recognition by dense trajectories. In Proc. CVPR, pages 3169–3176, 2011.
  3. 具体实现:github有挺多开源代码,下次有机会实践的话再另外补充吧~

五 写在最后

接下来一段日子应该都会先学习3D重建方面的东西了,新接触一个领域还是有很多新的东西需要花时间和精力去学习。

视频的工作当然也希望能一直做下去。

你可能感兴趣的:(论文 | 《Two-stream Convolution Networks for Action Recognition in Videos》文章及optical flow视频光流学习笔记)