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

2014年秋天,深度学习圈子里有一件事让很多人挠头。

两年前,AlexNet 在图像识别比赛上一鸣惊人,把传统的手工特征方法打得溃不成军,深度学习一夜之间成了计算机视觉的新宠。可奇怪的是,同样的深度学习方法,一旦从静态图片换成视频,去识别视频里的人在做什么动作,就完全不灵了。

当时最好的深度学习模型,在一个叫 UCF-101 的动作识别数据集上,准确率只能做到65%左右。而一个诞生于传统方法阵营、名字听起来毫不起眼的手工特征方法,叫做"密集轨迹"

> 密集轨迹(Dense Trajectories)*:一种传统的视频特征提取方法,通过跟踪视频中密集分布的点在时间上的运动轨迹,并结合轨迹周围的图像和运动信息来描述动作,是2014年前动作识别领域的主流方法。

却能做到87%以上。

这个差距接近20个百分点。放在一个更直观的场景里理解:如果你让深度学习和密集轨迹各识别100个动作视频,深度学习会认错35个,密集轨迹只认错13个。深度学习每识别5个动作,就要比传统方法多犯将近1个错误。这在当时几乎是深度学习在视觉任务上最尴尬的一次失败。

问题出在哪?图像识别只需要认出一张照片里"有没有一只猫",而视频动作识别要认出的是"这个人正在做什么",这背后藏着一个图片永远给不出的东西:运动。一张照片可以告诉你画面里有个人举着手,但它无法告诉你这只手是正在举起,还是正在放下。要理解动作,必须理解时间维度上发生了什么变化。而当时的深度学习网络,骨子里都是为处理静态图片设计的,它们不知道怎么处理"变化"这件事。

这就是牛津大学 Karen Simonyan 和 Andrew Zisserman 在2014年面对的核心难题。他们后来又用几个月的时间发表了 VGGNet,那篇论文后来成了图像识别领域的经典架构,而这篇关于视频动作识别的论文,其实是同一批人在同一个时间段里做的另一件事。这个背景很有意思:他们一边在琢磨怎么把卷积网络做得更深更强,一边在琢磨怎么让卷积网络学会理解运动。这两条线后来分别走向了不同的方向,但出发点是同一批人对同一个问题的两种回答。

核心问题:一个网络够不够看懂运动

要理解这篇论文的巧思,得先弄明白深度学习在视频上失败的真正原因。

当时已经有人尝试过最直接的办法:把视频的每一帧图片喂给卷积网络,让网络自己去学习帧与帧之间的时间关系。这个思路听起来很合理,毕竟卷积网络在图片上表现那么好,多喂几帧连起来学,应该能学到时间信息吧?

可实验结果给了当头一棒。这类方法的效果甚至不比只用单张图片好多少。原因值得琢磨:卷积网络的核心机制是通过局部感受野一层层地抽取空间特征,比如边缘、纹理、形状,这套机制天生擅长处理"这张图里有什么",但它没有任何专门的结构去捕捉"这一帧到下一帧发生了什么变化"。让网络自己从一堆连续帧里领悟运动模式,相当于让一个只学过认字的人自己去悟出语法规则,理论上不是不可能,但效率极低,而且数据不够的时候基本学不出来。

这里就引出了这篇论文最核心的一个判断:如果网络自己学不好运动信息,那就不要逼它自己学,直接把运动信息用一种明确的方式喂给它。

这个思路听起来朴素,但背后有个关键的工程选择,那就是用什么方式来表示"运动"。

光流:把运动翻译成一张网络看得懂的图

论文选择的答案是光流

> 光流(Optical Flow)*:描述视频中每一个像素点在连续两帧之间的运动方向和运动速度的一种表示方法,本质上是一张记录了"每个点往哪个方向、移动了多快"的位移场。

光流场可以直观理解成这样一张图:图里每个位置都有一个箭头,箭头的方向代表这个点在往哪边移动,箭头的长度代表移动了多快。如果你把一段人走路的视频转换成光流图,你会看到腿部区域有一串朝下又朝前的箭头,而背景是静止的,几乎没有箭头。这张图本身几乎不包含任何关于"这个人长什么样"的信息,它纯粹只在说"什么在动,往哪动"。

这个设计的巧妙之处在于,它把一个网络不擅长的任务,主动转换成了一个网络擅长的任务。网络本来不擅长从连续帧里领悟运动规律,但网络非常擅长处理"一张图片",而光流恰好就是把运动信息重新打包成了一张图片的样子。研究者没有强迫卷积网络去学习它天生不擅长的东西,而是先用传统的光流算法把运动信息计算出来,变成图片格式,再喂给网络去做它本来就擅长的事:从图片里抽取模式。

这里适合做一个类比。假设你要教一个只会读文字报告的助理去分析一段监控录像里发生的车祸,你有两个选择。第一个选择是直接把原始录像交给他,让他自己去总结"车速变化""刹车时机"这些信息,这需要他具备额外的、他本来没有的技能。第二个选择是先找专业软件把录像转换成一份记录着"每辆车每一秒的速度和方向"的数据表格,再交给这位只会读报告的助理。显然第二种方式效率更高,因为你没有强迫他学会一项他不具备的新能力,而是把信息转换成了他熟悉的格式。如果坚持用第一种方式,助理很可能因为缺乏视觉分析训练,把重要的刹车瞬间完全漏掉,这正是纯粹靠卷积网络自学运动信息时发生的情况。

双流架构:一条看画面,一条看动作

有了光流这个表示方式,接下来的架构设计就顺理成章了。

论文提出的模型叫双流卷积网络

> 双流卷积网络(Two-Stream Convolutional Network)*:由两个独立的卷积神经网络组成的动作识别模型,一条网络处理静态画面(空间流),另一条网络处理运动信息(时间流),最后融合两条网络的判断结果。

整个架构分成两条完全独立的通道。第一条叫空间流,输入是视频里的单帧图像,负责识别画面里的场景、物体和人物外观,比如这是不是一个游泳池,画面里有没有一个人。第二条叫时间流,输入是刚才提到的光流图,负责专门捕捉运动模式,比如这个人的四肢正在往哪个方向摆动。

这两条网络在结构上几乎是镜像的,都是当时经典的卷积神经网络设计,包含若干层卷积和全连接层,最后各自输出一个关于动作类别的预测。两条网络分别训练,最后再把两边的预测结果进行融合,可以是简单地取平均,也可以用一个支持向量机把两边的输出结果结合起来做最终判断。

论文里给出的原理图非常清晰地展示了这个结构:输入的视频帧先一分为二,一路直接送进空间流,另一路先经过光流计算再送进时间流,两条路径完全并行,互不干扰,只在最后一步汇合。

为什么要做成两条完全独立的网络,而不是想办法融合成一条?这里其实藏着一个很实际的考量。空间信息和运动信息的统计特性差别很大,一张风景照片和一张光流图看起来完全是两种不同性质的数据,如果强行用一套网络参数去同时学习两种截然不同的模式,效果反而可能相互干扰。分开训练,让每条网络专注学一件事,再在最后做融合,是一个更稳妥也更容易训练成功的策略。

这个设计思路让人想到人的两只眼睛处理视觉信息的方式,虽然不是完全对应的类比,但有一个更贴切的日常场景:一个乐队里,鼓手负责打节奏,主唱负责唱旋律,两个人各自专注自己的部分,分头练习到位,最后合奏出来的效果往往比让一个人同时兼顾节奏和旋律要好得多。如果强迫一个人同时处理两件性质完全不同的任务,大概率两件事都做不精。双流网络的设计正是把"认场景"和"看动作"这两件性质不同的任务,拆给两个专门的网络分别去做到极致。

用图片数据"补课":解决训练数据不够的问题

这篇论文还有一个不那么起眼但同样关键的贡献,就是解决了训练数据不足的问题。

视频数据集的规模在当时远远比不上图像数据集。像 UCF-101 这样的动作识别数据集,总共只有一万多个视频片段,而 ImageNet 这种图片数据集动辄上百万张图片。深度网络的一个基本规律是参数越多越需要数据喂养,数据不够,网络很容易过拟合,也就是死记硬背了训练集里的样本,换一批新视频就不认识了。

研究者的解法是让空间流网络先在庞大的 ImageNet 图片数据集上进行预训练,因为空间流本质上就是在做图像分类这件事,一张风景照、一个物体的样子,这些视觉模式在图片数据集和视频帧之间是相通的。让网络先在图片的海洋里把"认物体、认场景"这项基本功练扎实,再迁移到视频帧上做动作识别的微调,相当于给数据量不足的问题找到了一条曲线救国的路。

这个思路放到今天已经是深度学习里再普通不过的常规操作,叫做预训练加微调,但在2014年,把图片数据集的知识迁移到视频任务上,是一个相当有针对性的解决方案。

数据说话:双流网络到底赢了多少

理论说得再漂亮,最终还是要看数字。论文在两个标准数据集上做了系统的实验对比,UCF-101 和 HMDB-51,这两个数据集在当时是动作识别领域最常用的评测标准。

下面这张表格摘取了论文里几个最关键的对比结果,数据来自 UCF-101 数据集:

| 方法 | 准确率 |

| 仅用空间流(单帧图像) | 72.6% |

| 仅用时间流(光流) | 81.0% |

| 密集轨迹(当时最强的手工特征方法) | 87.9% |

| **双流网络(空间流+时间流融合)** | **88.0%** |

这张表格里有几个值得细品的地方。

第一个值得注意的地方是单独用空间流,也就是只看静态画面去判断动作,准确率只有72.6%。这说明单纯靠"画面里有什么"是远远不够的,同一个游泳池的场景,可能对应跳水,也可能对应仰泳,不看运动信息根本分不清楚。

第二个值得注意的地方是单独用时间流,只看光流不看画面内容,准确率反而达到了81.0%,比单用画面还高出8.4个百分点。这个结果相当有说服力地证明了这篇论文最初的判断:运动信息对动作识别至关重要,而且光流确实成功地把运动信息转换成了网络能理解的形式。

第三个也是最关键的结果是两条流融合之后,准确率跳到了88.0%,比单独用任何一条流都高出不少,更重要的是,这个数字终于超过了当时称霸多年的密集轨迹方法的87.9%。差距看起来很小,只有0.1个百分点,但这个0.1的意义在于,这是深度学习方法第一次在视频动作识别这个任务上,正面击败了手工设计特征方法。

这句话放在2014年的分量不轻。要知道两年前的 AlexNet 让深度学习在图像识别上一战封神,但视频领域整整落后了两年才追上来。这篇论文相当于给深度学习在视频理解领域补上了迟到已久的这一局。

如果反过来想一想,假如这篇论文只用了空间流会怎样?答案已经写在表格里了,准确率会停留在72.6%,比最终的双流方案低了整整15.4个百分点,这意味着每识别100个动作视频,会多认错15个。这个差距足够说明,运动信息这条线索不是锦上添花,而是识别视频动作里不可或缺的核心依据。

后来的故事:双流架构成了整个领域的起点

这篇论文发表之后,双流的思路几乎成了后续几年视频动作识别研究的标准出发点。

2016年,Feichtenhofer、Pinz 和 Zisserman(这里 Zisserman 又出现了)发表了一篇论文,提出了对双流网络的改进,把两条流之间原本互不干扰的设计改成了在网络中间层就进行信息交互,让空间信息和运动信息可以更早地互相影响,而不是等到最后一步才融合,这个改进进一步提升了识别准确率。

2017年,DeepMind 的团队提出了 I3D 网络

> I3D(Inflated 3D ConvNet)*:一种把二维卷积网络"膨胀"成三维卷积网络的动作识别方法,可以直接对视频片段做三维卷积,同时提取空间和时间特征,同时它依然沿用了双流的思路,分别对RGB帧和光流做3D卷积再融合。

这个方法把双流架构里的二维卷积网络换成了三维卷积网络,让网络可以直接在时间维度上做卷积操作,而不再需要单独计算光流这个中间步骤,同时它依然保留了双流融合的框架,只是把每一路网络本身升级成了更强的三维版本。I3D 后来在更大规模的 Kinetics 数据集上刷新了当时的最好成绩,把这个领域的准确率又往前推进了一大截。

这两个后续工作有一个共同点,它们都没有推翻双流架构的基本思路,而是在这个框架内部做加法,一个是让两条流更早地交流,一个是让每条流本身变得更强。这从侧面说明了这篇2014年的论文提出的框架本身有相当扎实的生命力。

写在后面

读这篇论文的时候,有一个细节让我反复回想:研究者没有执着于"让一个网络学会所有东西",而是主动承认了当时卷积网络在处理时间信息上的局限,选择用传统算法先把光流计算出来,再喂给网络。这不是一个特别酷的技术突破,反而带着一点"知道自己做不到就别硬撑"的实用主义。

这让我想到一个更普遍的现象,很多领域的突破不是靠某个单一模型变得无所不能,而是靠把复杂问题拆解成几个各自可控的子问题,再想办法拼起来。双流网络能赢,不是因为哪一条流单独有多强,时间流也只有81%,而是因为拆分之后,两边各自解决自己最擅长的那部分,拼起来比硬扛一整个问题效果更好。

论文里没有解决的问题是,光流的计算本身依赖传统算法,速度慢,而且光流质量的好坏会直接影响时间流的表现。这个瓶颈后来被 I3D 这类三维卷积方法绕开了,但这已经是另一个故事。

Q&A

Q1:双流卷积网络是什么?

A:双流卷积网络是2014年由牛津大学 Karen Simonyan 和 Andrew Zisserman 提出的视频动作识别模型,由两条独立的卷积神经网络组成,一条处理静态画面(空间流),一条处理光流表示的运动信息(时间流),最后融合两者的预测结果来判断视频中的动作类别。

Q2:双流卷积网络为什么要用光流而不是直接用原始视频帧?

A:因为卷积网络本身不擅长从连续帧中自己领悟运动规律,而光流可以把"什么在动、往哪动"这种运动信息直接转换成一张网络擅长处理的图片格式,相当于把网络不擅长的任务转换成了它擅长的任务,从而大幅提升了识别效果。

Q3:双流卷积网络的效果比传统方法好多少?

A:在UCF-101数据集上,双流网络融合后达到88.0%的准确率,略微超过当时最强的手工特征方法密集轨迹(87.9%),这是深度学习方法第一次在视频动作识别任务上正面击败传统手工特征方法。