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

2014年秋天,如果你去问计算机视觉领域的研究者一个问题:机器能看懂视频里发生了什么动作吗?大多数人会摇头。

不是因为没人做,而是因为做的人都撞了南墙。

当时最强的视频动作识别方法,不是什么深度神经网络,而是一套叫做密集轨迹的手工特征算法。它靠人工设计的规则去追踪画面里的点,统计这些点怎么移动,然后把这些统计数字塞进一个分类器里。这套老办法在权威数据集UCF-101上跑出了85%以上的准确率,而当时所有尝试用深度学习硬刚的团队,准确率都卡在65%到70%左右,足足差了将近20个百分点。

这不是一个小差距。

20个百分点的差距意味着什么,意味着每5个动作里,深度学习就要比手工方法多认错1个。这在图像识别领域是不可想象的事,毕竟就在两年前,AlexNet刚刚用深度学习把图像分类的错误率砍掉了一大半,整个学术圈都以为深度学习要通吃视觉任务了。结果到了视频这一关,深度学习居然被一个"老古董"按在地上摩擦。

这件事让很多人困惑,也让Karen Simonyan和Andrew Zisserman这两位来自牛津大学的研究者开始认真思考一个问题:视频和图片到底有什么本质的不同,导致直接把图像识别的那一套搬过来会失效。

答案其实藏在一个大家都知道但没有认真对待的事实里:视频比图片多了一个维度,时间。

一张静态图片能告诉你一个人站着,手举起来,但它没法告诉你这个手是正在举起来,还是刚放下去。你需要看动作发生的过程,才能判断这是在打招呼还是在扔东西。

问题是,怎么让神经网络"看懂"时间上的变化。

**两条路,一条走空间,一条走运动**

Simonyan和Zisserman给出的答案是,别让一个网络同时干两件事,把空间信息和运动信息拆开,分别用两个独立的卷积神经网络来处理,最后再把两边的判断结果合并。

这就是这篇论文提出的双流网络。

*双流网络:一种把视频动作识别拆成两个独立卷积神经网络分别处理的架构,一条处理静态画面(空间流),一条处理运动信息(时序流),最后融合两边结果*

空间流很好理解,它做的事情跟普通的图片分类差不多,输入是视频里随便抽出来的一帧画面,网络要学的是这一帧里有什么东西,有没有能帮助判断动作类别的场景和物体信息。比如看到一个人站在游泳池边穿着泳衣,即使这一帧完全静止,网络也能猜到这大概率跟游泳有关。

时序流负责的是运动本身,输入不是原始画面,而是光流场。

*光流:描述视频中相邻两帧之间每个像素点是怎么移动的一种向量场,可以理解为把"运动"这件事直接画成一张图*

这里就是整篇论文最关键的设计决策。研究者没有把原始的连续视频帧直接扔进网络让它自己去学运动规律,而是先用传统计算机视觉的方法算出光流,再把光流场当作图像输入给一个卷积网络。

为什么要这么绕一圈。

如果直接把多帧原始画面堆叠起来喂给网络,网络得同时处理颜色纹理这些空间信息,又要从像素值的变化里反推运动信息,这对网络来说负担太重,而且光靠卷积网络自己从头学"运动"这个概念,效率极低,训练数据不够的情况下基本学不出来。

光流场则不一样,它已经是被精心设计和计算出来的运动信息,每个像素点上不再是颜色值,而是这个点在水平和垂直方向上移动了多少。网络看到的输入本身就是"运动的样子",它只需要去学习哪种运动模式对应哪种动作,不用再费劲去反推运动是什么。

这就好比你要教一个从没做过菜的人判断一道菜好不好吃,你有两种办法。第一种,把这道菜连锅带灶具一起搬给他,让他自己去琢磨火候和调料配比对味道的影响,这几乎是不可能完成的任务。第二种,你先把这道菜的关键信息提炼出来,比如咸淡度多少、油温多高、炖了多长时间,直接把这些提炼好的数字给他,他只需要学会把这些数字和好吃不好吃对应起来。如果你选择第一种做法,那这个人大概永远学不会判断,因为信息淹没在太多无关的细节里了。光流场就是那个被提炼好的关键数字,直接把"运动"这个抽象概念摆在网络面前。

论文里还有一个不太起眼但很聪明的细节,双流网络的时序流部分是可以用一种叫UCF-101的数据集去做迁移学习式的预训练的,因为光流图本身跟具体是哪个动作类别关系不大,不同数据集之间的光流特征是可以共享的,这在当年数据量稀缺的背景下大大缓解了深度学习最大的短板,也就是训练数据不够的问题。

*迁移学习:把一个模型在某个任务或数据集上学到的知识,搬到另一个相关任务上继续使用,而不是从零开始训练*

如果不做这种跨数据集的预训练会怎样,深度学习模型在视频这种数据量本来就稀缺的领域会因为训练样本不足而严重过拟合,效果反而可能不如手工特征,而这恰恰是之前那些失败尝试踩中的坑。

**为什么两条流加在一起,比单独一条流强得多**

论文里做了一个非常直接的对比实验,如果只用空间流,单独训练一个网络去看静态画面判断动作,在UCF-101上的准确率是72.6%。

如果只用时序流,单独训练一个网络去看光流场判断运动,准确率能到81%左右。

而把两条流的预测结果做加权融合之后,准确率跳到了88%。

这个结果说明两件事。

第一,运动信息本身比静态画面信息更能反映动作类别,这也验证了研究者最初的判断,视频识别的关键难点确实在于时间维度上的信息,而不是空间维度。

第二,空间流和时序流学到的东西是互补的,不是重复的。

单独用空间流,准确率是72.6%。

单独用时序流,能到81%左右。

两者融合,88%。

这组数字放在一起看会很有意思。如果两条流学到的信息高度重合,融合之后的效果应该跟表现更好的那条流差不多,不会有明显提升。但事实是融合之后反而比任何单条流都高出好几个百分点,这说明空间流看到了时序流看不到的东西,比如场景和物体这些静态线索,时序流也看到了空间流看不到的东西,比如动作的具体运动轨迹。两者结合才能对动作有一个完整的判断。

这就像判断一个人是不是在打篮球,光看他站在什么场地、穿什么衣服,能猜到七八成,但如果同时还看到他手臂挥动投篮的动作轨迹,把两种信息叠加起来判断,准确率自然会比只看一种信息高得多。如果只依赖场地和穿着这类静态线索,你可能会把一个站在篮球场上聊天的人误判成正在打球,而只看动作轨迹,你可能分不清这个人是在打篮球还是在打排球,因为挥臂动作有点像。两种信息各自都有盲区,只有合在一起盲区才能互相填补。

**这篇论文的历史分量**

这是深度学习在视频动作识别任务上第一次真正赢过手工特征方法。

在2014年,这句话的分量不亚于两年前AlexNet在图像分类上的横空出世。要知道在这篇论文出现之前,深度学习方法在这个任务上落后了将近20个百分点,很多人已经开始怀疑深度学习是不是根本不适合视频这种带时间维度的数据。双流网络把这个差距一下子填平,甚至反超了当时最好的手工特征方法。

有意思的是,Simonyan和Zisserman是牛津大学同一个研究组的成员,他们几个月后又发表了另一篇影响深远的论文,提出了VGGNet这个图像分类网络架构。这两篇论文几乎是同期完成的工作,说明这个研究组当时同时在图像和视频两条战线上摸索深度网络的设计规律,而这两条战线上的经验很可能是互相渗透的。

双流网络这个思路后来被大量后续工作继承和扩展。

3年后,Feichtenhofer等人在2016年的论文里把双流网络的融合方式做了改进,提出在网络中间层就进行融合,而不是等到最后输出结果才融合,这让空间信息和运动信息能更早地互相校正,进一步提升了准确率。

到了2017年,DeepMind团队发表了I3D网络,这篇论文把双流网络的思路从二维卷积扩展到三维卷积,直接在时间维度上做卷积操作,不再需要事先计算光流,同时借助大规模的Kinetics数据集做预训练,把动作识别的准确率又推高了一大截,在UCF-101上突破了95%。

这两个后续工作都是站在双流网络划定的基本框架上继续往前走的,一个是优化了信息融合的时机,一个是用更强的网络结构和更大的数据集去逼近问题的上限,但双流网络提出的"把空间和运动分开处理再融合"这个核心思想,一直延续了很多年。

写在后面

读这篇论文最触动我的地方,不是双流网络最后拿到了多高的准确率,而是研究者面对一个"深度学习打不过老办法"的尴尬局面时,没有选择硬着头皮加大网络、加深层数去死磕,而是先停下来想清楚问题出在哪。

他们意识到问题不在于网络不够强,而在于给网络的信息不对。原始视频帧里的运动信息太隐晦,网络很难自己挖出来,那就干脆把运动信息提前算好、摆在网络面前。这种"先想清楚问题的本质再动手设计架构"的思路,比堆参数堆算力要难得多,但往往才是真正突破瓶颈的方式。

还有一个细节值得单独说一说,光流场本身是传统计算机视觉几十年积累下来的技术,双流网络并没有抛弃这些"老办法",而是把它们当作深度学习的输入前处理步骤,让新旧技术各自发挥所长。这跟当时很多人认为深度学习会彻底取代传统方法的预期是相反的,事实证明,传统方法提炼出的结构化信息,反而能让深度网络学得更快更好。

这篇论文没有解决的问题也很明显,双流网络需要提前计算光流,这个计算过程本身很耗时,没办法做到实时,而且两条流是分开训练再融合的,没有做到端到端的联合优化,这些问题都是后来的研究者花了好几年才逐步啃下来的。

一个方法能不能被记住,有时候不在于它多聪明,而在于它有没有把一个模糊的问题拆成了两个清晰的问题。空间是什么,运动是什么,拆开问,答案就没那么难找了。

Q&A

Q1:双流网络是什么?

A:双流网络是2014年由牛津大学研究者Simonyan和Zisserman提出的视频动作识别架构,它把视频识别拆成空间流和时序流两个独立的卷积神经网络分别处理,再融合两边的判断结果,是深度学习首次在这个任务上超越手工特征方法。

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

A:因为直接让网络从原始像素里反推运动信息负担太重,训练数据又有限,效果不好。光流场提前把每个像素点的运动方向和幅度计算好,网络只需要学习运动模式和动作类别的对应关系,效率更高,效果也更好。

Q3:双流网络对后续研究有什么影响?

A:2016年Feichtenhofer等人改进了融合方式,让信息在网络中间层就开始融合。2017年DeepMind提出I3D网络,把二维卷积扩展成三维卷积并结合大规模数据集训练,准确率进一步提升到95%以上,两者都延续了双流网络"空间与运动分开处理"的核心思路。