
2014年的深度学习圈子里,有件事挺让人下不来台的。
那一年AlexNet已经红了两年,卷积神经网络在图像分类上把传统方法打得几乎没有还手之力。可换到视频动作识别这个任务上,情况完全反过来了。当时最强的深度学习方法,准确率只有65%左右,而一个叫"密集轨迹"的手工特征方法,能做到88%左右。
差了23个百分点。
这不是小差距。
23个百分点意味着什么呢?意味着如果你让深度学习方法和手工特征方法各看100个动作视频去分类,深度学习会比手工特征多认错23次。这在当时几乎成了一个尴尬的常识:深度学习能看懂图片里是猫是狗,但一到"动作"这种带时间维度的东西,就完全不灵光了。
这篇论文的两位作者,Karen Simonyan和Andrew Zisserman,就是在这个背景下动手的。有意思的是,这两人同一年还发表了另一篇后来大名鼎鼎的论文,VGGNet。也就是说,他们一边在琢磨怎么把卷积网络做得更深更准,一边在琢磨怎么让卷积网络理解视频里的动作。这两条线其实是同一个问题的两个侧面:网络到底该怎么"看"。
问题出在哪:网络看得到画面,看不到动作
要理解这篇论文的巧思,得先搞清楚为什么当时的深度学习方法在动作识别上会输得这么惨。
早期的做法很直接:把视频拆成一帧一帧的图片,然后扔进卷积神经网络,让网络学着从图片里认出"这是在打网球"还是"这是在游泳"。
问题是,一张静止的图片能告诉你多少关于"动作"的信息?
一个人举着球拍站在网球场上,这张照片可能是准备发球,也可能是刚打完一拍,也可能只是在摆拍。单张图片里挤满了背景、衣服颜色、场地信息,这些东西对分类是有帮助的,但它们帮的是"识别场景",不是"识别动作"。动作的本质是变化,是一个东西从一个状态移动到另一个状态的过程,而单张静态图片根本不包含"移动"这件事。
**卷积网络在这个任务上表现差,不是因为网络不够深,而是因为喂给它的信息里根本没有运动这个维度。**
这就好比你想判断一个人是不是在跑步,但只给你看他某一帧的定妆照。哪怕这张照片拍得再清楚,你也很难确定他是在原地站定,还是正在冲刺。你需要看到他连续几个瞬间的姿态变化,才能判断出"跑"这个动作。如果不给网络看运动信息,网络就只能靠猜场景蒙对答案,蒙对了是走运,蒙错了才是常态。
核心思路:把运动本身单独抽出来,喂给一个专门的网络
Simonyan和Zisserman的解法,说出来其实挺朴素的:既然单张图片里没有运动信息,那就别指望网络自己从图片里学出运动,直接把运动信息算出来,喂给网络。
具体怎么算?答案是光流。
> 光流*:指的是视频里像素点从一帧到下一帧的移动方向和移动速度,本质上是一张"运动地图",每个像素都带着一个箭头,告诉你这个点往哪个方向动了多远。
光流场不是靠网络学出来的,而是靠传统的计算机视觉算法预先算好的,算出来之后,这张运动地图看起来就像一张彩色的、布满箭头方向信息的图片,可以直接喂给卷积神经网络去学习。
这个思路带来的直接后果是,网络不再需要自己去猜"什么叫动",因为运动信息已经被显式地摆在了它面前。它只需要学习"什么样的运动模式对应什么样的动作"就够了。
论文把这套结构叫做双流网络。
> 双流网络*:Two-Stream Network,指用两个独立的卷积神经网络,一个专门处理静态画面(叫空间流),一个专门处理运动信息(叫时间流),最后把两边的判断结果加权融合,得出最终答案。
空间流和时间流各自训练、各自预测,最后把两个网络给出的分类概率做个加权平均,谁的置信度高,就多听谁的意见。
这个设计像什么呢?想象你去看一场篮球比赛,身边坐着两个朋友,一个从来不看球只看场馆的装修风格,另一个眼睛死死盯着球员的跑动路线不看别的。散场后你问他们刚才那个进球是投篮还是扣篮,看装修的朋友说不清楚,因为他压根没在看动作,但他能告诉你这是在哪个体育馆,是主队还是客队的比赛。看跑动的朋友能准确说出球员起跳、出手的整个过程,但要是问他球衣颜色他可能都没注意。如果你只信一个人的判断,你会经常出错,但如果把两人的观察结合起来,你得到的信息远比任何一个人单独给你的更完整。如果没有这种分工,硬让一个网络同时兼顾场景识别和动作识别,结果就是两头都学不精,这正是早期方法失败的原因。
![双流网络结构图]
论文里那张结构图画得很直白,左边一路输入是原始的视频帧,右边一路输入是提前算好的光流场,两条路径完全独立地跑完各自的卷积网络,最后在顶部汇合,给出一个融合后的分类结果。这张图本身就在说一句话:识别动作这件事,得靠"看画面"和"看运动"两条腿一起走,少一条腿都走不稳。
时间流具体怎么设计:光流该往前看还是往后看
时间流网络的输入不是一张光流图,而是连续多帧光流叠在一起的一个立体数据块。
论文里试验了几种不同的输入方式。一种是直接用光流的横向和纵向分量,叠成若干帧的堆栈,直接喂给网络。另一种更巧妙,叫做双向光流,就是不仅算这一帧往后面帧的运动,也算这一帧往前面帧的运动,两个方向都算进去,让网络看到的运动信息更完整。
为什么要费这个劲算两个方向?
因为一个动作往往不是单向的。举个例子,一次挥拍击球的动作,球拍往前挥出去是一半,挥出去之后的回收动作又是另一半,如果光流只算"未来会往哪儿动",就漏掉了这个动作是怎么"从哪儿来的"这部分历史信息。双向光流相当于给网络补齐了运动的前因和后果,而不只是当下这一瞬的趋势。
实验结果证实了这个设计是有效的,双向光流的版本比单向的表现更好。这不是设计者的直觉臆想,而是有数据支撑的选择。
这里还有一个技术细节值得说一下,光流场本身是有噪声的,尤其是摄像机自己在晃动或者平移的时候,整张画面都会产生一种虚假的"运动",这种运动跟人物真正做的动作没有关系,纯粹是相机在移动导致的假象。
> 均值消除*:论文中处理光流噪声的一个技巧,做法是从光流场里减去整张图片的平均运动值,相当于先把镜头晃动这个大背景的干扰减掉,剩下的才是画面里物体相对于背景真正发生的运动。
这个处理有点像你在一辆行驶的火车上录视频,想拍窗外一只飞过的鸟。整个画面都在往后移动,因为火车在往前开,但鸟相对于火车之外的世界可能是往另一个方向飞的。如果你不把火车本身的移动减掉,算法会把整块背景的移动也当成"运动信息"塞给网络,网络学到的可能压根不是鸟怎么飞的,而是火车开得多快。做了均值消除之后,这种背景干扰被过滤掉了,留下的才是真正有意义的、相对运动的信号。如果没做这一步,网络很可能在学习一堆和动作本身无关的相机抖动模式,那样训练出来的模型看着数据不错,实际部署到手持拍摄的视频上就容易翻车。
数据不够怎么办:借用图片数据集来"预训练"
深度学习一个绕不开的老问题是,训练数据从哪儿来。
当时的视频动作识别数据集普遍偏小,比如UCF-101大约有1万3千段视频,覆盖101种动作类别,HMDB-51则更小,只有大约7000段视频、51种动作。跟同期图像分类动辄上百万张图片的规模比,这个数据量对于训练一个深层卷积网络来说是相当吃紧的,很容易过拟合,也就是网络把训练集背得很熟,但换到没见过的新视频上就表现很差。
> 过拟合*:指模型在训练数据上表现很好,但因为训练数据太少或模型太复杂,导致模型学到了很多训练集里的特殊细节,而不是具有普遍意义的规律,一旦换成新数据表现就大幅下降。
论文的应对策略是,先用ImageNet这个超大规模的图片分类数据集,把空间流网络预先训练一遍,让网络先学会基础的视觉特征识别能力,然后再拿动作识别的视频数据去微调这个已经训练好的网络。
这个做法背后的逻辑是,识别"这是一只狗"和识别"这个人在打网球"这两件事,在最底层的视觉处理上是有共通之处的,比如识别边缘、颜色、纹理这些基础视觉特征,是通用的,不需要为每个任务从零学起。
这就像你想培养一个能看懂足球比赛战术的解说员,如果你直接找一个完全没看过体育比赛的人,让他光靠看几十场足球赛的录像就总结出战术门道,效果大概不会太好,因为样本量太小。但如果这个人本来就是资深体育迷,看过成千上万场各种球类比赛,积累了大量关于"跑位"、"配合"、"节奏"这些通用体育概念的理解,那么只需要再看几十场足球赛,他很快就能领悟足球特有的战术细节。预训练干的就是这件事,先在海量的通用视觉数据上打好基础,再用相对少量的目标数据做针对性调整。如果没有预训练这一步,直接用视频数据集从零训练,模型很容易因为数据量不足而学得很差,这也是论文里空间流网络单独测试时准确率明显偏低的一个原因。
融合的方式:不是简单相加,而是加权,甚至用支持向量机来决定怎么融合
两条流各自算出一个分类概率之后,怎么把它们合并成一个最终答案,论文里试了两种方式。
一种是直接对两条流的输出概率取平均,另一种更精细,是把两条流的输出结果作为特征,另外训练一个支持向量机分类器来学习该怎样加权融合。
> 支持向量机*:一种经典的机器学习分类算法,简单说就是找一个最优的分界线(或分界面),把不同类别的数据尽可能清晰地分开。
结果是,用支持向量机做融合的效果比简单平均更好。这说明两条流对不同类型动作的判断可靠程度是不一样的,有些动作光靠画面就能猜得八九不离十,比如识别"游泳",泳池和泳衣这些场景线索就很有用,但有些动作,比如区分"扔飞盘"和"扔棒球",光靠背景画面很难分辨,这时候运动轨迹的信息就更关键。让一个额外的分类器去学习"什么情况下该多信空间流,什么情况下该多信时间流",比死板地各打五十分要聪明得多。
实验结果说话:双流网络到底提升了多少
论文在两个主流数据集上做了测试,UCF-101和HMDB-51。
| 方法 | UCF-101准确率 | HMDB-51准确率 |
|---|---|---|
| 单独空间流(仅用静态画面) | 73.0% | 40.5% |
| 单独时间流(仅用光流) | 83.7% | 54.6% |
| **双流网络(融合后)** | **88.0%** | **59.4%** |
| 同期最强手工特征方法 | 87.9% | 61.1% |
这组数字讲了一个很清楚的故事。
单独看空间流,UCF-101上只有73%,这跟前面说的"单张图片信息不够"的判断完全吻合。单独看时间流,直接跳到83.7%,说明运动信息本身对识别动作的贡献,比单纯的画面信息大得多。两者融合之后到88%,比单独任何一条流都高,证明这两种信息确实是互补的,不是重复的。
而更关键的一点是,双流网络在UCF-101上的88%,第一次让深度学习方法追平甚至反超了手工设计的特征方法。这是一个历史节点,深度学习在视频动作识别这个具体任务上,第一次不再是那个被传统方法按在地上打的角色。
这句话放在2014年的语境里,分量不亚于两年前AlexNet在图像分类上掀起的那场风暴。区别是,这次深度学习没有靠更深的网络、更多的数据硬碰硬地取胜,而是靠一个更聪明的输入设计,让网络看到了它之前压根看不到的信息维度。
后续影响:这条思路怎么被一步步接着往前推
双流网络这个框架发表之后,很快成了视频理解领域好几年里的标准范式,后续一大批工作都是在这个基础上做改进。
2016年,Feichtenhofer等人发表了一篇论文,提出了更好的时空融合方式,让空间流和时间流不再是训练完之后简单相加,而是在网络中间层就开始交互融合,这个方法进一步把UCF-101上的准确率往上推了几个点。
2017年,DeepMind的Carreira和Zisserman(对,还是同一个Zisserman)发表了I3D网络的论文,把双流网络里的2D卷积换成了3D卷积,直接在时间维度上做卷积运算,同时提出了一个规模远超以往的动作识别数据集Kinetics,用这个更大规模的数据集做预训练之后,模型的表现又有了明显提升。这篇论文可以看作双流思路的一次升级,它保留了"两条流处理不同信息"的核心框架,但把光流这种手工计算的运动特征,换成了让网络自己通过3D卷积直接从视频里学运动模式。
这两个后续工作说明了一件事,双流网络提出的"分开处理静态信息和运动信息,再融合"这个思路本身经受住了时间的考验,后来者不断在优化的是"怎么算运动信息""怎么融合"这两个具体环节,但骨架没有变。
写在后面
读这篇论文的时候,我一直在想一个问题,为什么"把光流单独算出来喂给网络"这个想法在当时算是巧思,而不是显而易见的做法。后来想明白了,深度学习那几年的主流信仰是"让网络自己从原始数据里学一切",人工去设计特征输入,某种程度上是和这个信仰唱反调的。双流网络的成功其实是一次务实的妥协,先承认端到端学习在数据不够、任务特殊的情况下有短板,再用传统方法的强项去补这个短板。这种"先认输再想办法"的态度,可能比死磕纯端到端更值得学。
论文里还有一个细节我觉得值得单独提一句,双向光流比单向光流效果好这件事,其实暗示了一个更普遍的道理,理解一个动态过程,光看它将要发生什么不够,还得看它是怎么发生的。这跟很多领域的诊断逻辑是相通的。
Q&A
Q1:双流网络是什么?
A:双流网络是2014年Simonyan和Zisserman提出的一种视频动作识别方法,用两个独立的卷积神经网络分别处理静态画面(空间流)和光流运动信息(时间流),最后融合两边的判断结果,第一次让深度学习方法在视频动作识别任务上追平甚至超过了手工特征方法。
Q2:双流网络为什么要单独处理光流信息?
A:因为单张静态图片里根本不包含运动信息,网络光靠画面很难判断动作,只能靠场景蒙猜。把光流场(记录像素运动方向和速度的运动地图)预先算好再喂给专门的网络,能让网络直接学习运动模式和动作类别之间的关系,大幅提升识别准确率。
Q3:双流网络的效果具体提升了多少?
A:在UCF-101数据集上,单独用空间流准确率是73%,单独用时间流是83.7%,两者融合后达到88%,首次追平同期最强的手工特征方法(87.9%),是深度学习在这个任务上的历史性突破。
好文章,需要你的鼓励
论文提出CAST框架,通过多智能体系统把任务成败的粗略反馈转化为逐步动作的详细批评理由,训练出更懂节制的批评模型,再用它优化执行策略,让8B小模型在可靠性指标上反超120B大模型,提升智能体在真实动态环境中的稳定表现。
论文提出NavMCP框架,用意图、观察、记忆三条通道把VLM推理与导航基础模型NFM结合,解决具身问答中长距离探索问题,在多个基准和真实机器狗测试中均取得最优效果。
研究发现教师模型批改学生生成内容时噪声率高达50%,但学生依然能进步。作者发现真正起作用的是压制学生自己低概率词,据此提出无需外部监督的OPSA方法,在AIME24等数学测试上带来最高307%的提升。
PaperGym提出一套把科研论文转化为AI训练环境的方法,解决科研计划生成缺乏可验证奖励的难题,通过问题答案分离降低评分标准泄露,结合自蒸馏与强化学习两阶段训练,让小模型在多个基准上超越更大规模的商业模型。