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

2014年之前,如果你去问任何一个做计算机视觉的研究者,"深度学习能不能识别视频里的动作",多半会得到一个尴尬的回答。

图像识别领域,深度学习已经风光无限。2012年AlexNet横空出世,把ImageNet图像分类的错误率一下子拉低了十个百分点,整个学术圈为之震动。但是把同样的思路搬到视频上,结果却总是差一口气。

最好的深度学习方法,在标准的动作识别测试集上,准确率停留在65%左右。而一个诞生于2011年、纯手工设计的方法叫做"密集轨迹"

> 密集轨迹(Dense Trajectories):一种不依赖深度学习的传统动作识别方法,通过追踪视频中密集采样点的运动轨迹,并结合手工设计的特征描述子来判断动作类别。

却能做到88%以上的准确率。

这不是小差距。这是深度学习整整落后了20多个百分点,意味着密集轨迹每识别5个动作,深度学习就要多认错1个。在图像识别上呼风唤雨的深度神经网络,碰到视频就集体失灵,这在当时是一件让很多人困惑的事情。

问题出在哪?这正是本文要讲的这篇论文试图回答的核心问题。这篇论文的作者是Karen Simonyan和Andrew Zisserman,来自牛津大学,论文题目叫《Two-Stream Convolutional Networks for Action Recognition in Videos》,发表于2014年的NeurIPS。巧合的是,这两位作者几个月后又发表了另一篇更加著名的论文,叫VGGNet,后者几乎统治了当年的ImageNet图像分类竞赛。同一个团队,同一年,一手抓图像识别,一手抓视频理解,这个细节本身就很说明问题:这是一群对视觉表征有深刻理解的人,他们不满足于"深度学习在视频上不行"这个结论,一定要搞清楚为什么。

核心问题:视频比图片难在哪

要理解这篇论文的贡献,先要搞清楚一件事:视频识别到底比图片识别难在哪里。

一张图片是空间信息的静态呈现,一个物体的形状、颜色、纹理,卷积神经网络天生擅长捕捉这些。但视频多了一个维度,时间。一个动作之所以被识别为"打网球"而不是"挥手告别",很大程度上取决于动作是怎么运动的,而不仅仅是某一帧画面里有什么东西。

早期研究者尝试过很多办法把时间信息塞进卷积网络。最直接的想法是把视频的多帧图像叠在一起,当成一个"更厚的图片"扔进网络,期待网络自己学会分辨运动模式。这类方法被称为

> 3D卷积网络:一种在网络的卷积核里加入时间维度的方法,让卷积操作同时扫描空间和时间上的相邻像素,试图直接从原始像素中学习运动特征。

结果并不理想。网络确实能学到一些东西,但效果远不如手工方法。这就好比让一个刚学会认字的孩子,直接给他一整本没有断句、没有标点的小说,让他自己去悟出里面的情节走向。理论上信息都在那里,但要从原始像素的堆叠中,自己发现"运动"这个抽象概念,对当时的网络结构和训练数据量来说太难了。如果不给出更明确的引导,网络很容易学到一堆没有意义的纹理模式,而不是真正的动作规律。

Simonyan和Zisserman的洞察是:与其让网络自己去猜运动信息藏在哪里,不如直接把运动信息喂给它。

光流:提前算好的运动地图

这个想法的关键工具叫做光流

> 光流(Optical Flow):描述视频中每一个像素点从上一帧到下一帧的运动方向和运动速度的一种表示方法,通常用一张"位移图"来呈现,图上每个点的颜色或数值代表该像素往哪个方向移动了多远。

光流本身不是这篇论文发明的,它是计算机视觉里一个历史悠久的经典概念,过去主要用在机械式的手工特征算法里。但作者的想法是,既然光流已经能够很好地捕捉运动信息,为什么不直接把它算出来,变成一张"运动地图",然后让卷积网络去学习这张地图里的模式,而不是从原始视频帧里硬啃运动信息。

这就好比你想学开车认路,有两种方式。第一种是给你一段没有任何标注的行车录像,让你自己盯着画面猜车在往哪个方向转弯、速度如何变化。第二种是有人已经帮你标好了一张箭头图,每个箭头指向车正在移动的方向和速度,你直接看箭头图学习就够了。第二种方式显然更简单直接,因为最难的"提取运动信息"这一步已经被提前做好了,你要做的只是在这个基础上学习规律。如果没有这张箭头图,你得同时兼顾"看懂画面里有什么"和"猜出它怎么动"两件事,负担会重得多。

这就是这篇论文最核心的设计决策:把光流当成一种独立的输入,单独训练一个卷积网络来处理它。

双流架构:空间流和时间流各管一段

顺着这个思路,论文提出了一个叫做双流网络

> 双流网络(Two-Stream Network):由两个独立的卷积神经网络组成的架构,一个叫空间流,专门处理单帧的静态图像来识别场景和物体,另一个叫时间流,专门处理连续帧计算出的光流图来识别运动模式,最后把两者的判断结果融合起来做出最终决定。

的架构。整个系统被拆成两条独立的处理管线。

空间流网络的输入是视频中的单独一帧图像,负责的是"这个场景里有什么东西"这类信息。比如识别出画面里有一片草地、一个球拍、一个人的身形,这些静态的场景和物体线索,对判断动作类别其实也很有帮助。想象一下,如果画面里出现了泳池,那么这个动作大概率和游泳有关,这种判断根本不需要看运动轨迹,一帧静态画面就足够了。

时间流网络的输入则是连续多帧计算出来的光流图,它不关心画面里的物体长什么样,只关心像素是怎么运动的。这条通路负责捕捉动作本身的动态特征,比如手臂挥动的轨迹、腿部摆动的节奏。

两条流各自训练完成后,把它们对每个动作类别给出的预测分数进行融合,可以是简单平均,也可以用一个支持向量机来学习更好的融合权重。最终的判断结果由两条流共同决定。

这个设计的巧妙之处在于,它把一个原本很难的问题拆解成了两个相对简单的子问题。识别静态场景,这是卷积网络已经很擅长的事情,直接沿用图像识别里成熟的网络结构就行。识别运动模式,则通过光流这个中间表示,把"运动"从原始像素中剥离出来,变成一个更规整、更容易学习的信号。

这就像一个复杂的翻译任务,如果让一个人同时兼顾"理解原文语义"和"寻找对应的目标语言表达",负担会很重,容易两头都做不好。但如果拆成两个专门的角色,一个人只负责理解原文在说什么,另一个人只负责把理解好的意思转换成流畅的目标语言,分工之后每个人的任务都变得单纯,合作的效果反而更好。如果不拆分,硬要一个网络同时学会看懂画面内容又看懂运动规律,训练难度会陡然上升,这也正是之前3D卷积网络效果不理想的原因之一。

论文里给出的原图展示了这个架构的完整流程:输入视频先被拆分成一帧静态图像和一组连续帧,静态图像送入空间流卷积网络,连续帧先计算光流再送入时间流卷积网络,两条网络各自输出对动作类别的预测,最后融合成一个结果。整张图看起来像两条平行的生产线,分别加工不同的原材料,最后在终点汇合。

光流怎么处理成网络能吃的形式

这里有个技术细节值得展开说说,因为它体现了论文作者的细心之处。

光流本身在每个像素点上有两个数值,一个是水平方向的位移,一个是垂直方向的位移。如果只用单独一帧光流,信息量太少,网络很难判断这是什么动作。所以论文的做法是把连续多帧(论文中用的是10帧)的光流叠在一起,形成一个多通道的输入,水平位移和垂直位移分别占据不同的通道,一共堆出20个通道的输入图像,这样网络在做判断的时候能够看到一小段时间窗口内的运动变化,而不只是某一瞬间的静止状态。

论文里还专门做了实验对比不同的光流叠加方式,比如是让所有的光流帧共享同一个参考坐标系,还是让每一帧光流都基于连续变化的坐标系去计算。这类细节听起来琐碎,但实验数据显示,选对了叠加方式能带来几个百分点的准确率提升,说明"怎么把运动信息喂给网络"这件事本身就有讲究,不是随便拼一下就行。

数据不够怎么办

深度学习一个绕不开的问题是,训练数据够不够。

图像识别领域有ImageNet这样的百万级标注数据集撑腰,但在2014年,视频动作识别领域最大的公开数据集也只有几千段视频,规模差了两三个数量级。数据太少,网络很容易过拟合,也就是在训练集上表现很好,但换到没见过的视频上就不灵了。

论文采取了两个应对策略。第一个是多任务学习,让网络同时在两个不同的数据集上训练,共享大部分网络参数,只在最后输出层区分不同数据集的类别体系,这样相当于变相扩充了可用的训练信号。第二个是从图像识别领域借用已经训练好的网络参数做初始化,而不是从零开始训练,这个思路后来被称为迁移学习的雏形。

这两个策略都指向同一个逻辑,数据不够的时候,想办法从其他相关任务里借力,而不是死磕手头这点数据。这就好比一个刚入职的新员工,公司内部资料不够他学习,聪明的做法是去看看隔壁部门积累的经验,或者参考同行业其他公司已经验证过的流程,而不是完全靠自己从零摸索。如果不这样做,凭当时几千段视频的规模,网络大概率会在训练集上表现完美,但一遇到新场景就彻底失灵,这在机器学习里叫过拟合,是数据量不足时最常见的陷阱。

结果:深度学习第一次赢了

说了这么多设计,最终效果怎么样?

论文在两个当时主流的动作识别数据集上做了测试,一个叫UCF-101,一个叫HMDB-51。

| 方法 | UCF-101准确率 | HMDB-51准确率 |

| 只用空间流 | 72.6% | 40.5% |

| 只用时间流 | 81.2% | 54.6% |

| 密集轨迹(手工特征基准) | 87.9% | 57.2% |

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

这张表格里有几个数字特别值得拿出来说。

只用空间流的时候,准确率只有72.6%,比双流融合之后的88.0%整整低了15个百分点。这说明单靠静态画面里的物体和场景信息,远远不足以准确判断动作类别,运动信息是不可或缺的一环。

只用时间流的时候,表现明显好于只用空间流,达到了81.2%,这也印证了光流确实携带了动作识别里最关键的信号。但即便如此,单独的时间流依然不如两者融合的效果,说明静态场景信息也不是可有可无的,它能提供光流捕捉不到的补充线索。

而最关键的一行是双流融合的结果,在UCF-101上做到了88.0%,首次追平甚至略微超过了此前称霸多年的手工特征方法密集轨迹的87.9%。在HMDB-51数据集上更是从密集轨迹的57.2%提升到了59.4%,拉开了明显差距。

这个数字放在2014年的语境里分量很重。这是深度学习第一次在视频动作识别这个具体任务上,真正打平并超越了精心设计多年的手工特征方法。要知道,就在此前一年,深度学习方法的最好成绩还只有65%左右,一年之内追平并反超一个统治了多年的老对手,这在当时的研究圈子里引起了不小的反响。

这篇论文之后发生了什么

双流网络的思路提出之后,很快成为了视频理解领域接下来几年的主流范式,后续的很多重要工作都是在这个骨架上继续添砖加瓦。

2016年,还是原来的团队里的部分成员参与提出了Temporal Segment Networks,也就是TSN网络。TSN的改进思路是,原来的双流网络只从一小段视频里采样有限的帧,信息利用得不够充分。TSN把整段视频切分成多个片段,分别从每个片段里采样帧送入双流网络,再把多个片段的预测结果聚合起来,这样能够更好地捕捉整段视频里的长时间运动模式,而不只是局部一小段动作。这个改动把UCF-101上的准确率进一步推高到了94%以上。

2017年,DeepMind团队提出了I3D网络,也就是Inflated 3D卷积网络。这个工作的思路是把双流网络里原本二维的卷积核直接"膨胀"成三维卷积核,同时结合双流架构和3D卷积网络两条路线的优点,并且借助一个新提出的更大规模的视频数据集Kinetics来训练,进一步把准确率提升到了98%左右,基本上把当时几个主流小数据集的成绩都刷到了接近饱和的水平。

这两个后续工作有一个共同的特点,它们都没有推翻双流网络的核心思想,双流网络里"用光流单独表征运动信息"这个洞察被完整地继承下来,只是在数据利用效率和网络结构细节上做了进一步优化。这也是为什么这篇2014年的论文常常被认为是视频动作识别深度学习路线的真正起点,后面几年的绝大多数工作都是在它开辟的这条路上继续往前走。

写在后面

读这篇论文最触动我的地方,是它解决问题的方式带着一种"绕道而行"的智慧。当时大家的直觉是,深度学习足够强大,应该能自己从原始视频里学出一切,包括运动信息。但Simonyan和Zisserman没有硬碰硬地死磕这个假设,而是先用光流这个经过验证的传统工具,把最难的那部分工作提前做完,再把简化后的问题交给网络。

这让我想到一个更普遍的现象,很多"深度学习打败传统方法"的故事,其实不是深度学习单枪匹马赢的,而是深度学习和传统方法的洞察结合之后才赢的。光流不是深度学习发明的,它是传统计算机视觉几十年积累下来的工具,这篇论文真正的贡献是找到了把这个老工具和新架构拼接起来的正确方式。

论文里还有一个细节我觉得值得琢磨,单独的时间流表现已经逼近甚至部分超过手工特征方法,但空间流和时间流的融合仍然带来了明显提升。这说明即便运动信息再重要,静态场景信息依然有它独特且不可替代的价值,两者不是谁取代谁的关系,而是互补关系。这个道理放在很多别的领域,可能也一样成立。

Q&A

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

A:双流卷积网络是Simonyan和Zisserman在2014年提出的视频动作识别方法,由空间流和时间流两个独立的卷积神经网络组成,空间流处理单帧图像识别场景物体,时间流处理光流图识别运动模式,两者预测结果融合后做出最终判断。

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

A:因为直接让网络从原始像素堆叠中学习运动信息太难,网络容易学到无意义的纹理而不是真正的动作规律。光流提前把运动方向和速度计算好,变成一张更规整的"运动地图",网络只需要在这个基础上学习模式,大大降低了学习难度。

Q3:双流网络的效果到底有多好,真的打败了传统方法吗?

A:在UCF-101数据集上,双流网络融合后达到88.0%的准确率,超过了此前统治多年的手工特征方法密集轨迹的87.9%;在HMDB-51数据集上更是从57.2%提升到59.4%,这是深度学习首次在视频动作识别任务上真正追平并超越传统手工特征方法。