你有没有想过,想让机器真正看懂一个人正在做什么动作,到底有多难?

比如你看一段视频,里面有人正在挥棒,这件事对人类来说几乎是一眼就能判断出来。可对机器而言,这背后其实包含着两类完全不同的信息。第一类是画面里有什么,比如球棒、人物、球场,这属于静态外观信息。第二类是这些目标是怎么动的,比如球棒挥动的轨迹、速度和方向,这属于动态运动信息。人脑处理这两类信息几乎是无缝完成的,但对2014年的深度学习视频理解技术来说,这恰恰是两道很难跨过去的门槛。
那一年,卷积神经网络在图像识别领域已经取得了非常亮眼的成绩。前一年,AlexNet横空出世,把图像分类错误率大幅拉开,整个计算机视觉领域都在迅速向深度学习转型。可奇怪的是,同样的网络结构,一旦迁移到视频动作识别任务上,效果却突然不理想了。
当时最强的手工特征方法,叫做improved Trajectories
**improved Trajectories(改进轨迹特征)**:一种手工设计的视频动作识别方法,通过跟踪像素点的运动轨迹并提取特征来判断动作类别,在深度学习出现前长期占据准确率榜首。
它在UCF-101这个经典动作识别测试集上能达到87.9%的准确率。而同期表现最好的深度学习方法,大约只能做到65.4%。这个差距接近22个百分点,意味着什么?意味着每识别5个动作,深度学习方法就要比手工特征多错一个还不止。这种差距放在图像识别领域几乎难以想象:本该更先进的深度学习,在视频动作识别上却被一个“老派”的手工方法压制了两年多。
这篇论文的两位作者,Karen Simonyan和Andrew Zisserman,来自牛津大学视觉几何组。有意思的是,他们几个月后还发表了另一篇著名论文,也就是后来的VGGNet,最终成为图像识别领域最经典的网络架构之一。这两篇工作几乎同时期完成,你可以想象,当时他们脑子里一直在思考两个问题:图片怎么分类,视频怎么理解。而正是视频动作识别这道题,逼着他们提出了一个后来影响深远的关键思路。
问题到底难在哪:一张图片不会动,但一段视频会
先来看,为什么不能直接把图像分类网络照搬到视频动作识别任务里。
卷积神经网络之所以在图片识别上表现优秀,是因为它可以从像素中逐层学习边缘、纹理、形状等视觉特征,再进一步组合成更抽象的语义概念,比如“这是一只猫”。这套逻辑在单张静态图像上完全成立,因为图片里的关键信息都集中在这一帧里。
但动作本质上是一个时间概念。以挥棒为例,如果你只看其中某一帧,也许能猜到这是棒球场景,但却很难判断球棒是在上举、挥出,还是刚刚收势。要理解动作,必须结合连续多帧视频内容,才能判断运动的方向、速度和变化过程。
这就像你想判断一个人是在向你鞠躬,还是刚刚从弯腰状态站起来,如果只看一张照片,那个九十度弯腰的姿势可能同时属于这两个动作中的某一瞬间。只有看到前后动作变化,你才能真正判断他在做什么。
如果只是把视频的每一帧都送进图像分类网络,再把结果做平均或投票,那么网络学到的往往只是“某个场景里常出现什么物体”,比如泳池边经常对应“游泳”这个类别,而不是对动作本身的真实理解。这也解释了为什么早期直接套用图像网络的视频分类方法,总是碰不到手工特征方法的上限。因为像轨迹特征这类传统动作识别方法,从设计之初就是围绕“像素如何运动”来建模的。
核心方法:把一个问题拆成两条视线来看
Simonyan和Zisserman给出的解决方案,现在回头看似乎很直观,但在当时却是视频动作识别领域的一次真正突破。
他们把整个网络拆成两条独立的信息流:一条叫空间流,一条叫时间流。两条网络分别处理自己最擅长的信息,最后再把两边的预测结果融合起来。
空间流输入的是普通RGB视频帧,这部分与传统图像分类卷积网络基本一致,主要负责识别画面中有什么,比如场景、物体以及人物姿态等静态外观特征。
时间流则完全不直接看原始图像,它的输入是光流
**光流(Optical Flow)**:描述图像序列中像素点运动方向和速度的一种表示方法,通常用两张连续帧计算得出,分为水平方向和垂直方向两个分量,像一张记录了"每个像素往哪儿动、动多快"的地图。
光流本身几乎不包含颜色、纹理这类外观信息,它呈现的是纯粹的运动信号。你可以把它理解成一张由大量箭头组成的运动地图,每个箭头指向像素下一帧的运动方向,箭头长短则表示速度。这样一来,时间流卷积网络接触到的就是干净的运动模式,不容易被颜色、光照、背景等无关因素干扰。
这个设计的关键在于:把静态外观信息和动态运动信息强行塞进同一个网络里学习,效果反而不如让两个网络各自专注一部分信息,最后再融合判断结果。
这就像一个案件交给警察局处理,如果让同一个人既负责现场物证分析,又负责监控视频追踪,他很可能顾此失彼,两个方面都做不够深入。但如果拆成两个专业小组,一组专门分析现场痕迹,一组专门分析监控中的人物运动,最后再综合情报做判断,结果通常会更准确。论文中的对比实验也证明了这一点:如果不把外观和运动拆开建模,而是让一个网络同时处理两类信息,最终性能会明显变差。这说明这种“分工处理”的设计不是形式上的拆分,而是实实在在提升了动作识别准确率。

图中展示的正是这套双流卷积网络架构:输入视频被分成两路,一路是单帧RGB图像送入空间流卷积神经网络,另一路是由连续多帧计算得到的光流场送入时间流卷积网络。两路网络结构相似,但参数独立训练,最终再通过加权平均或者一个小型分类器,将两边的softmax输出融合成最终的视频动作识别结果。
时间流网络吃的到底是什么:多帧堆叠的光流
时间流网络到底如何处理运动信息,这里面有个非常关键的细节。
它并不是只看两帧之间的一次光流,而是把连续L帧(论文中L取10)对应的光流场堆叠起来,形成一个多通道输入。由于光流有水平和垂直两个方向的分量,所以10帧会形成20个通道,这些通道会被当成一张“多层图像”一起输入卷积网络。
为什么要这么做?因为单次光流只能反映两帧之间非常短暂的瞬时运动,信息量过少。像挥棒这种动作,从起始到结束可能跨越几十帧,如果网络每次只看相邻两帧之间的运动,它看到的始终只是动作碎片,很难拼出完整的动作模式。把多帧光流堆叠起来,相当于给网络提供了一段连续的“运动历史”,让它不仅能看到物体在动,还能看到这种运动是如何随着时间逐步展开的。
这有点像你在看一段慢动作回放。如果导播只给你看某一帧和下一帧之间的细微差别,你可能很难判断这是在挥拍,还是手轻微抖动了一下。但如果给你看连续十几帧叠加出来的运动轨迹,挥拍的完整弧线就会非常清楚:起手、加速、挥出、收势,整个过程一目了然。论文实验也表明,如果只用单帧光流、不进行堆叠,视频动作分类准确率会明显下降。这说明运动信息不仅重要,而且它本身的时间跨度也是识别动作类别的关键线索。
论文里还测试了另一种处理光流的方式,叫做轨迹堆叠
**轨迹堆叠(Trajectory Stacking)**:一种沿着像素运动轨迹采样光流的方式,而不是固定在同一个像素位置上采样,试图更精确地捕捉某个点随时间的运动路径。
这个想法听起来更精细,理论上似乎也更合理,因为它试图跟着像素一起走,从而更精准地描述运动过程。但实验结果显示,这种方法与简单的固定位置光流堆叠效果其实差别不大,而后者实现起来还更直接、更高效。这也是这篇论文很值得称道的一点:研究者并没有为了让方法看起来更“高级”而夸大复杂设计的价值,而是如实报告了两种方案提升有限的事实。
光流的两种算法选择:精确但慢,还是粗糙但快
既然时间流网络依赖光流,那么光流本身又该如何计算?论文在这里对比了两种主流的光流计算方法。
一种是传统光流算法,精度更高,但计算速度较慢,处理一段视频往往需要较长时间。另一种则是当时新出现的实时光流算法
**实时光流算法(Real-time Optical Flow)**:一种计算速度快、能满足实时应用需求的光流估计方法,精度上略逊于传统算法但换来了速度优势。
论文测试结果发现,使用精度略低但速度快得多的实时光流算法,最终视频分类准确率只会有很小的下降,但换来的却是数量级上的处理速度提升。这个取舍在工程应用中非常重要,因为光流计算本身就是整套视频动作识别流程中的主要计算瓶颈之一。如果坚持采用最精确但最慢的光流算法,系统在实际场景中可能根本难以落地。
这个选择背后的逻辑其实很简单。就像去医院检查一样,做一次非常精细的全身核磁共振可能要很久,但如果只是想快速判断骨头有没有骨折,一张几分钟就能完成的X光片往往已经足够。多出来的精度,如果不能显著改善判断结果,那么这部分精度在实际应用中就未必值得。双流卷积网络中的光流计算也是同样的道理:实时算法虽然牺牲了一点点精度,但并没有明显拉低最终动作识别效果,却显著提升了处理效率。
数据不够怎么办:借用图像分类的经验做迁移
深度神经网络最怕训练数据不足,而当时的视频动作识别数据集,和图像分类相比规模实在太小。UCF-101大约只有1.3万段视频,HMDB-51更少,只有几千段。相比ImageNet那种上百万张图片的数据规模,这点数据对训练深层卷积神经网络来说远远不够,非常容易出现过拟合。
论文中采用了两个办法来缓解这个问题。第一个办法是多任务学习
**多任务学习(Multi-task Learning)**:让同一个网络同时在多个相关任务上训练,共享底层特征表示,借此提高数据利用效率的一种训练策略。
具体来说,作者把UCF-101和HMDB-51两个动作识别数据集放在一起训练,网络的大部分参数共享,只在最后分别接两个不同的输出层,对应两个数据集各自的类别标签。这样一来,网络可以同时从两份数据中学习更通用的动作模式,相当于把两个小型数据集组合成了一个更有价值的训练资源。
第二个办法,是使用图像分类任务上预训练好的网络参数来初始化空间流网络,这个思路后来被广泛称为迁移学习
**迁移学习(Transfer Learning)**:将一个任务上学到的知识迁移到另一个相关任务上,通常表现为用一个任务预训练的网络参数作为另一个任务的初始化起点。
因为空间流处理的是普通图像帧,它与ImageNet图像分类任务在输入形式和底层视觉特征上非常接近,所以直接使用ImageNet预训练模型作为起点,就能省去从零开始学习边缘、纹理和形状等基础特征的过程,把有限的数据和训练能力集中在更高层的动作识别特征上。
这就像一个原本做建筑设计的人去转做游戏场景设计,他不需要从头学习空间结构、透视关系这些基础能力,因为这些底子早就具备了。他只需要在此基础上补充游戏引擎和交互设计等新知识。神经网络训练也是一样,如果空间流网络不利用ImageNet预训练参数,而是在几千段视频上从零训练,那么过拟合几乎是必然结果,最终分类准确率也会明显下降。
两条流怎么融合:简单相加还是训练一个分类器
最后一个关键问题,是如何把空间流和时间流的预测结果有效组合起来。
论文尝试了两种融合方式。第一种是对两个网络输出的softmax分数直接做加权平均,权重可以人工设置。实验发现,给时间流更高的权重时效果更好,这也从另一个角度说明,在视频动作识别任务中,运动信息的重要性往往高于静态外观信息。第二种方法则是额外训练一个支持向量机
**支持向量机(SVM)**:一种经典的机器学习分类算法,常用于在特征空间中寻找一个最优的分界面来区分不同类别。
具体做法是,把空间流和时间流输出的分类分数拼接起来,作为新的特征,再训练一个分类器完成最终判断。实验结果表明,这种融合方式比简单加权平均略好一些,因为它能够自动学习两条流之间更合理的组合关系,而不完全依赖人工设定权重。
最终成绩单:深度学习第一次赢了手工特征
说完设计细节,接下来就看最重要的结果。
| 方法 | UCF-101 准确率 | HMDB-51 准确率 |
|---|---|---|
| 单独空间流 | 72.6% | 40.5% |
| 单独时间流 | 81.2% | 54.6% |
| 双流融合(SVM) | **88.0%** | **59.4%** |
| improved Trajectories(此前最强手工特征) | 87.9% | 57.2% |
这张结果表中,最值得细看的是前两行的对比。只使用空间流,也就是只看图像外观、不看运动信息时,准确率是72.6%。而只使用时间流,也就是仅依赖运动信息、不看图像静态内容时,准确率却更高,达到了81.2%。这说明什么?这说明在动作识别任务中,运动本身往往比静态外观更关键。这与人类的直觉其实是一致的:仅凭肢体运动,我们常常就能猜出一个人正在做什么;但如果只给一张静止照片,判断往往会变得困难得多。
再看融合之后的88.0%,这就是双流网络的最终成绩,比单独空间流整整高出15个百分点。如果不做双流融合,只靠空间流单独作战,深度学习方法当时根本没法和最强手工特征方法竞争。而在融合之后,88.0%终于超过了此前长期领先的87.9%。虽然只领先了0.1个百分点,但这0.1个百分点的意义非常大——它标志着深度学习在视频动作识别领域第一次正面超越手工特征方法。这个历史时刻的重要性,并不逊色于AlexNet在图像分类上的那次突破。
在HMDB-51这个更难的动作识别数据集上,双流方法的优势更明显:59.4%对57.2%,领先了2.2个百分点。HMDB-51之所以更难,是因为里面的动作类别更细、场景变化更复杂。这也表明,双流卷积网络在更具挑战性的视频理解任务中反而展现出更稳定的优势,这对后续研究者来说是一个非常强的信号。
后续的故事:双流架构成了整个领域的地基
这篇论文的影响,并不是那种发表之后很快被遗忘的工作,而是真正开启了一整条视频动作识别研究路线。
2016年,Feichtenhofer等人在后续论文中改进了双流网络的融合方式,提出在网络更深层进行特征融合,而不是只在最后的分类分数层做简单组合。这个改进进一步提升了动作识别准确率,也证明两条流之间在中间层就已经存在可以互相借鉴的信息,而不是必须等到最后一步才融合。
2017年,Carreira和Zisserman再次带来重要工作——I3D网络。它把双流思想和3D卷积结合起来,使用3D卷积直接处理连续视频帧中的时空信息,同时还提出了规模更大的Kinetics视频数据集用于预训练。这一进展把视频动作识别性能又向前推进了一大步,在Kinetics上完成预训练后再迁移到UCF-101,准确率可以提升到98%左右。
这两项后续研究有一个共同点:它们都没有推翻双流网络“分别建模外观与运动”的核心思想,而是在这个框架基础上继续优化。一个是改进了融合的时机与方式,一个是用更通用的3D卷积逐步替代光流这类手工设计的运动表示。这恰恰说明,双流卷积网络提出的那个基本判断是正确的——视频动作识别需要同时处理静态外观信息和动态运动信息,而且这两类信息的性质并不相同。此后的十年里,整个领域基本都在这个地基上不断向上发展。
写在后面
读这篇论文时,最打动我的其实是那个15个百分点的差距:单独空间流72.6%,融合之后88.0%。这中间几乎全部来自于运动信息的加入。它提醒我们,人类在判断“这是什么动作”时,潜意识里利用的信息远比表面看起来复杂得多,不是简单认出画面里出现了什么物体就够了。
还有一个细节也很值得单独提一下。论文发现,给时间流更高权重时效果更好。这个结论在当时也许只是一个工程技巧,但往深里想,它其实暗示了一个重要问题:静态图像中的上下文线索,比如泳池边容易出现游泳动作,看起来有用,却也很容易让模型产生场景偏见;而真正更接近动作本质的信号,往往还是运动本身。这和后来大家反思深度学习模型容易“抓错重点”、过度依赖场景而不是真正理解动作,本质上说的是同一件事。
当然,这篇论文没有解决的问题也很明显。光流计算本身仍然是一个不小的性能瓶颈,而且光流是一种预先计算好的“手工设计”运动表示,并不是由网络端到端学出来的。后来的I3D用3D卷积在一定程度上绕开了这个问题,但更彻底的端到端运动表示学习,直到今天依然是视频理解领域的重要开放问题。
Q&A
Q1:双流卷积网络(Two-Stream ConvNet)是什么?
问:这是由Simonyan和Zisserman在2014年提出的一种视频动作识别方法,其将网络拆分为空间流和时间流两部分,分别处理画面外观信息和光流运动信息,最后融合两边的判断结果。那么,它的意义何在呢?
A:它在UCF - 101数据集上,首次让深度学习动作识别方法超越了手工特征方法,成为视频动作识别发展史上的关键节点。
Q2:双流网络为什么要用光流而不是直接用原始视频帧?
A:因为原始视频帧同时混合了外观信息和运动信息,网络很难把这两类性质不同的特征都学好。光流专门描述像素的运动方向和速度,不包含颜色和纹理信息,能让时间流网络专注于学习运动模式。论文结果也表明,这种拆分式视频动作识别方案能把整体准确率提升约15个百分点。
Q3:双流卷积网络对后续研究有什么影响?
A:2016年Feichtenhofer等人改进了双流网络的融合方式,在更深层进行特征融合。2017年Carreira和Zisserman提出的I3D网络,则将双流思想与3D卷积结合,并借助Kinetics大规模视频数据集预训练,把动作识别准确率进一步提升到98%左右。可以说,双流架构的核心思想一直深刻影响着后续视频理解研究。
