2014年,如果你去问计算机视觉领域的研究者一个问题:深度学习能不能识别视频里的动作,大概率会得到一个尴尬的回答。
那一年,深度学习已经在静态图像识别上大杀四方了。AlexNet在2012年横空出世,把图像分类的错误率direct砍掉了十个百分点,整个学术圈都在疯狂拥抱卷积神经网络。
(相关资料图)
但只要把图像换成视频,风向就完全变了。
在动作识别这个任务上,最强的深度学习模型,打不过一套2011年发布的手工设计算法,叫做密集轨迹
密集轨迹*:一种传统的视频动作识别方法,通过追踪视频里密集分布的点随时间的运动轨迹,人工设计特征来描述动作。
这套手工方法在权威的UCF-101数据集上能做到87%左右的准确率,而深度学习模型只能徘徊在65%上下,整整落后20多个百分点。
这个差距意味着什么?意味着每识别5个动作,深度学习就要比手工方法多认错1个以上。这在当时几乎被认为是深度学习的天花板,因为视频比图像多了一个维度,时间。神经网络看图像很厉害,但一旦要处理"动作"这种发生在时间轴上的信息,好像就抓瞎了。
这个僵局,直到牛津大学的Karen Simonyan和Andrew Zisserman发表了一篇论文才被打破。
有意思的是,这两位学者几个月后就发表了另一篇改变历史的论文,VGGNet。也就是说,他们几乎是同时在打磨两套截然不同的思路,一套用来分类图片,一套用来识别视频动作。这背后透出的是同一个研究团队对卷积网络能力边界的持续试探。
问题出在哪:视频比图像难在哪里
要理解这篇论文的巧妙之处,得先搞清楚为什么"看视频"比"看图片"难得多。
一张静态图片,你看一眼就知道里面有没有猫、有没有人。但一段视频里的"动作",本质上是一种随时间变化的模式。一个人挥手和一个人挥拳,可能在某一帧上看起来长得几乎一样,区别只在于接下来的几十帧里,手臂是怎么动的。
如果神经网络只看单张画面,就完全丢失了"怎么动"这个关键信息。这就好比你只看一张照片,判断不出照片里的人是正在坐下还是正在站起来,因为那一瞬间的姿势可能一模一样。如果不给网络任何关于运动的线索,它就只能靠猜,靠画面里的场景、道具这些静态线索去蒙一个答案,比如看到泳池就猜"游泳",看到球场就猜"打篮球",这种做法在动作细节复杂的时候必然会失灵。
之前也有研究者尝试过直接把3D卷积(在时间维度上也做卷积)扔给视频,或者用RNN来处理时序信息,但效果都不理想,跟手工特征的差距依然很大。
问题的核心矛盾是:神经网络擅长从像素里学空间模式(这是纹理、这是形状),但不擅长直接从像素序列里学出运动模式。
核心思路:把"看空间"和"看运动"这两件事拆开做
Simonyan和Zisserman的解法,说起来其实非常直白,甚至带着一种"既然合起来学不好,那就分开学"的朴素智慧。
他们设计了一个叫做双流卷积网络的架构。
双流卷积网络*:一种同时用两个独立的卷积神经网络处理视频的架构,一路专门处理静态画面(空间流),一路专门处理运动信息(时间流),最后把两路的判断结果融合起来。
具体来说,第一路网络,叫空间流,输入就是视频里的某一帧画面,跟普通的图像分类网络没有本质区别,负责识别"这个场景里有什么东西",比如识别出画面里有个游泳池,有个人。
第二路网络,叫时间流,输入不是原始画面,而是光流场
光流场*:描述视频中相邻两帧之间,画面每个像素点是怎么移动的一种表示方法,本质上是一张记录了运动方向和速度的图。
光流场把"动作"这个抽象概念,转化成了一张实实在在的图片,你可以把它想象成一张"运动地图",图上每个点都标记着这个位置的像素接下来往哪个方向、以多快的速度移动。时间流网络专门吃这种"运动地图",学习的是纯粹的动态模式,而不掺杂任何场景、颜色、纹理的干扰。
这两路网络各自独立训练,最后把两边给出的分类概率做个加权平均,谁的判断更靠谱,就多信一点谁。
这个设计好在哪里?我们可以做个类比。
假设你要判断一个人是在生气还是在开心,你可以看他的表情(这是空间信息,一张静止的脸),也可以看他说话时的语气起伏和手势动作(这是时间信息,一段变化的过程)。如果你把这两种信号强行揉在一起同时看,反而容易互相干扰,因为表情的细节和动作的节奏本来就是两种不同性质的信息,混在一起处理,网络很难同时把两件事都学到位。但如果你先专心看一遍表情,再专心看一遍动作节奏,最后综合两方面的判断,准确率往往会更高。双流网络做的正是这件事,让空间流专心学"这是什么",时间流专心学"它怎么动",两边互不干扰,各自做到最好,最后再合并意见。
如果不这样拆分会发生什么?论文里的实验其实给出了答案。单独只用空间流(只看静态画面),在UCF-101上的准确率是72.6%。这个数字本身已经说明,单靠场景和物体的静态信息,是远远不够识别复杂动作的。而把空间流和时间流结合起来之后,准确率跳到了88.0%,直接反超了当时最强的手工特征方法。
这15个百分点的提升,几乎全部来自于"运动信息"这一路的贡献,这也直接证明了之前那些直接把视频塞给3D卷积网络的方法,问题就出在它们没有专门给"运动"这件事留出一条独立的学习通道。
时间流网络具体怎么"看"运动
时间流网络的输入不是一帧图像,而是连续多帧计算出来的光流场堆叠在一起,作为一个多通道的输入。
论文里做了两种光流的表示方式对比。一种是光流的绝对位置形式,另一种是光流的相对轨迹形式(作者称之为光流沿轨迹堆叠)。后一种做法是沿着像素的运动轨迹去采样光流,而不是简单地固定在同一个空间位置堆叠,这样能更准确地捕捉一个点在时间上的连续运动。
实验发现,轨迹堆叠的方式效果更好一些,说明追踪"同一个点在动"比简单地"在同一个位置看不同帧发生了什么"更贴近运动的本质。这就像你要理解一辆车的行驶轨迹,盯着马路上固定的一个点看车流经过,远不如你的视线跟着这辆车移动来得清楚。
论文还比较了光流的方向到底该怎么编码。他们发现把光流拆成水平和垂直两个方向的分量,分别作为独立的输入通道,效果比用单一的运动幅度更好,因为方向信息本身就是区分动作类型的重要线索,挥手和挥拳的运动幅度可能差不多,但方向模式完全不同。
数据不够怎么办:多任务训练和预训练迁移
深度学习一个绕不开的老问题是,训练数据不够,网络就学不好。2014年那会儿,动作识别的数据集普遍偏小,UCF-101一共才101类动作、大约13000段视频片段,这个规模跟当时用来训练AlexNet的ImageNet(上百万张图片)根本没法比。
这就好比你想教一个孩子认识100种动物,但你手头的动物图片只有几千张,平均每种动物看不到几十张照片,孩子很容易学得一知半解,遇到没见过的姿势和角度就懵了。如果不做任何补救,网络大概率会过拟合,就是死记硬背了训练集里的那些视频,换一批新的视频立刻就不准了。
论文给出了两个补救办法。
第一个办法是空间流直接借用在ImageNet上预训练好的网络权重,因为识别"画面里有什么"这件事,跟静态图像分类本质上是相通的技能,没必要从零开始学。这就像一个已经认识了几千种物体的孩子,去学习动作识别时,不需要重新学"什么是球"、"什么是水",直接把这些已有的知识拿来用就行。
第二个办法更巧妙,叫做多任务学习
多任务学习*:让同一个神经网络同时在多个不同的数据集或任务上训练,共享大部分参数,只在最后的输出层区分不同任务,从而让网络从更多数据里学到更通用的特征。
论文让时间流网络同时在两个数据集上训练,UCF-101和另一个动作数据集HMDB-51,网络的主体结构共享,只是最后分类的那一层针对两个数据集分开设置。这样一来,网络实际上见到的训练样本量翻倍了,学到的运动特征也更加通用,不会只死记硬背某一个数据集里的特定视频。
实验证明这个办法确实管用,多任务训练让时间流网络在HMDB-51上的准确率提升了不少,说明"多个数据集互相借力"这个思路是成立的。
最终效果:历史性地反超手工特征
把空间流和时间流结合起来之后,这套双流网络在UCF-101上达到了88.0%的准确率,在HMDB-51上达到了59.4%。
作为对照,当时最强的手工特征方法(改进版的密集轨迹,通常写作IDT)在UCF-101上大约是87.9%,在HMDB-51上大约是57.2%。
这两个数字放在一起看,双流网络在两个数据集上都实现了反超,虽然差距不算悬殊,但这是深度学习第一次在视频动作识别这个任务上,正面击败经过多年打磨的手工特征方法。
这句话放在2014年的语境下,分量不亚于两年前AlexNet在图像分类上的横空出世。AlexNet证明了深度学习能在静态图像上碾压传统方法,而双流网络证明了只要架构设计得当,深度学习在时序信息更复杂的视频领域,同样能够追平甚至反超几十年积累下来的手工智慧。
下面是论文里核心结果的一个简化汇总。
| 方法 | UCF-101准确率 | HMDB-51准确率 |
| 仅空间流 | 72.6% | 40.5% |
| 仅时间流 | 83.7% | 54.6% |
| 双流网络(融合) | **88.0%** | **59.4%** |
| 改进版密集轨迹(手工特征) | 87.9% | 57.2% |
从表格里能看出一个很有意思的细节,单独的时间流(只看运动信息)比单独的空间流(只看静态画面)效果好得多,83.7%对72.6%,差了11个百分点。这说明对于"动作"这个任务而言,运动信息本身比场景、物体这些静态背景信息更加关键,这也从侧面验证了为什么之前那些忽略运动建模、只把视频当成一堆图片来处理的方法,注定会碰壁。
这篇论文之后发生了什么
双流网络这个思路一旦被验证有效,后续的研究者几乎是踩着这个框架继续往前推。
3年后,Feichtenhofer等人在2016年提出了时空融合的双流网络改进版,把两路网络在中间层就进行特征融合,而不是等到最后才简单加权平均,进一步提升了准确率。
同一时期,Carreira和Zisserman(还是同一个Zisserman)在2017年提出了I3D网络,把双流网络里的2D卷积全部换成了3D卷积,并且提出了一个专门为动作识别设计的大规模数据集Kinetics,这直接把动作识别的准确率又往上推了一大截,也让后续研究彻底摆脱了"训练数据太小"的老问题。
再往后,SlowFast网络(2019年,Feichtenhofer等人)在双流的思路上做了进一步的变体,用一路"慢速"通道捕捉细节丰富的空间语义,另一路"快速"通道以更高的帧率捕捉快速变化的运动,本质上仍然延续着"空间和时间要分开处理再融合"这个最初的设计哲学。
从这个脉络能看出来,双流网络提出的核心思想,运动信息值得用一条独立通道去专门建模,几乎成了后来五六年里视频理解领域的默认共识,直到更晚的Transformer架构出现,才开始有新的范式尝试挑战这个思路。
写在后面
写这篇论文最让我意外的一点是,光流场作为输入这件事,本质上是在用传统计算机视觉的老工具(光流计算算法本身是几十年前的技术)去喂养一个全新的深度学习系统。
这不是纯粹的"深度学习吃掉一切"的故事,而是新旧方法的一次拼接,光流负责把运动信息提炼成图像形式,卷积网络负责从这种图像里学出高层语义。
这种"用老技术给新技术搭桥"的思路,后来在很多领域都重复出现过。它提醒我们,一个领域的突破,未必总是彻头彻尾的推翻重来,有时候恰恰是找到一个巧妙的接口,把旧工具的产出,转化成新工具能吃得下的形式。
双流网络最终也被端到端的3D卷积网络和后来的Transformer架构超越了,光流计算本身的耗时也一直是这类方法的软肋。但那个最朴素的问题依然值得追问,当我们让一个模型去理解"动态"这件事的时候,到底应该让它自己从原始像素里硬学出运动的概念,还是应该像双流网络这样,先给它一个明确的"运动是什么"的提示?这个选择题,现在的研究者其实还在用不同的方式重新回答。
Q&A
Q1:双流卷积网络是什么?
A:这是Simonyan和Zisserman在2014年提出的视频动作识别架构,用两个独立的卷积网络分别处理静态画面(空间流)和运动信息(时间流),最后融合两路结果做出判断,是深度学习首次在这个任务上反超手工特征方法。
Q2:双流网络为什么要把空间信息和运动信息分开处理?
A:因为神经网络同时学习场景语义和运动模式会互相干扰,效果不好。实验显示单独的空间流只有72.6%准确率,单独的时间流能到83.7%,分开学习再融合后反而达到88.0%,说明拆分处理比混在一起学更有效。
Q3:光流场在这个方法里起什么作用?
A:光流场是把视频中像素运动方向和速度转化成的一张"运动地图",作为时间流网络的输入,让网络能专门学习动作的动态模式,而不受画面颜色、纹理等静态信息干扰。