
2014 年的深度学习圈子里,有一件事让很多人心里不太痛快。
那一年,卷积神经网络已经在静态图片分类上把传统方法打得毫无还手之力,AlexNet 的名声如日中天。可是一旦把问题换成视频动作识别,比如识别一段视频里的人是在打网球还是在骑马,深度学习却连续两年没能超过一个叫做"密集轨迹"的手工特征方法。
这事听起来有点反常。图片能赢,视频却输了,难道视频只是"多张图片叠在一起",为什么反而更难?这正是 Karen Simonyan 和 Andrew Zisserman 在论文《Two-Stream Convolutional Networks for Action Recognition in Videos》里要回答的问题。有意思的是,这两位作者也是同一个实验室的成员,几个月之后,他们又发表了另一篇后来家喻户晓的论文,VGGNet。也就是说,你现在读的这篇双流网络论文,和 VGGNet 几乎是同一批人、同一段时间脑子里正在打转的两个问题。
视频比图片难在哪
先说说当时的真实成绩单。
在 UCF-101 这个当时主流的动作识别数据集上,手工特征方法"改进版密集轨迹"(iDT)的准确率是 87.9%。而当时最好的深度学习方法,只能做到 65.4% 左右。
差了 22 个百分点。
这个差距意味着什么?意味着每识别 5 个动作,深度学习方法就要比手工特征多认错 1 个以上。这在当时几乎被当作一个结论摆在那儿:深度学习不适合视频。
问题出在哪?图片分类网络学的是"这张照片里有什么东西",本质是空间信息,边缘、颜色、纹理、物体形状。但一个动作,比如挥拍、跳跃、鼓掌,它的关键信息根本不在某一帧的画面里,而在画面之间怎么变化。你把打网球和站着不动的人的某一帧单独拿出来,可能长得几乎一样。真正区分它们的是手臂在时间上的运动轨迹。
早期尝试直接把视频帧堆叠起来,让 3D 卷积网络去学,或者用普通 2D 卷积在时间维度上做池化,指望网络自己学会"运动"这个概念。结果不理想,网络学到的运动信息很弱,因为运动本身是一种非常特殊的结构,直接从原始像素里学,太难了。
这就像让一个从没学过物理的人,光看几张照片就猜出球飞行的速度和方向。他能看出球在哪,但很难精确说出球到底往哪儿飞、飞多快。如果你不给他一点辅助信息,比如两张照片之间球的位移标注,他大概率猜不准。深度学习网络在这个阶段面对的就是这种困境:原始像素堆叠给的信息太隐晦了。
解法:不要逼网络自己发现运动,直接把运动喂给它
Simonyan 和 Zisserman 的思路说出来其实很朴素:既然网络自己学运动很难,那就不要让它自己学,直接算好运动信息,喂给另一个专门的网络。
于是网络被拆成了两条独立的流。
>双流网络(Two-Stream Network):把动作识别任务拆成两个并行的卷积神经网络,一个专门处理单帧图像(空间信息),一个专门处理帧与帧之间的运动信息(时间信息),最后把两者的判断结果融合起来。
第一条流叫空间流,处理的是普通的 RGB 图像,一帧一帧地看,负责识别画面里有什么,场景、物体、人的姿态。这条流本质上和图片分类网络没什么区别,甚至可以直接用在 ImageNet 上预训练好的模型来做迁移学习。
第二条流叫时间流,它不看原始图像,而是看光流场。
>光流(Optical Flow):描述视频中相邻两帧之间,画面上每一个点是怎么移动的,用一个二维向量表示某个像素在下一帧里跑到了哪个方向、跑了多远。
光流本质上是一张"运动地图"。它不告诉你画面里是不是有一个人,只告诉你这个区域的像素正在往哪个方向、以多快的速度移动。把连续多帧的光流叠在一起输入给一个卷积网络,这个网络学的就纯粹是运动模式,挥拍是一种运动轨迹,走路是另一种,完全不需要关心画面里到底是谁、背景是什么。
这个设计背后的逻辑其实是一种"分工"哲学:不要指望一个网络同时精通两件本质不同的事情,让专业的人做专业的事。
这就像一支侦探队伍破案。你不会让一个人同时负责拍照取证和分析嫌疑人的行走姿态,这两件事需要完全不同的观察方式。摄影师专注把现场每个细节拍清楚,步态分析师则盯着监控录像里人物的移动轨迹反复回放。如果让同一个人同时兼顾两件事,他大概会两头都做不精,顾着看清楚画面细节的时候,容易忽略运动的连续性;反过来盯着运动轨迹看的时候,又会忽略画面里的具体内容。分开之后,两个人各自把自己的报告做到最好,最后汇总在一起判案,效果反而更准。
网络架构上,两条流各自是一个独立的 CNN,结构上参考了当时流行的 CNN-M 系列结构,各自输出一个动作类别的预测分数,你可以理解成两个人各自投了一票,谁认为这是打网球的可能性更高。最后这两票怎么合并,成了一个需要单独设计的问题。
![两条流的网络结构图,一条接收RGB帧,一条接收堆叠的光流帧,各自经过卷积层后输出分类分数]
论文用的融合方式很直接,直接平均两条流各自输出的 softmax 概率分数,或者训练一个额外的支持向量机(SVM)分类器,把两条流的分数当作特征再做一次融合判断。
>softmax:一种把网络输出转换成概率分布的函数,让每个类别的得分变成 0 到 1 之间、加起来等于 1 的概率值,方便直接理解为"网络认为这是某个类别的可能性有多大"。
光流从哪来,怎么变成网络能吃的样子
这里有个技术细节值得多说两句,因为它直接决定了这个方法能不能落地。
光流不是网络自己算出来的,而是提前用传统的光流估计算法(论文里用的是一种叫 Brox 方法的经典算法)计算好,作为预处理步骤。每一帧和它的下一帧之间算一个光流场,得到两张图,一张表示水平方向的位移,一张表示垂直方向的位移。
为了让网络能看到一段时间内的运动趋势,而不只是相邻两帧那一瞬间的运动,论文把连续 L 帧(论文里 L 取 10)的光流场堆叠起来,形成一个有 2L 个通道的输入,每一帧贡献 2 个通道(水平和垂直位移)。
这个设计有点像看一段视频时不只看某一帧的定格画面,而是把这一小段时间里所有的运动轨迹叠加起来看一次。你能想象一下用长曝光摄影拍夜晚的车流,单张照片里那些拖长的光轨,其实就是把一段时间里车灯的位置变化叠加显示出来了。堆叠光流帧的作用类似,让网络一眼看到的不是某一瞬间的运动方向,而是一整段时间的运动模式。如果只用相邻两帧的光流,相当于长曝光只曝光了十分之一秒,信息量太少,很多稍微复杂一点的动作(比如需要几秒钟才能看出规律的舞蹈动作)根本体现不出来。
论文还试验了两种光流的输入形式,一种是常规光流(每个像素相对于摄像机静止时的运动),另一种是减去了摄像机本身运动(比如镜头平移、摇晃)之后的光流,叫作"去相机运动"版本。因为很多视频是手持拍摄,镜头本身在动,如果不做这个处理,网络可能会把镜头晃动误判成人物动作的一部分。实验证明,去掉相机自身运动的干扰后,效果确实更好。
这也是为什么直接把视频帧堆叠丢进 3D 卷积网络的早期尝试效果不好的原因之一,它们没有对相机运动做任何处理,网络得同时应付背景晃动和人物动作两种运动信号混在一起的烂摊子。
数据不够怎么办:从图片数据集"借"预训练权重
深度学习这时候还有一个绕不开的老问题:训练数据不够。
UCF-101 数据集虽然在当时已经算大的视频动作数据集,但也只有大约 13000 个视频片段,分成 101 个动作类别。跟 ImageNet 那种上百万张图片的规模比起来,简直是小巫见大巫。用这么小的数据训练一个深层卷积网络,很容易过拟合,网络记住了训练集里的细节,却学不会真正有用的规律。
空间流这条路好办,因为它输入的就是普通图像,可以直接拿 ImageNet 上预训练好的模型权重做初始化,再用视频数据微调。这就好比一个已经在美术学校学了好几年绘画基础的学生,现在只需要再学一门"如何给电影海报上色"的专项课程,起点比从零开始的人高得多。
时间流麻烦一点,因为它的输入是光流图,跟 ImageNet 的自然图片长得完全不一样,没法直接借用预训练权重。论文的解决办法是加大数据增强的力度,做多尺度裁剪、水平翻转等操作,人工制造更多训练样本,同时还引入了另一个数据集 HMDB-51 的数据混合训练,靠增加数据的多样性来缓解小数据集带来的过拟合问题。
结果:深度学习第一次赢了
前面说过,当时最好的手工特征方法 iDT 在 UCF-101 上是 87.9%,而普通深度学习方法只有 65.4%。
双流网络的实验结果是多少?
**融合了空间流和时间流之后,准确率达到了 88.0%。**
这个数字第一次让深度学习方法追平甚至略微超过了当时最强的手工特征方法。这在 2014 年是一个标志性的时刻,深度学习在视频动作识别这个战场上,终于翻身了。
拆开来看两条流各自的表现更能说明问题。单独用空间流(只看图像,不看运动),准确率是 72.6%。单独用时间流(只看光流,不看图像内容),准确率反而更高,达到 81.0%。
这组数字挺有意思。如果你只用图像内容去判断动作,正确率是 72.6%,这也验证了前面说的,仅凭静态画面很难分辨复杂动作。而如果只看运动轨迹完全不看画面内容是什么,正确率反而更高,说明运动模式本身就承载了动作识别里最关键的信息。两条流各有各的强项,但合在一起,能力互补,最终效果比任何单条流都好,88.0% 对比 81.0%,又多拿回了 7 个百分点。
下面这张表总结了论文里几组关键的对比数据:
| 方法 | UCF-101 准确率 |
|---|---|
| 手工特征 iDT(改进版密集轨迹) | 87.9% |
| 早期深度学习方法(视频帧直接堆叠) | 65.4% |
| 仅空间流(只看图像) | 72.6% |
| 仅时间流(只看光流) | 81.0% |
| **双流网络(空间流+时间流融合)** | **88.0%** |
从 65.4% 到 88.0%,提升了超过 20 个百分点,第一次让深度学习在这个任务上站到了手工特征方法的前面,甚至略微超过。
这个提升幅度放在实际场景里意味着什么?如果一个监控系统原来每识别 3 个动作就错 1 个(65.4% 对应的错误率约为 35%),换成双流网络之后,错误率降到大约 12%,相当于原来 3 次里错 1 次,现在差不多 8 次里才错 1 次。对于任何需要自动分析视频内容的应用,比如体育动作分析、异常行为监控,这种精度提升的实际价值是巨大的。
这篇论文之后发生了什么
双流网络这个"分而治之"的思路后来影响了整整一批视频理解的研究。
2016 年,Feichtenhofer 等人发表了《Convolutional Two-Stream Network Fusion for Video Action Recognition》,他们发现原始双流网络在最后才把两条流的结果简单相加,融合得太晚太粗糙,于是提出在网络中间层就让两条流互相交换信息,做更深层次的融合,在同样的数据集上把准确率进一步推高。
2017 年,DeepMind 团队发表了 I3D(Inflated 3D ConvNet),论文题目是《Quo Vadis, Action Recognition?》。这篇论文把双流网络的两条流思想和 3D 卷积结合起来,同时提出了一个更大规模的视频数据集 Kinetics,用它做预训练,把动作识别的准确率又往上推了一大截,在 UCF-101 上做到接近 98%。I3D 基本延续了双流的框架,一条流处理 RGB,一条流处理光流,只是把 2D 卷积换成了 3D 卷积,让网络能更自然地在时间维度上提取特征。
这两项后续工作有一个共同点:它们都没有推翻双流网络"用两种信息源、两条独立通路"的核心思路,而是在这个框架内部做优化,融合方式更精细,网络结构更强大,数据规模更大。这说明双流网络提出的这个基本框架抓住了问题的本质,视频理解需要同时兼顾"看到了什么"和"怎么动的"这两类信息,这个判断在后来相当长一段时间里都没有被推翻。
写在后面
读这篇论文的时候,最让我意外的一点是,最后帮深度学习翻身的关键武器,光流,本身根本不是深度学习方法,而是一个几十年前就有的传统计算机视觉算法。
这有点讽刺,也有点启发。大家总以为深度学习要赢,靠的是让网络自己从零学会一切。但双流网络的成功恰恰说明,聪明地利用已有的、成熟的先验知识(哪怕它来自"老派"的方法),往往比硬逼着神经网络从原始像素里重新发明一遍轮子更有效。
这跟后来很多领域的发展路径其实很像。真正好用的系统,很少是纯粹的端到端学习,而是懂得在哪里插入一点结构化的先验知识,把网络的算力用在它真正擅长的地方。这个思路值得留在心里,下次看到一个"完全端到端"的方案效果不好时,或许该想想,是不是漏掉了一些本可以直接算出来、不需要网络辛苦学的信息。
Q&A
Q1:双流网络(Two-Stream Network)是什么?
A:双流网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别模型,把任务拆成两个并行的卷积神经网络,一条处理单帧图像获取空间信息,一条处理光流获取运动信息,最后融合两者的判断结果,在 UCF-101 数据集上准确率达到 88.0%。
Q2:双流网络为什么要用光流而不是直接用视频帧堆叠?
A:因为直接让网络从原始像素里学习运动信息太难,早期方法效果只有 65.4%。光流是预先计算好的"运动地图",直接把运动方向和速度喂给网络,让网络专注学习运动模式本身,效果提升到 81.0%(仅时间流)。
Q3:双流网络之后有哪些重要的改进工作?
A:2016 年 Feichtenhofer 等人提出在网络中间层融合两条流信息而非最后简单相加;2017 年 DeepMind 提出 I3D,把双流思想和 3D 卷积结合,并用大规模 Kinetics 数据集预训练,把 UCF-101 准确率推高到接近 98%。
好文章,需要你的鼓励
这篇论文提出一种插件式2D动作接口,让已训练好的3D运动语言模型无需修改或微调即可直接理解2D姿态输入。实验证明2D输入效果媲美3D输入,且在真实视频场景下配合专门的降噪适配器,2D方案比3D姿态估计更省算力、更实用,为动作理解模型的现实部署提供了新路径。
研究团队让8种AI智能体独立完成100项真实科研任务,深度剖析800份研究轨迹后发现,即便是最强模型,也普遍存在"发现问题却不修正"的现象,背后根源指向AI缺乏检验自身产出、主动纠错的元认知能力。
WorldRover是一套面向可探索世界建模的合成视频数据引擎,基于虚幻引擎构建,能让同一段探索轨迹在保持路线与场景一致的前提下,重新渲染为多种视角和外观状态,并同步提供深度、光流、长程点追踪等丰富标注,最终发布WorldRover-10M数据集,含2190万帧、202.7小时视频。
这篇论文指出,现有多目标强化学习训练大模型时存在"一刀切"分配优化精力的问题,提出SA-MRPO方法,根据每个奖励目标的饱和程度动态调整其权重,在数学推理、自适应推理、代码生成等任务上均取得优于现有方法GDPO的效果。