2014年,深度学习已经在图片识别上打出了名声。AlexNet两年前刚刚横扫ImageNet,卷积神经网络这个词开始出现在各种论文标题里。
但有一件事让做视频研究的人很尴尬。
如果你想让神经网络认出一段视频里的人在做什么动作,比如是在挥拍打网球还是在挥手告别,当时最好的深度学习方法准确率只有65.4%左右。而一个叫做密集轨迹的老派手工特征方法,准确率却能做到87.9%。
差了22个百分点。
这个数字意味着什么?意味着每做10次动作识别,深度学习方法就要比老方法多认错2到3次。在图片识别上大杀四方的神经网络,碰到视频就哑火了,这确实让人纳闷。为什么图片可以,视频不行?
视频比图片难在哪
图片识别的核心是认物体,一只猫、一辆车,信息全部装在一张静止的画面里。
视频不一样。
一个动作是一个时间过程,你不能只看一帧画面就知道这个人在做什么。他可能只是站着不动,下一秒才会挥手。
真正携带"动作"信息的,不是画面里有什么东西,而是东西怎么动的。
这就是问题所在。当时的深度学习方法大多是把视频的每一帧当成一张图片来处理,再想办法把多帧的结果拼起来。这种做法学到的更多是"画面里有什么",而不是"画面在怎么变化"。
就像你想判断一个人是不是在笑,如果只给你一张脸的照片,你其实很难分清是在笑还是在做鬼脸,但如果给你一段嘴角慢慢上扬的过程,答案立刻清楚了。静止的画面丢掉了运动本身携带的信息,而运动信息恰恰是动作识别最需要的东西。
两条流,一个认形状,一个认动作
这篇论文的作者是Karen Simonyan和Andrew Zisserman,来自牛津大学。有意思的是,这两位几个月后又发表了另一篇更出名的论文,提出了VGGNet,后来成为图像识别领域最常用的骨干网络之一。这篇双流网络的论文和VGGNet几乎是同期完成的工作,某种程度上是同一群人在同一个思路下的两次探索。
他们的做法是,不再逼着一个网络同时学会认物体和认动作,而是搭两个网络,分工明确。
一个叫空间流
> 空间流:一个卷积神经网络,输入是视频里的单张静止画面,负责识别画面中的场景、人物、物体这些静态信息。
另一个叫时间流
> 时间流:另一个卷积神经网络,输入不是画面本身,而是描述运动方向和幅度的光流场,专门负责捕捉动作信息。
这里绕不开一个关键概念,光流。
> 光流:描述视频中每个像素点从一帧到下一帧移动方向和速度的一种表示方式,可以理解成给画面里的每个点都画一个箭头,指出它接下来往哪个方向、以多快速度移动。
空间流网络看到的还是普通照片,该识别人还是识别球场、识别球拍,这跟AlexNet做的事情几乎一样。
时间流网络看到的完全是另一种东西,一张由无数箭头组成的图,箭头指向哪里、长短如何,直接反映了画面里的运动状态。作者把连续10帧的光流叠在一起塞给网络,让它一次性看到一小段时间窗口内的运动轨迹。
最后,两个网络各自算出一个判断,再通过简单的加权或者训练一个小分类器把两个判断融合起来,得出最终结果。
这套设计叫做双流卷积网络。
> 双流卷积网络:由空间流和时间流两个独立卷积神经网络组成的架构,分别处理画面内容和运动信息,最后融合两者的判断结果来识别视频中的动作。
为什么要这样分开,而不是让一个网络把画面和运动都学会?
这里有个现实的困境。如果直接把原始视频喂给一个网络,让它自己去发现哪些像素在动、动得多快,这其实是在逼一个卷积网络从零学会做光流估计这件极其精细的底层视觉任务,同时还要学会识别物体和场景。这两件事的性质差别很大,一个是低层次的像素运动计算,一个是高层次的语义理解,硬塞进一个网络里,训练难度会陡增,而且当时能用来训练的动作识别数据集规模很小,根本喂不饱一个要同时学两件复杂事情的网络。
不如把运动计算这部分先用传统方法做好,算出光流,再把它当成一种新的"图像"直接喂给一个专门的网络去学。这样时间流网络不需要自己发明轮子,它拿到的输入本身已经把运动信息显式地摆在那里了,它要做的只是学会怎么从这些运动模式里读出"这是打网球还是拉小提琴"。
这就像请两个专科医生看一个病人,而不是硬要一个全科医生同时精通骨科和心脏科。骨科医生只看X光片,判断骨头有没有问题,心脏科医生只看心电图,判断心脏节律是否正常,两人各自出一份诊断报告,最后综合起来给出结论。如果非要让一个医生同时精通两门,又要在短时间内培养出来,大概率哪个都学不精。分开训练,各自专注,再融合结果,这是双流网络背后的逻辑。
如果不分开会怎样?论文里做了对照实验,只用单独的空间流网络,准确率是72.6%。而完整的双流网络能做到88%左右。这中间16个百分点的差距,几乎完全来自加入了时间流之后带来的运动信息。这说明画面内容确实重要,但对动作识别来说,运动信息的分量甚至更重。
光流网络学到了什么
论文里还有一个挺打动人的细节,他们把时间流网络第一层卷积核可视化出来看。
结果发现,这些卷积核大多呈现出明显的方向性,像是一组组指向不同方位的条纹滤波器。
这不是人为设计出来的,是网络自己从数据里学出来的。这说明网络确实抓住了光流场里最核心的信息,运动的方向性,而不是别的什么无关噪声。这也从侧面印证了双流架构这个设计思路是对的,时间流网络真的学到了运动模式,而不是稀里糊涂地在凭空拟合。
数据说话
论文在两个标准数据集上做了测试,UCF-101和HMDB-51,这是当时动作识别领域最常用的两个基准。
| 方法 | UCF-101准确率 | HMDB-51准确率 |
|---|---|---|
| 单独空间流网络 | 72.6% | 40.5% |
| 单独时间流网络 | 81.0% | 55.4% |
| 密集轨迹(手工特征,此前最强方法) | 87.9% | 57.2% |
| **双流卷积网络(融合后)** | **88.0%** | **59.4%** |
可以看到几个层次很清楚的信息。
单独的时间流网络效果居然比空间流网络强不少,81.0%对72.6%,这再次印证了运动信息对动作识别的重要性超过静态画面内容。
而把两条流融合起来之后,准确率终于追上甚至略微超过了手工特征方法。这是深度学习第一次在视频动作识别这个任务上打平并小幅超越此前称霸多年的手工特征方法,这个时间点是2014年,意义不亚于两年前AlexNet在图片识别上的横空出世。
后来的故事
这篇论文提出的双流思路影响相当直接。
2016年,Christoph Feichtenhofer等人发表了论文,提出了时序分段网络的改进思路,把双流网络里对时间维度的建模做得更精细,通过在整段视频里稀疏采样多个片段,再把各片段的预测结果聚合起来,进一步提升了长视频的识别效果,论文名字是Temporal Segment Networks。
2017年,DeepMind团队的Joao Carreira和Andrew Zisserman(没错,还是Zisserman)发表了I3D网络的论文,把双流网络的思路从二维卷积扩展成三维卷积,直接让网络在时间和空间两个维度上同时做卷积运算,不再需要单独计算光流作为中间步骤,并且引入了Kinetics这个大规模视频数据集进行预训练,把动作识别的准确率又往上推了一大截。
这两篇后续工作有个共同点,都承认双流网络提出的核心洞察是对的,运动信息和画面内容需要被区别对待,只是后来的方法在如何更高效地捕捉运动信息这件事上做了不同的改进。
写在后面
读这篇论文最触动我的地方,其实不是准确率数字本身,而是那个第一层卷积核可视化的小细节。
一个网络在没有人告诉它"运动有方向性"这个先验知识的情况下,自己从海量光流数据里总结出了方向性滤波器,这件事本身有点像是在说,只要给对了输入形式,网络自己能发现物理世界里那些人类早就知道、但没有明确写进代码里的规律。
这也让我想起后来读到的一些多模态模型的设计逻辑,很多时候研究者纠结的不是模型该多大、该多深,而是输入的表示形式对不对。双流网络没有堆更大的网络,它做的事情是换了一种更适合任务的输入方式,光流场比原始像素更直接地暴露了运动信息,这个选择本身比架构设计更重要。
论文没有解决的问题,其实也挺明显。光流的计算本身在当时依赖传统算法,速度慢、计算量大,双流网络本质上是把一部分负担甩给了传统方法。这也是为什么三年后的I3D要想办法用三维卷积直接从原始视频里学运动特征,绕开显式计算光流这一步。
如果一个模型的输入方式本身携带了任务需要的核心信息,那模型要学的东西会不会自动变简单?这个问题好像不只是视频识别领域该问的。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是2014年由牛津大学的Karen Simonyan和Andrew Zisserman提出的视频动作识别方法,由空间流和时间流两个卷积神经网络组成,分别处理画面内容和运动信息,最后融合两者结果来识别视频中的动作。
Q2:双流卷积网络为什么要把空间流和时间流分开?
A:因为静态画面和运动信息是两种性质不同的信息,硬塞进一个网络同时学习难度很大,当时的数据集规模也不足以支撑。分开训练让每个网络专注于自己擅长的任务,最后融合判断结果,效果比合在一起训练更好。
Q3:双流卷积网络的效果如何,有没有超过传统手工特征方法?
A:在UCF-101数据集上,双流网络融合后达到88.0%的准确率,超过了当时最强的手工特征方法密集轨迹的87.9%,这是深度学习第一次在视频动作识别任务上追平并小幅超越手工特征方法。