Two-Stream 双流网络、I3D
一、双流网络
- 论文:《Two-Stream Convolutional Networks for Action Recognition in Videos》(用于动作识别的双流卷积神经网络)
- 参考:李沐 《双流网络论文逐段精读》
1.1 前言
1. 为什么要做视频?
- 视频包含更多信息:比如时序信息、声音&图像等多模态信息,而且是连续信息而非静止的图像。
- 论文引言提到,视频天生能提供一个很好的数据增强,因为同一个物体在视频中会经历各种形变、光照变换、遮挡等等,非常丰富而又自然,远比生硬的去做数据增强好得多
- 视频处理是未来突破的方向:目前计算机视觉领域,很多研究热衷于在 ImageNet 等几个榜单刷分,往往训练了很大的模型,使用很多的策略,也只能提高一点点,类似深度学习出现以前,CV 领域中机器学习的现状,已经达到了一个瓶颈期。要想突破必须有新的网络结构,指标之一就是要能很好地处理视频数据。
本文是做视频分类的,为啥论文题目是动作识别呢?
- 包含人类动作的视频更容易收集,直到现在,大部分的视频分类还是做动作识别
- 动作识别非常实际意义,对 VR、视频检索等等很多工作都有帮助
2. 双流网络:视频领域开山之作
在这篇文章出现之前,用深度学习来处理视频主要有两种方式:
- CNN+LSTM:即 CNN 抽取关键帧特征,LSTM 进行时序建模
具体来说,就是先抽取视频中的关键帧得 到 K 张图,然后将这 K 张图输入 CNN 网络得到图片特征。再将这些特征全部输入 LSTM 网络,进行各个时间戳上图片特征的融合,得到整个视频的融合特征。最后将 LSTM 最终时刻的特征接一个 FC 层得到分类结果。 - 3D 网络:将视频帧(分割好的一个个的视频段,每段含有 K 张图片)直接输入 3D 的 CNN 网络进行时空学习
此时卷积核必须是 3 维的(比如每个卷积核都是 3×3×3,加入了时间维度),网络不光学习空间信息,还需要学习时序信息(运动信息)。最后 3D Conv 输出的特征也是接一个全连接层得到分类结果。因为多了一个维度,模型的参数量很大,不太好训练,而且效果也不好。
这两种方式的效果都还不如手工设计的特征。双流网络是第一个能让深度学习网络效果媲美手工设计特征的视频分类结构,从此之后,深度学习在视频领域开始占据主流。

3D 网络做视频处理的代表工作是 2014 年的 DeepVideo,把当时能够魔改的 CNN 结构都在动作识别上试了一遍,实验做的很多。作者为了做出好的效果,还收集了一个很大的数据集:
Sports-1M。这个数据集有 100 万视频,时长几十秒到几分钟,视频帧超 10 亿,直到现在都还在使用。最终的结果,是在
Sports-1M这么大的数据集上预训练,再在UCF-101数据集上微调,精度也只有 65%,比最好的手工特征方法差了 20%,所以结果是非常差的。
作者认为,目前 CNN 网络无法将视频处理的很好,是因为卷积神经网络很擅长处理静态的外观信息( appearance information,比如物体形状大小颜色、场景信息等等),而非运动信息(motion information) 。既然如此,就干脆用另一个网络(光流网络)抽取好运动信息的特征,CNN 只需要学习输入的光流和最后的动作信息之间的映射就行(或者说是光流输入到时间流网络的分类之间的映射),这种映射是深度神经网络最擅长的。也就是说 CNN 本身不需要学习运动信息,也不需要进行时序建模,这些都交给光流做了,所以模型非常的简单。两个网络互不干扰,很好训练也很好优化,最终模型的性能也非常高。
在相关工作中,作者列出了两种手工设计的特征:
STIP特征(spatio-temporal interest points):基于局部的时空学习, 演变为今天的 3D 网络IDT特征( improved dense trajectories ):dense trajectories 是指光流特征。先算出光流,再利用光流找到运动轨迹,然后在物体运动轨迹上抽取特征,这样能很好的利用物体的运动信息。而IDT就是后续改进的 dense trajectories 特征。受光流特征的启发,作者将光流也应用到神经网络结构中,也就是本文的双流网络。
3. 贡献
将深度神经网络应用于视频动作识别的难点,是如何同时利用好静止图像上的 appearance information 以及物体之间的运动信息 motion information。本文主要有三点贡献:
- 提出了一种融合时间流和空间流的双流网络;
- 证明了直接在光流上训练的网络,即使训练集很小,仍能获得很好的效果;
- 在两个动作识别数据集上使用多任务学习(multi-task learning),同时 训练一个 backbone,可以增加训练数据量,提高模型性能。
1.2 网络结构
双流网络(使用两个卷积神经网络)结构如下:

Spatio Stream ConvNet:空间流卷积网络,输入是单个帧画面(静态图片),主要学习场景信息。因为是处理静态图片,所以可以使用预训练的模型来做,更容易优化。最后根据网络输出的特征得出一个 logist(假设模型是在UCF-101数据集上做测试,数据集共 101 个类,logist 是 softmax 之后的类别概率,那么时间流网络的输出就是一个 1×101 维的向量)。temporal stream ConvNet:时间流卷积网络(光流网络),输入是光流图像,通过多帧画面的光流位移来获取画面中物体的运动信息,最后也根据网络输出的特征得出一个 logist。- 光流输入显式地描述了视频帧之间的运动,而不需要 CNN 网络去隐式地估计运动信息,所以使得识别更加容易。加入时间流卷积网络之后,模型精度大大提升。
- 直接以光流做输入来预测动作,而不用 CNN 本身去学动作信息,大大简化了学习过程。
- 融合有两种方式:
late fusion融合:两个 logist 加权平均得到最终分类结果(比如两个 softmax 向量取平均,再做一个 argmax 操作)。- 将 softmax 分数作为特征再训练一个 SVM 分类器。
late fusion就是指在网络输出层面做做融合(这里是 logits 层面),另外还有early fusion,就是在网络中间层特征上做融合。- 空间流和时间流网络结构几乎是一样的,唯一区别就是输入不一样。前者输入的是静止的视频帧,输入
channel=3;后者输入是L张光流图的叠加,输入channnel=2×L(一般取L=10)。因为时间流网络输入通道是2L,所以没法用一般的 CNN 预训练模型。
1.3 光流(Optical flow)
1.3.1 什么是光流
optical flow 简单说就是每个物体的运动轨迹,运动越明显的区域亮度越高。比如下图左侧由两张图片组成,背景不变,只有人的运动状态变了;右图背景运动状态不变,所以是黑色的,只有图中的人处于运动中,是亮色的。通过提取光流,可以去掉背景噪声、人物、穿着、性别等和运动无关的特征都忽略掉,所以最后提取的特征能很好的描述运动信息,也变相的相当于视频里的时序信息的特征表示。

光流由一些位移矢量场(displacement vector fields)组成的,其中第 t 帧的位移矢量用 dt 表示,是通过第 t 和第 t+1 帧图像得到的。dt 可以拆分成水平部分 dtx 和竖直部分 dty。将 dt、dtx、dty 可视化后结果如下:

- a、b:前后两帧图片,维度为 240×320×3(
UCF-101数据集视频帧的大小) - c:光流
dt的可视化显示,射箭动作是超右上走的,维度是 240×320×2。- 因为图片上每个点都可能运动,所以每个像素点都有对应的光流值,所以论文中一直称之为密集光流(dense optical flow)。最终光流图和原图大小一致。
- 2 表示水平和垂直两个方向(维度)。
- 每两张图得到一个光流,如果视频一共抽取 L 帧,那么光流就是 L-1 帧。这些光流一起输入光流网络
- d、e 分别是水平位移
dtx和垂直位移dty
1.3.2 如何利用光流
光流网络主要是为了学习视频中物体的运动信息(时序信息),所以其输入应该是多张光流图的叠加,而非单张光流图(在之前手工设计的特征中,一般是用 10 帧或者 16 帧光流图的叠加)。在 3.1 章节,讨论了两种叠加方式:直接叠加和根据光流轨迹叠加,示意图如下:(这些光流图都是要输入网络的 ,所以都经过了 resize 224×224)

- 简单叠加:网络输入是图中每个点多次光流的叠加,比如网络每次都取 P1 处的光流。这种方式简单直接,但是应该没有充分利用光流信息。
- 按轨迹叠加:每一帧都根据光流轨迹,更新光流点的位置,比如网络按照 P1、P2、P3…这些位置依次提取光流。这种方式听起来合理很多,充分利用了光流信息。
- 每次叠加都是先叠加水平位移,再叠加垂直位移,所以是 ,即光流网络输入维度
224×224×2L。
最终实验结果表明简单叠加的方式更好,作者也没有解释清楚这一点。
1.3.3 双向光流(Bi-directional optical flow)
Bi-directional 的操作,就类似 BERT 一样,都是一种保险、会涨点的操作。光流前向计算和后向计算都是合理的,物体从位置 a 到位置 b 或者反过来都是可行的。
具体来说,如果光流有 L 帧,就把前一半计算前向光流,后一半计算后向光流,最后得到的光流还是 L 帧,通道数为 2L。