2014 年,计算机视觉圈里有一件让很多人不太舒服的事。
图像识别领域早就被深度学习占领了。2012 年 AlexNet 一炮而红之后,卷积神经网络在静态图片上的表现已经把传统方法甩开好几个身位,没人再怀疑深度学习是不是能处理图像了。
但视频不一样。
如果你去看当时视频动作识别的排行榜,最靠前的方法几乎清一色是一种叫密集轨迹的手工特征方法。
> 密集轨迹*:一种传统的视频特征提取方法,通过在视频画面里密集采样大量点,追踪这些点随时间的运动轨迹,再统计轨迹周围的图像和运动信息来描述动作。
这个方法在 UCF-101 这类标准测试集上能拿到大约 85%到 87%的准确率,而当时最好的深度学习方法只能做到 65%到 70%左右。中间差了近 20 个百分点。
20 个百分点的差距,意味着什么?意味着每 5 个动作里,深度学习就要比手工方法多认错 1 个。这在当时几乎成了一个共识:深度学习也许擅长认猫认狗,但一到"理解动作"这件事上,它就是不如人工设计的特征聪明。
Karen Simonyan 和 Andrew Zisserman,牛津大学的两位研究者,决定去搞清楚问题到底出在哪。他们后来把答案写成了一篇论文,题目叫《用于视频动作识别的双流卷积网络》。这篇论文做的事情,简单说就是一句话:让深度学习第一次在动作识别上追平甚至超过了手工特征。
问题出在哪:网络只学到了"长什么样",没学到"怎么动"
要理解双流网络的巧妙之处,得先搞清楚之前的深度学习方法到底哪里不对劲。
当时研究者试过最直接的做法:把视频当成一堆图片,直接扔给一个卷积网络,让网络自己去学习"动作"是什么样子。
这个思路听起来没什么问题,图像识别不就是这么干的吗?但视频和图片有一个本质区别,图片是静态的空间信息,视频是随时间变化的动态信息。一个网络如果只看单帧画面,它顶多能学到"这个人站在球场上",但学不到"这个人正在挥拍"。
单帧图像能提供的是空间线索,场景、物体、人的姿态。而真正定义一个动作的东西,往往藏在帧与帧之间的变化里,也就是运动信息。
这就像你给一个从没看过运动比赛的人看一张照片,照片里有个人举着球拍站在网前。他能猜出这是打网球,但他猜不出这个人下一秒是要发球还是要接球,因为静止的照片里没有"动"这件事。如果你不给他看连续的画面,他永远只能靠猜。
Simonyan 和 Zisserman 的判断是,之前的深度学习方法之所以打不过手工特征,就是因为网络被迫从原始像素里,同时,学习"这是什么"和"它在怎么动"这两件完全不同的事情,而卷积网络的结构天生更擅长处理空间模式,不擅长直接从像素变化里提炼运动规律。
核心思路:把"认物体"和"看动作"拆成两个独立的网络
他们的解决方案听起来简单到有点朴素:既然一个网络很难同时学好空间信息和时间信息,那就别让它同时学,直接拆成两个网络,一个专门看空间,一个专门看时间,最后把两边的判断结果加起来。
这就是"双流"的意思。
> 双流卷积网络*:由两个独立的卷积神经网络组成的模型,一个叫空间流,输入单帧RGB图像,负责识别场景和物体;另一个叫时间流,输入光流场,负责捕捉运动模式;两者的预测结果最后融合得到最终判断。
空间流这一路其实和当时做图像分类的网络没什么本质区别,输入就是视频里随便抽出来的一帧彩色画面,网络结构借鉴了当时在 ImageNet 上表现很好的架构。它能学到什么?画面里有没有球拍,有没有游泳池,有没有一张床。这些静态信息本身就对判断动作类别很有用,你看到泳池,大概率是在游泳而不是在拉小提琴。
时间流才是这篇论文真正的巧思所在。它的输入不是图像,而是光流场。
> 光流*:描述图像序列中像素点随时间运动方向和速度的一种表示方法,可以理解成给画面里每个点画一个箭头,指出它接下来会往哪个方向移动、移动多快。
光流场把"运动"这个抽象概念变成了一张可以被卷积网络直接处理的图像。原本藏在多帧像素变化里的运动信息,被显式地计算出来,变成了水平方向和垂直方向两张位移图,然后堆叠若干帧的光流图作为时间流网络的输入。
这个设计背后的逻辑其实是一种"分工"的智慧。让网络自己从原始像素里领悟运动规律,太难了,相当于让一个刚学画画的孩子同时学会画静物和捕捉风吹树叶摆动的规律。但如果你先帮他把"风往哪吹、树叶怎么摆"这件事用箭头标出来,他只需要专心学"看到这些箭头模式该联想到什么动作",任务就简单多了。
光流计算本身用的是传统计算机视觉里已经很成熟的算法,这里没有让网络重新发明轮子,而是让网络站在已有工具的肩膀上,专心做自己最擅长的事,从结构化的运动信息里提炼高层语义。
如果不这样拆分会怎样?论文里的对比实验给出了答案。单独用空间流,也就是只看单帧图片,在 UCF-101 上的准确率是 72.6%。单独用时间流,只看光流,能达到 81%还要高。而把两者融合起来,最终准确率冲到了 88%左右。
这组数字很说明问题。首先,时间流单独的表现居然比空间流还好,这说明动作识别里,运动信息比场景信息更重要,这和很多人的直觉可能是相反的,大家往往下意识觉得"背景环境"才是识别动作的关键线索,但数据显示运动模式本身携带的信息量更大。其次,两者融合之后的提升,从 81%到 88%,证明这两路信息确实是互补的,不是重复的。
这就好比破案的时候,一个侦探只看案发现场的照片,能推断出这里发生过打斗,但推断不出打斗的具体过程;另一个侦探拿到了监控录像里人物移动轨迹的记录,能看出动作节奏但不知道现场是什么环境。两个人分头调查,最后把线索拼在一起,比任何一个人单独破案都准。如果强行让一个侦探既要记住现场细节又要精确追踪每一步动作轨迹,他大概两件事都做不好。
数据不够怎么办:借用图像识别的成熟数据集做迁移
双流网络还面临一个现实问题:训练一个深度网络需要大量标注数据,而当时视频动作识别的数据集,像 UCF-101,只有一万多个视频片段,比起 ImageNet 动辄上百万张图片,规模差了两个量级。
数据不够,网络很容易过拟合,学到的不是"动作的通用规律",而是"训练集里这几个视频的偶然特征"。
Simonyan 和 Zisserman 采用了一个当时已经开始流行但还没被充分验证的思路:用在大规模图像数据集上预训练好的网络权重,作为空间流网络的初始化起点,再在小规模的视频数据上做微调。
> 预训练与微调*:先在数据量巨大的相关任务上训练出一套网络参数,再把这套参数迁移到目标任务上,用少量目标数据继续训练调整,这样可以大幅缓解目标任务数据不足的问题。
这个做法的道理并不复杂,一个已经在几百万张图片上学会了"识别边缘、纹理、物体轮廓"的网络,它学到的底层视觉规律,比如什么样的像素组合构成一条边、一个圆,这些规律对任何视觉任务都是通用的。让这样一个网络去学习动作识别,相当于让一个已经精通素描的人去学油画,他不需要从零开始学"什么是线条",只需要学油画特有的技巧。
这就像一个已经会说流利英语的人去学习法律英语。他不需要从字母开始学起,他只需要在已有的语言能力基础上,补充法律领域特有的词汇和表达方式。如果让一个完全不懂英语的人直接去学法律英语,那需要的时间和数据量会多得多,学习效果也会差很多。
这个迁移学习的策略后来被证明是极其重要的一环,直接影响了整个视频理解领域后续几年的研究范式。
训练细节里的取舍:多帧堆叠与数据增强
时间流网络具体怎么处理光流输入,论文里也有讲究。
单帧光流其实信息量有限,只反映了两帧之间瞬间的运动。为了让网络看到更长时间跨度的运动模式,研究者把连续多帧,比如 10 帧,的光流图堆叠在一起作为一个输入,水平和垂直方向各 10 张,一共 20 个通道。
这个设计的考量在于,动作往往是有节奏、有持续性的过程,比如挥高尔夫球杆是一个完整的挥动弧线,如果只看一瞬间的位移,网络很难判断这是挥杆动作还是别的什么摆动。堆叠多帧相当于给网络一个"运动的小电影",而不是"运动的一张快照"。
论文里还专门做了消融实验,对比了不同堆叠帧数对准确率的影响,结果显示堆叠帧数增加确实能提升准确率,但提升会逐渐饱和,说明太长的时间窗口带来的边际收益会递减,网络能利用的运动上下文是有限度的,不是越长越好。
此外,两路网络在训练时都用了数据增强手段,比如随机裁剪、水平翻转,这些做法在图像分类里已经是标准操作,目的是让训练数据看起来更丰富,减少网络对训练集里偶然出现的特定角度、特定位置的过拟合。
融合方式的选择:直接相加还是训练一个分类器
两路网络各自输出一个动作类别的概率分布,最后怎么把它们合并成一个最终判断?
论文里尝试了两种融合方式,一种是简单地把两路的输出概率取平均,另一种是训练一个小型的支持向量机分类器,把两路的输出分数作为特征输入,学习一个加权组合方式。
> 支持向量机*:一种经典的机器学习分类算法,通过寻找一个最优的分隔边界来区分不同类别的数据点。
实验结果显示,用支持向量机融合的效果略好于简单平均,这说明空间流和时间流对不同类别动作的判断可靠程度是不一样的,有些动作,比如需要看清背景环境的,空间流更靠谱;有些动作,比如动作幅度大但环境相似的,时间流更靠谱。让一个分类器去学习这种权重分配,比死板地各打五十大板要聪明一些。
这也提示了一个更普遍的道理:融合多个信息源的时候,简单相加是最容易实现的方案,但往往不是最优的,因为不同信息源的可靠度在不同情境下是变化的,值得用数据驱动的方式去学习这个权重,而不是拍脑袋决定。
实验结果:在两个标准数据集上验证
论文在两个当时主流的动作识别数据集上做了测试,一个是 UCF-101,包含 101 类动作,超过一万三千个视频片段;另一个是 HMDB-51,包含 51 类动作,规模更小,难度也被认为更高。
| 方法 | UCF-101 准确率 | HMDB-51 准确率 |
| 空间流单独 | 72.6% | 40.5% |
| 时间流单独 | 81.0% | 54.6% |
| **双流融合(SVM融合)** | **88.0%** | **59.4%** |
| 同期最好的手工特征方法(密集轨迹改进版) | 87.9% | 57.2% |
从这张表能看出两件事。
第一,双流融合确实比任何单路网络都强,验证了空间信息和运动信息互补的判断。
第二,也是最关键的一点,双流网络的准确率首次追平甚至略微超过了当时最强的手工特征方法。
这句话放在 2014 年的语境下,分量不亚于两年前 AlexNet 在图像分类上的横空出世。它意味着深度学习不再是"擅长图像、不擅长视频"的偏科生,只要给网络喂对信息,把运动这个维度显式地表示出来,它同样能在视频理解上和几十年积累下来的手工特征方法掰手腕,甚至小幅超越。
值得一提的是,Simonyan 正是几个月后发表 VGGNet 的同一个研究组的成员,VGGNet 后来成为图像分类领域影响深远的经典网络架构之一。这两项工作几乎是同期进行的,某种程度上双流网络的空间流部分也借鉴了同组正在打磨的网络设计经验,这种研究上的相互滋养,在学术圈里其实很常见。
后续影响:光流融合的思路被反复验证和扩展
双流网络提出之后,后续的研究者们围绕这个框架做了大量延伸。
2015 年,Wang 等人发表的论文把双流网络和轨迹特征结合起来,提出了 TDD 方法(轨迹池化深度卷积描述子),把深度学习提取的特征沿着密集轨迹的路径去池化,相当于把手工特征里"追踪运动轨迹"的思路和深度学习的特征表示能力结合,进一步把 UCF-101 上的准确率推高到 90%以上。
2016 年,Feichtenhofer、Pinz 和 Zisserman(还是同一个 Zisserman)发表了《卷积双流网络融合用于视频动作识别》,系统研究了两路网络应该在网络的哪一层进行融合效果最好,发现在网络中间层就开始融合空间和时间信息,效果比只在最后输出层融合更好,这个发现直接改进了原始双流网络"两路完全独立到最后才合并"的设计。
再往后,2017 年 Carreira 和 Zisserman(依然有 Zisserman)提出了 I3D 网络(膨胀三维卷积网络),把双流网络的思路和三维卷积结合,用三维卷积核直接从连续帧里提取时空特征,同时保留了双流结构,并在更大规模的 Kinetics 数据集上做预训练,进一步把动作识别的准确率推向新高度,这篇论文后来成为视频理解领域另一个重要的基准方法。
从光流表示运动,到轨迹池化,到多层融合,到三维卷积,这条技术演进的脉络清晰地说明了一件事,双流网络提出的核心洞察,空间信息和运动信息需要被区别对待、显式建模,在后续几年里被反复验证,即便具体的网络结构一直在变化。
写在后面
这篇论文最让我意外的一点,是时间流单独的表现居然比空间流更好。这和大多数人的直觉是相反的,我们下意识觉得"看清楚场景里有什么"应该是识别动作最重要的线索,但数据说明运动的模式本身携带的信息量更大。
这其实提示了一个更普遍的问题:很多时候我们以为某个信息源是主要的,仅仅是因为它更容易被观察和描述,一张静止的照片,而不是因为它真的信息量最大。光流这种把"变化"显式表示出来的做法,某种程度上是在提醒我们,有些重要的信息一直存在,只是没有被合适的方式呈现出来。
论文里还有一个没有被充分讨论的问题:光流本身的计算依赖传统算法,这些算法在快速运动、遮挡、光照变化的场景下并不总是准确,双流网络的时间流表现再好,也受限于光流估计的质量上限。这个问题后来在三维卷积方法兴起后被绕开了,但当时这个限制其实一直悬在那里,没有被彻底解决。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是由 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别模型,由空间流和时间流两个独立卷积网络组成,空间流处理单帧图像识别场景物体,时间流处理光流场捕捉运动信息,两路结果融合后输出最终动作类别判断,是深度学习第一次在动作识别任务上追平手工特征方法的成果。
Q2:为什么双流网络要把空间信息和时间信息分开处理?
A:因为让一个网络同时从原始像素学习"是什么"和"怎么动"太难,卷积网络结构更擅长处理空间模式,不擅长直接从像素变化提炼运动规律。拆成两路后,时间流用光流场把运动显式表示出来,网络只需要专心学习从运动模式里识别动作,实验证明这样效果远好于单一网络直接处理。
Q3:双流网络之后有哪些重要的后续研究?
A:2015 年 Wang 等人提出 TDD 方法,把双流特征和轨迹池化结合;2016 年 Feichtenhofer 等人研究了空间流和时间流在网络中间层融合的效果,比只在末端融合更好;2017 年 Carreira 和 Zisserman 提出 I3D 网络,把双流思路和三维卷积结合,在 Kinetics 数据集上进一步提升了准确率。
热门跟贴