2014 年之前,如果你去问任何一个做视频动作识别的研究者"深度学习行不行",得到的答案大概率是"不太行"。
这句话现在听起来有点意外。毕竟就在两年前,AlexNet 已经在图像识别上把传统方法打得七零八落,深度学习几乎是横扫了整个计算机视觉圈子。但是换到视频这个赛道上,情况完全不一样。
当时最强的手工特征方法叫做密集轨迹
**密集轨迹**:一种手工设计的视频特征提取方法,通过追踪视频中密集采样的点在时间上的运动轨迹,再统计轨迹周围的图像和运动信息来描述动作。
密集轨迹在几个标准测试集上的表现相当稳。而基于深度学习的方法呢,反复尝试,反复失败,始终追不上密集轨迹的准确率。这不是深度学习不努力,是视频这个东西比静态图像难啃得多。一张图片你看一眼就知道里面有没有猫,可一段视频里,猫可能在跑,可能在跳,画面里同时混杂着"这是什么"和"它在做什么"两种信息,神经网络一时不知道该抓哪头。
这篇论文要解决的就是这个卡了两年的难题。作者是 Karen Simonyan 和 Andrew Zisserman,牛津大学 VGG 组的两位研究者。有意思的是,几个月后,这两人又发表了另一篇论文,叫 VGGNet,后来成了图像识别领域最经典的网络结构之一。这两篇论文其实是同期的工作,一篇解决视频,一篇解决图像,出自同一个实验室的同一批人。
问题到底难在哪
先说清楚,识别一个视频里的动作,和识别一张图片里的物体,难度根本不是一个量级。
图片识别只需要处理空间信息,一张图有边缘、颜色、纹理,网络学会识别这些模式就够了。视频不一样,视频除了空间信息,还多了一个维度,时间。一个人挥手和一个人挥拳,静止看某一帧,姿势可能非常相似,真正区分它们的是动作随时间展开的方式,是手臂移动的速度和轨迹。
**手工特征**:不是通过网络自动学习出来的特征,而是研究者根据领域经验人为设计的特征提取规则,比如密集轨迹里的运动统计量。
如果只靠一个普通的卷积神经网络去啃视频,把每一帧当图片处理,再把结果拼起来,会发生什么?网络确实能学到一部分空间外观信息,比如画面里有没有球、有没有水,但它几乎学不到运动本身的规律。这就是为什么早期直接把 CNN 搬到视频上的尝试,效果始终不如密集轨迹。
问题的核心矛盾是,一个网络很难同时兼顾"这个画面里有什么"和"这个东西在往哪个方向、以多快速度移动"这两件事。这两种信息的性质完全不同,一个是静态的视觉模式,一个是动态的位移规律,硬塞进同一个网络里,网络会顾此失彼。
双流网络:把两只眼睛分开用
Simonyan 和 Zisserman 给出的答案很直接,既然一个网络很难同时处理两种信息,那就用两个网络,一个专门看外观,一个专门看运动,最后把两边的判断结果加权合并。
这个结构叫做**双流卷积网络**
**双流卷积网络**:由两条并行的卷积神经网络组成,一条输入原始视频帧处理空间外观信息,另一条输入光流场处理运动信息,两条网络分别做出预测后再融合。
空间流那条,输入就是普通的视频帧,和平时训练图像分类器没什么区别,它负责回答"这个场景里有什么物体、什么背景"。运动流那条,输入不是原始画面,而是**光流场**
**光流场**:描述视频中每个像素点在连续两帧之间的运动方向和速度的一种图像化表示,通常用两个通道分别记录水平和垂直方向的位移。
光流场这个东西你可以理解成把运动"翻译"成了一张图。原始视频帧里有颜色、纹理这些和运动无关的干扰信息,光流场把这些全部剥离掉,只留下"这一点往哪个方向移动了多远"。这样一来,运动流网络看到的输入本身就是纯粹的运动信号,不需要再费力从画面里分离运动和外观,直接就能专心学习运动模式。
这里有一个日常生活里的类比能帮你理解为什么要分成两条线处理。想象你在观看一场足球比赛的转播,画面里同时有解说员的声音和球场画面的字幕信息。如果让一个人同时听声音、看字幕、还要判断球员跑位,他大概会手忙脚乱,顾了这头丢了那头。但如果分成两个人,一个专门听声音判断比赛进程,一个专门看字幕和画面判断具体动作,两人各自把自己那部分做到最好,最后再交换意见综合判断,效果反而更好。双流网络就是这个思路,让两个专才网络各自专注一件事,而不是逼一个网络同时当两个专才。
如果不这样拆开会怎样?论文里做了对照实验。只用空间流单独跑,在 UCF-101 数据集上准确率是 73%,只用运动流单独跑,准确率是 83.7%。而把两条流融合起来,准确率跳到了 88%。单独运动流已经比单独空间流高出十个百分点,这说明运动信息对动作识别本身就比外观信息更关键,而两者结合后又比只用运动流高出四个多百分点,说明外观信息也不是没用,它能补充运动流漏掉的判断线索,比如通过背景判断这是在游泳池还是篮球场,从而帮助区分那些动作相似但场景不同的类别。
光流怎么塞进卷积网络里
单独看运动流这条网络,还有一个技术细节值得说清楚,光流场到底是怎么变成网络能吃的输入的。
标准的光流计算方法给出的是每个像素点的位移向量,一个水平方向的分量和一个垂直方向的分量。论文的做法是把这两个分量当成两张灰度图叠在一起,再往前多叠几帧的光流,一共堆成 20 张图(10 帧光流,每帧 2 个方向分量),当作一个多通道输入喂给卷积网络。
**光流堆叠**:把连续多帧计算出的光流场按时间顺序叠加成一个多通道输入,让网络能看到一段时间窗口内的运动变化,而不只是相邻两帧的瞬时运动。
为什么要叠这么多帧,而不是只用一帧光流?因为一个动作往往不是一瞬间完成的,挥手这个动作需要看到手臂连续几帧内的位移趋势,才能和随便挥一下手臂做区分。只看一帧光流,信息量太单薄,网络很难判断这是一个完整动作的起始、中段还是结束。堆叠多帧相当于给网络一个更长的时间窗口去观察运动的完整走势。
论文里还专门测试了另一种方案,叫做**轨迹约束光流**,简单说就是不再对整张画面做光流统计,而是沿着密集轨迹的路径去采样光流值。这个方法在某些情况下比普通光流稍好,但差距不大,说明光流堆叠本身这个思路已经足够抓住运动的核心信息,不一定非要借用密集轨迹的采样方式。
这里可以做一个类比。你去看一段监控录像判断有没有人打架,只看一张静止画面很难判断,两个人站得近可能只是聊天。但如果给你连续十秒的画面,你一眼就能看出这是拉扯还是拥抱。光流堆叠给网络的就是这种"连续十秒"的信息量,而不是"一张照片"的信息量。如果只喂一帧光流,网络的判断力会像只看一张监控截图的保安一样,经常误判。
数据不够怎么办:从图像任务里借力
深度学习这时候还面临一个更现实的问题,数据不够。
当时最大的视频动作识别数据集也就几千到一万多个视频片段,和 ImageNet 那种上百万张图片的规模比起来,少得可怜。神经网络是数据饥渴的,数据不够,网络很容易过拟合,学到的是数据集里的噪声而不是真正的动作规律。
作者用了两个办法应对这个问题。第一个是**多任务学习**
**多任务学习**:让一个网络同时在多个相关数据集或多个标签体系上训练,共享大部分网络参数,只在最后输出层区分不同任务,这样可以让网络从更多数据中受益,即便这些数据来自不同的任务定义。
具体来说,他们把两个不同的动作识别数据集放在一起训练同一个网络,网络的绝大部分层是共享的,只在最后分类那一层针对每个数据集单独设一套输出。这样网络能从两份数据里一起学习通用的运动和外观模式,即便两个数据集的类别定义完全不同。
第二个办法更巧,空间流网络的输入毕竟就是普通图片,那完全可以先在 ImageNet 那种超大规模的图像数据集上做预训练,把学到的通用视觉特征直接迁移过来,再用视频数据做微调。这个做法现在听起来是常识,当年却是解决视频数据稀缺问题的一个关键突破口。
这就好像一个学生想学习一门冷门语言,但教材数量有限。他可以先花大量时间把英语学到很扎实,培养出对语言结构、语法逻辑的敏感度,之后再转去学那门冷门语言时,即便教材少,他也能凭借已经建立的语言直觉快速上手,不需要从零开始摸索。空间流网络借助 ImageNet 预训练,走的就是这条路,先在数据充足的任务上把"看懂图像"这件事练扎实,再迁移到数据稀缺的视频任务上。
如果不做预训练,直接在几千个视频片段上从零训练一个卷积网络会怎样?网络大概率会严重过拟合,记住了训练集里的特定场景和演员,却学不到真正能泛化的动作规律,测试时表现会明显下降。
结果说话:准确率追平并超过了手工特征
说了这么多设计思路,最终效果到底怎样?
论文在两个标准数据集上做了测试,UCF-101 和 HMDB-51,这是当时视频动作识别领域最主流的两个基准测试集。
| 方法 | UCF-101 准确率 | HMDB-51 准确率 |
| 密集轨迹(手工特征,当时最强基线) | 87.9% | 57.2% |
| 仅空间流网络 | 73.0% | 40.5% |
| 仅运动流网络 | 83.7% | 54.6% |
| **双流网络融合** | **88.0%** | **59.4%** |
看这张表,几个信息值得拆开说。
第一,单独的空间流网络,准确率只有 73%,比密集轨迹低了将近 15 个百分点,这说明单纯把 CNN 套用到视频帧上,效果确实不如手工特征,这也印证了前面说的,视频不是简单的图片堆叠问题。
第二,单独的运动流网络,靠光流场这一项输入,准确率就冲到 83.7%,已经和密集轨迹的 87.9% 相当接近了,差距只有四个百分点。这说明运动信息本身对动作识别至关重要,而光流场这种表示方式确实抓住了运动的核心。
第三,两条流融合之后,88.0% 这个数字第一次超过了密集轨迹的 87.9%。差距看起来很小,只有 0.1 个百分点,但这 0.1 个百分点背后的意义完全不是数字本身能衡量的。这是深度学习方法在视频动作识别这个任务上第一次打赢手工特征,在此之前整整两年,深度学习方法始终被密集轨迹压着一头。这个 0.1% 的反超,和 AlexNet 在图像识别上的横空出世,放在整个领域的历史脉络里,分量是相当的。
而在 HMDB-51 这个更难的数据集上,双流网络的优势更明显,59.4% 对比密集轨迹的 57.2%,领先了 2.2 个百分点。HMDB-51 数据集视频质量参差,动作类别之间区分度更小,双流网络在这种更困难的场景下反而拉开了更大的优势,说明这个架构的泛化能力确实更强,不是靠在某一个数据集上撞运气撞出来的结果。
这篇论文之后发生了什么
双流网络这个思路一开先河,后面几年整个视频理解领域几乎是沿着这条路径往前走的。
**3 年后**,Carreira 和 Zisserman(还是同一个 Zisserman)在 2017 年发表了 I3D 网络,把双流网络里的 2D 卷积全部换成了 3D 卷积,让网络能直接从原始视频帧里学习时空特征,不再依赖单独计算光流。这个改动大幅提升了准确率,在 UCF-101 上做到了 98% 左右,同时也让网络结构变得更统一,不需要像双流网络那样单独维护两套网络和一套光流计算流程。
**5 年后**,Facebook 的研究团队在 2019 年提出了 SlowFast 网络,这个设计其实是双流网络思路的一种延续和升华。它不再是"空间流加运动流"这种外观和运动的分离,而是"慢速通路加快速通路",一条网络用较低的帧率去捕捉稳定的语义信息,另一条用较高的帧率去捕捉快速变化的运动细节,本质上还是"两条视线各管一块,再融合"的哲学,只是分工方式从"外观 vs 运动"换成了"慢 vs 快"。
这两个后续工作都保留了双流网络最核心的那个洞察,视频里的信息天然分成两种不同性质的成分,硬塞进一个网络里效果不好,分开处理再融合效果更好。这个洞察活得比双流网络这个具体架构本身还久。
写在后面
读这篇论文时最让我意外的一点是,光流场作为输入这件事,现在听起来平平无奇,但在当时是需要一点勇气才能想到的。研究者选择不直接信任神经网络能从原始像素里学会运动的概念,而是先用传统方法把运动信息计算出来,再喂给网络。这其实是承认了"深度学习不是万能的,有些先验知识提前给它,比让它自己瞎摸索更高效"。
这种态度在后来的深度学习潮流里其实慢慢被冲淡了,大家越来越相信端到端训练,相信给网络原始数据它自己就能学会一切。I3D 网络用 3D 卷积取代光流输入,某种程度上就是这种信念的胜利。但双流网络提醒我们,在数据不够、算力有限的年代,给网络一点"人工提示"往往是性价比更高的选择。这个取舍今天做具身智能、机器人感知这些数据依然稀缺的领域时,依然值得重新想一想。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是2014年由牛津大学Simonyan和Zisserman提出的视频动作识别方法,用两条并行的卷积神经网络分别处理视频的空间外观信息和运动光流信息,再融合两者的预测结果,是深度学习首次在该任务上超越手工特征方法。
Q2:双流网络为什么要分开处理外观和运动信息?
A:因为一个网络很难同时学好静态视觉模式和动态运动规律这两种性质完全不同的信息,分开处理让两个网络各自专注,最后融合效果比强行塞进一个网络里更好,实验显示融合后准确率从83.7%提升到88%。
Q3:双流网络之后有哪些改进方法?
A:2017年Carreira和Zisserman提出I3D网络,用3D卷积直接学习时空特征取代光流计算;2019年Facebook团队提出SlowFast网络,用慢速和快速两条通路替代外观和运动两条通路,都延续了双流网络"分开处理再融合"的核心思路。