打开网易新闻 查看精彩图片

2014 年之前,如果你想让计算机看懂一段视频里的人在做什么,最靠谱的办法不是神经网络。

这句话现在听起来有点奇怪,毕竟深度学习早就统治了图像识别的江山。2012 年 AlexNet 在图片分类上一战封神,整个学术界都在往深度学习的方向狂奔。可是到了视频领域,事情却完全不一样。

当时视频动作识别领域最强的方法叫密集轨迹

> 密集轨迹(Dense Trajectories):一种手工设计的视频特征提取方法,通过跟踪视频中密集分布的点,沿着运动轨迹提取特征来描述动作。

这套方法完全不用神经网络,靠的是研究者精心设计的数学规则,跟踪视频画面里成千上万个点,看它们怎么移动,然后从这些轨迹里提取特征。听起来很笨拙,但效果好到离谱。在几个主流的动作识别测试集上,密集轨迹的准确率能达到 85% 以上,而当时所有尝试用深度学习做视频动作识别的论文,准确率都卡在65% 到 70% 之间,足足落后了将近 20 个百分点。

20个百分点的差距意味着什么。意味着每 5 个动作里,深度学习方法就要比手工特征多认错一个。这不是小差距,这是全面落后。

所以在 2014 年,牛津大学的 Karen Simonyan 和 Andrew Zisserman 面对的是一个相当尴尬的局面:深度学习在图像上所向披靡,但一旦加上时间维度,变成视频,立刻被传统方法按在地上摩擦。他们俩后来几个月又发表了另一篇后来家喻户晓的论文,叫 VGGNet,提出了那个用小卷积核堆叠出深度网络的经典结构。而在写 VGGNet 之前,他们先解决了视频这个更棘手的问题,这篇论文就是《Two-Stream Convolutional Networks for Action Recognition in Videos》。

问题出在哪:视频比图片难在哪里

要理解他们的解法,得先搞清楚视频到底比图片难在什么地方。

一张图片,你看一眼就知道里面有没有猫,有没有人,这是空间信息,是静态的。但一段视频,比如一个人在挥手打网球,单看某一帧,你可能根本分不清他是在打网球还是在挥拍子赶苍蝇。真正告诉你"这是打网球"的信息,藏在画面的变化里,藏在手臂挥动的轨迹和速度里。这是时间信息,是动态的。

早期把深度学习用到视频上的思路很直接,把视频的每一帧当成一张图片,或者把连续几帧叠在一起塞进卷积网络,让网络自己去学习时间维度上的规律。听起来合理,但效果就是不好。

问题出在卷积神经网络的本性上。卷积网络天生擅长学习空间上的图案,边缘、纹理、形状,这些东西在一张静态图片里表现得很清楚,网络的卷积核可以直接在像素上滑动去捕捉。但运动是另一种东西,它是像素随时间变化的模式,你让一个专门设计用来看图案的网络去隔着好几帧硬学"变化",相当于让一个擅长看照片的人去猜一段哑剧在讲什么故事,他能看懂几个静止的姿势,但姿势之间是怎么连起来的,他抓不住。

这就是当时深度学习卡在 70% 上不去的根本原因。网络在学空间图案这件事上确实很强,可运动信息它学得很勉强。

解法:干脆分成两条路来看

Simonyan 和 Zisserman 的思路说出来其实挺朴素,甚至朴素得让人怀疑"这也算创新?"。

他们的想法是,既然一个网络同时学空间和时间学不好,那就别逼它同时学,干脆用两个网络,一个专门看空间信息,一个专门看时间信息,最后把两边的判断结果加权合并。这就是论文标题里的"Two-Stream",两条流。

第一条流叫空间流

> 空间流(Spatial stream):输入是视频中单独一帧的RGB图像,用来识别画面里的场景、物体和人物外观等静态信息。

它的输入很简单,就是视频里随便抽出的一帧彩色图片,跟做普通图片分类没什么区别。这条流负责回答"画面里有什么",比如是不是在游泳池,有没有网球拍,背景是室内还是户外。这些静态线索对分类动作其实也很有用,毕竟游泳池里大概率是在游泳而不是打篮球。

第二条流叫时间流

> 时间流(Temporal stream):输入是光流场,用来捕捉视频中物体和人物的运动信息。

这条流不看普通的图片,它看的是光流

> 光流(Optical flow):描述视频中每个像素点从上一帧到下一帧移动方向和速度的向量场,可以理解为给画面里每个点都画一个箭头,指出它往哪个方向、以多快速度移动。

光流场把"运动"这件抽象的事情,变成了一张可以直接喂给卷积网络的图片。每个像素点变成了两个数字,水平方向的位移和垂直方向的位移,画出来就像是给每个像素都插了一根箭头,箭头指向它接下来要去的地方。网络看到的不再是一帧静止画面,而是一张记录了"谁往哪儿动、动多快"的地图。

这个设计有个很直白的类比。你想象一下你在看一场足球比赛的两种方式,一种是看一张定格的截图,你能看出场上有几个人、球在哪、球门在哪,但你不知道下一秒会发生什么。另一种是有人直接在截图上帮你画好了每个球员和球下一步会往哪个方向冲的箭头,箭头长短还代表速度快慢。你不需要再脑子里去猜"这几帧连起来是什么动作",箭头已经把动作信息明明白白摆在你面前了。如果不做这一步预处理,直接把原始的连续帧堆起来扔给网络,网络就得自己从像素的细微变化里反推出运动方向,这件事对卷积网络来说太绕了,它更擅长处理"已经摆在那里"的图案,而不是"需要推算"的变化。这也是为什么把光流单独算出来再喂给网络,效果比让网络自己啃原始帧好得多。

论文里还有一个技术细节值得说一下。他们把光流场堆叠了多帧,而不是只用相邻两帧算出的一个光流。具体来说,输入时间流的是连续 10 帧计算出的光流叠在一起,形成一个有 20 个通道的输入,10 帧的水平位移加 10 帧的垂直位移。这样网络能看到的不是某一瞬间的运动,而是一小段时间窗口里运动是怎么演变的,这对判断像"挥拍击球"这种有明确节奏的动作特别关键。

两条流怎么合并:晚一点再决定

两条流各自训练成独立的卷积网络,结构上都参考了当时流行的图片分类网络。训练完之后,怎么把两边的判断结果拼到一起,变成最终的一个分类结果?

论文选择的是一种叫后期融合

> 后期融合(Late fusion):两个独立的模型分别做出预测后,再将预测结果(通常是分类得分)加权平均或用另一个分类器组合起来,而不是在网络内部提前混合特征。

的策略,而不是让两条网络在中间层就开始交换信息。具体做法是,空间流网络给出一组分类得分,时间流网络也给出一组分类得分,然后用一个简单的线性组合,或者训练一个小的支持向量机去把两组得分融合成最终答案。

为什么不在网络内部更早地融合,让两条流互相借力?这里其实是个工程上的取舍。一方面,当时的实验条件下,训练一个同时处理两种输入的联合网络在数据量有限的情况下容易过拟合,两条流分开训练反而更稳。另一方面,后期融合的好处是两条流可以完全独立地设计、独立地训练,甚至可以用不同的数据来源来预训练,空间流可以直接借用海量图片数据集训练好的模型做初始化,时间流则可以用专门的动作数据集来训练,两边互不干扰。

这就好比一个案子交给两个侦探分别调查,一个专门查监控录像里的静态线索,比如现场有什么物品,另一个专门查嫌疑人的行动轨迹,谁在什么时间出现在什么地方。你不需要两个侦探一直互相打断汇报进度,让他们各自把结论写成报告,最后开个会一起对比结论,反而更清楚,也更容易分辨到底是哪类线索起了决定性作用。如果非要让两人从一开始就混在一起边走边讨论,信息容易搅在一起,谁的判断起了关键作用反而说不清楚,训练模型也是类似的道理,过早混合反而让优化变得复杂。

数据不够怎么办:借用图片的力气

深度学习的老问题是它嗜数据如命,而当时的视频动作识别数据集,像 UCF101,只有一万三千多段视频,跟动辄百万张的图片数据集比,简直是杯水车薪。

空间流这边好办,直接借用在 ImageNet 上训练好的图片分类网络做初始化,这是当时已经很成熟的做法,毕竟空间流的输入本来就是普通图片。

时间流这边麻烦一些,因为光流图片这种东西,没有现成的海量预训练资源。论文采用的解法是多任务学习

> 多任务学习(Multi-task learning):让同一个网络同时在多个相关数据集或多个任务上训练,共享大部分网络参数,只在最后输出层区分不同任务,以此让数据量小的任务也能从其他任务的数据中受益。

的思路,把两个不同的动作识别数据集拿来一起训练,网络主体共享,只在最后加两个不同的输出层分别对应两个数据集的类别。这样时间流网络能看到的训练样本数量相当于翻倍,缓解了数据不足带来的过拟合问题。

结果如何:数字说话

论文在两个当时的标准测试集上做了实验,UCF101 和 HMDB51,都是当时动作识别领域最常用的基准。

| 方法 | UCF101 准确率 | HMDB51 准确率 |

| 单独空间流 | 72.6% | 40.5% |

| 单独时间流 | 81.0% | 54.6% |

| **双流网络融合** | **88.0%** | **59.4%** |

| 密集轨迹(手工特征,同期最强) | 85.9% | 57.2% |

这张表最值得咂摸的地方在于三个数字的对比。

单独用空间流,准确率只有 72.6%,基本就是之前那些"把视频当图片处理"的方法的水平,证明了只看静态画面确实不够。单独用时间流,准确率跳到 81.0%,说明光流里蕴含的运动信息比单纯的画面内容更能反映动作本身,这个发现本身就很说明问题,过去大家默认视频理解首先要靠画面内容,这篇论文用数字告诉你,运动信息可能比画面内容更重要。

而把两条流融合起来,准确率冲到 88.0%,不是简单的两者取平均,而是明显超过了单独任何一条流。这说明两条流学到的信息确实是互补的,空间流知道"这是什么场景",时间流知道"东西在怎么动",两者合起来才是完整的答案,单独任何一个都是偏的。

最关键的一条,双流网络的 88.0%,第一次超过了密集轨迹的 85.9%。这是深度学习在视频动作识别上第一次真正赢过手工特征方法。在 2014 年,这个结果的分量不亚于两年前 AlexNet 在图片分类上的横空出世,它标志着深度学习终于打通了视频理解这个此前一直啃不动的领域。

光流为什么这么关键:一个值得多想一层的问题

论文里有个细节我觉得特别值得琢磨。单独时间流的准确率(81.0%)远远超过单独空间流(72.6%),差了将近 8.4 个百分点,这跟很多人的直觉是相反的。

一般人可能觉得,画面里有什么东西,应该是识别动作更直接的线索,毕竟"游泳池"这个场景信息一下子就能排除掉一大堆不可能的动作。但实验结果说明,运动的模式本身,包含的区分度反而更强。想想看,"挥拍"和"挥拳"这两个动作,画面背景可能长得差不多,都是一片空地,但运动轨迹完全不同,一个是横向大幅度挥动,一个是短促的直线出击。光流恰好精确捕捉到了这种差异,而普通画面反而捕捉不到。

这也从侧面印证了这篇论文最核心的洞察,时间信息不是空间信息的辅助,它是独立的、甚至可能更重要的一类信息,值得用单独一整套网络去专门处理,而不是简单地叠加在空间信息上敷衍了事。

后续影响:两条流的思路走了多远

双流网络提出之后,几年内衍生出了一大批后续工作,基本都是在这个骨架上做加法。

2016 年,Feichtenhofer 等人在论文《Convolutional Two-Stream Network Fusion for Video Action Recognition》里指出,后期融合太晚了,两条流应该在网络中间层就开始交换信息,他们提出了在卷积层之间加入跨流连接的方案,让空间流和时间流能在特征层面互相借力,而不是等到最后一步才合并结果,这个改动进一步把 UCF101 上的准确率往上推了几个点。

2017 年,Carreira 和 Zisserman(没错,还是同一个 Zisserman)在论文《Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset》里提出了 I3D 网络

> I3D(Inflated 3D ConvNet):把二维卷积网络的卷积核在时间维度上"膨胀"成三维,让网络能直接在原始视频帧序列上学习时空特征,同时依然沿用双流结构分别处理RGB和光流输入。

这个模型依然保留了双流结构,一条处理原始视频帧,一条处理光流,但每条流内部换成了三维卷积网络,直接在时空维度上做卷积,不再需要手动计算光流之外的额外技巧。配合上他们同时发布的大规模视频数据集 Kinetics,I3D 把 UCF101 上的准确率推到了 98% 左右,这个数字放在 2017 年,已经是当时几乎逼近上限的水平。

这两个后续工作有个共同点,它们都没有推翻双流网络的核心思路,空间信息和时间信息应该被区别对待,而是在这个框架里不断把"怎么表示时间信息"和"怎么融合两条流"这两件事做得更精细。这也说明 Simonyan 和 Zisserman 当年那个"分两条路走"的直觉,抓住的是一个相当本质的问题。

写在后面

读这篇论文时最触动我的一点,是空间流单独跑出来的成绩只有 72.6%,比密集轨迹(85.9%)低了十几个点。也就是说,如果 Simonyan 和 Zisserman 只沿用当时主流的"把视频当图片堆叠"的思路,深度学习在这个任务上会输得很惨。真正让深度学习翻身的,不是网络变深了或者调参调得更好,而是他们想清楚了一件更朴素的事,运动信息值得被单独对待,不该被硬塞进一个只擅长看静态图案的网络里。

这让我想到一个更大的问题,很多时候突破不是来自把现有工具用得更狠,而是先停下来问一句"这个工具到底适合做这件事吗"。光流场这个东西早就存在,不是这篇论文发明的,他们做的事其实是把一个老工具和一个新工具用一种没人试过的方式拼在一起。

论文里没有细说的是,光流本身的计算成本不低,而且是提前算好、离线准备的,这意味着这套系统还谈不上实时。后来的研究者一直在想办法让网络自己端到端地学出运动信息,不再依赖预先算好的光流,这条路走了很多年,直到现在也还没完全走完。

Q&A

Q1:双流卷积网络(Two-Stream ConvNet)是什么?

A:这是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别模型,用两个独立的卷积网络分别处理静态画面(空间流)和运动信息(时间流,输入是光流场),再把两边的判断结果融合起来,首次让深度学习在动作识别任务上超过了传统手工特征方法。

Q2:双流网络为什么要分成空间流和时间流两条路径,而不用一个网络?

A:因为卷积网络天生擅长学习静态图案,但很难直接从连续帧里学出运动规律。把运动信息提前用光流场表示出来,再交给专门的网络处理,比让一个网络同时兼顾两种信息效果好得多,实验中单独时间流准确率达到 81.0%,比单独空间流的 72.6% 高出不少。

Q3:双流网络的效果到底有多好,和当时最强的方法比怎么样?

A:在 UCF101 数据集上,双流网络融合后准确率达到 88.0%,超过了当时最强的手工特征方法密集轨迹(85.9%),这是深度学习第一次在视频动作识别任务上赢过传统方法,具有历史节点意义。