微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 用两条眼睛看视频,深度学习第一次打赢了手工特征

用两条眼睛看视频,深度学习第一次打赢了手工特征

2026-08-18 09:39
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-08-18 09:39 科技行者

2014 年之前,如果你想让机器认出视频里的人在打网球还是在游泳,最靠谱的办法不是深度学习。

这句话现在听起来有点奇怪,因为我们已经习惯了深度学习在图像识别、语音识别、机器翻译里全面碾压传统方法。但视频动作识别这个领域,曾经是深度学习的一块伤心地。

当时最强的方法叫密集轨迹

> 密集轨迹(Dense Trajectories):一种手工设计的特征提取方法,通过在视频里密集采样点并追踪它们的运动轨迹,再统计轨迹周围的方向梯度、光流方向等信息来描述动作。

这套方法在权威的 UCF-101 动作识别数据集上能做到 87.9% 的准确率。而同期研究者们尝试直接把卷积神经网络怼到视频上,最好的结果只有 65.4%,差了整整 20 多个百分点。

20 个百分点的差距,意味着什么?意味着每 5 个动作里,深度学习就要比手工方法多认错 1 个还不止。这在当时的研究圈子里是个公开的尴尬。CNN 在静态图片上已经把传统方法打得找不着北了,为什么一到视频就翻车?

这就是本篇论文出场时面对的局面。论文的作者是 Karen Simonyan 和 Andrew Zisserman,牛津大学的两位研究者。有意思的是,几个月后这两人又发了另一篇论文,叫 VGGNet,后来成了图像识别领域最经典的网络结构之一。也就是说,同一批人,同一年,一边琢磨怎么用深度学习看懂静态图片,一边琢磨怎么用深度学习看懂视频里的动作。这两条线后来都成了深度学习历史上的关键节点。

问题出在哪:视频比图片多了什么

要理解这篇论文的贡献,得先搞清楚视频识别到底难在哪里。

一张图片,CNN 要学的是空间里的模式:边缘、纹理、形状、物体的组合关系。这套本领 CNN 已经证明了自己很擅长。

但视频不是一堆图片的简单堆叠,视频的灵魂在于运动。同一个人站在网球场上,可能是在发球,可能是在捡球,也可能是在原地等待,画面看起来几乎一样,但动作的意义完全不同。区分这些动作,靠的不是某一帧画面长什么样,而是画面怎么随时间变化。

早期直接把 3D 卷积核怼在视频帧序列上的做法,理论上应该能捕捉到时间信息,但实际效果不理想。作者推测,问题可能在于,网络很难从原始像素的时序变化里,自己学出"运动"这个抽象概念。这就像让一个从没学过物理的人盯着一堆连续的照片,试图靠肉眼揣摩物体的速度和方向,效率很低,他能看出画面在变,但很难总结出"这是一个匀速直线运动"这种规律。

于是作者想了一个思路:既然运动信息这么关键,又这么难让网络自己学出来,那能不能提前把运动信息计算好,直接喂给网络?

两条流,一条看画面一条看动作

这就是这篇论文最核心的设计:双流网络

> 双流网络(Two-Stream Network):把视频识别任务拆成两个独立的卷积神经网络,一个处理静态画面(空间流),一个处理运动信息(时间流),最后把两者的判断结果融合起来。

空间流很好理解,就是一张张地看视频帧,识别画面里有什么东西,人在哪,球拍在哪,场地是什么样。这跟普通的图片分类网络没什么本质区别。

时间流处理的不是原始画面,而是光流场

> 光流(Optical Flow):描述视频中相邻两帧之间像素点移动方向和速度的向量场,通俗理解就是"画面里每个点在往哪个方向移动、移动了多快"。

作者把连续几帧之间计算出来的光流场堆叠起来,当成一种特殊的"图像"喂给另一个卷积神经网络。这个网络看到的不是"网球场是绿色的""人穿着白衣服"这类外观信息,而是纯粹的运动模式:手臂在往上挥,球在往前飞。

这个设计背后的逻辑其实挺朴素的。你去看一场球赛录像,把声音关掉,把画面调成马赛克糊成一片,你还是能通过画面的抽象运动轨迹判断出这是发球还是接球,因为动作的节奏和方向本身就带着信息。反过来,如果你只看一张静止的照片,哪怕画质再清晰,你也很难判断这一瞬间前后发生了什么。这两种信息是互补的,一个负责"这是什么",一个负责"发生了什么变化"。

如果不这样拆开,会发生什么?论文里做了对比实验。只用空间流,准确率是 72.6%。只用时间流,能达到 81%。而两条流融合之后,准确率冲到了 88.0%,第一次超过了密集轨迹的 87.9%。

这里有个值得琢磨的细节:单独的时间流表现居然比空间流还好,这说明对动作识别这个任务来说,运动信息的重要性可能比静态画面的重要性更高。这跟很多人的直觉可能是反的,大家会本能觉得"看清楚场景里有什么"才是识别的基础,但数据说,光流场里藏着的东西,分量更重。

光流怎么喂给网络:堆叠的技巧

要把光流这种运动信息变成 CNN 能吃下去的格式,也不是拍脑袋就能搞定的。

普通图片是三个颜色通道叠在一起(红绿蓝),CNN 天然适配这种输入格式。而光流是两个方向的向量场,一个是水平方向的位移,一个是垂直方向的位移,严格来说不是"图像",但可以硬编码成类似图像的多通道数据结构。

作者的做法是,取连续的 L 帧(论文里用的是 10 帧),把每一帧对应的水平光流和垂直光流都算出来,然后按顺序堆叠在一起,变成一个 2L 通道的输入张量,直接喂给一个跟空间流结构类似的卷积网络。

这里还有个细节上的分支:光流本身有方向,那网络要不要能区分"运动方向反过来"这种情况?比如一个人抬手和放手,在光流上可能表现为方向相反的两组向量。作者尝试了两种处理方式,一种直接用光流的原始数值(带正负号,能区分方向),另一种用光流的绝对值(丢掉方向信息)。实验发现保留方向信息效果更好,这也算是印证了运动方向对动作识别确实重要。

再举个例子帮助理解堆叠光流这件事的意义。假设你要判断一个人是在挥拳还是在收拳,只看一张照片,拳头可能停在同一个位置,你根本分不出来。但如果给你连续十张照片拼起来看,拳头的移动轨迹一目了然,是往前冲还是往回缩,清清楚楚。堆叠多帧光流,本质上就是把这种"连续动作的轨迹"一次性摆在网络面前,让它不用自己去猜测时间上的关联,直接看到结果。

如果不堆叠多帧,只用单帧光流会怎样?论文里也做了消融实验,结果显示,堆叠的帧数越多,效果越好,从 1 帧提升到 10 帧,准确率有明显提升,但提升到后期会逐渐放缓,说明运动信息在时间维度上确实需要一定跨度才能被完整捕捉,但也不是帧数越多越好,存在一个性价比拐点。

数据不够怎么办:借用图片数据集

深度学习一直有个天生的软肋,就是特别吃数据。而当时的视频动作数据集,规模比图片分类数据集小得多。ImageNet 有上百万张标注图片,而 UCF-101 这类视频数据集撑死了几千个视频片段。数据量不够,网络很容易过拟合,学到的是数据集里的噪声而不是真正的规律。

作者用了一个巧妙的解法:多任务学习

> 多任务学习(Multi-task Learning):让同一个网络同时在多个相关任务上训练,共享底层特征,借助数据量更大的任务来弥补数据量小的任务的不足。

具体做法是,把网络的最后一层分类层拆成两支,一支对应 UCF-101 数据集的类别,另一支对应另一个动作数据集 HMDB-51 的类别,两个数据集同时参与训练,共享前面所有的卷积层参数。这样网络实际上见过的训练样本总量变多了,学到的特征也更有泛化能力。

这个思路类似于一个厨师同时在两家餐厅打工,虽然两家餐厅的菜单不完全一样,但刀工、火候这些基本功是通用的,同时在两边练习,比只在一家练习成长得更快。如果不做这种共享,单独在小数据集上死磕,网络很容易"背题",记住了训练集里的几个特例,换一批新视频立马失灵。实验证明,这种多任务训练确实带来了明显的准确率提升。

数据说话:双流网络到底强在哪

论文在两个标准数据集上做了完整测试,UCF-101 和 HMDB-51,这两个数据集覆盖了跑步、跳跃、弹吉他、刷牙等上百种日常动作类别。

| 方法 | UCF-101 准确率 | HMDB-51 准确率 |

|---|---|---|

| 空间流单独 | 72.6% | 40.5% |

| 时间流单独 | 81.0% | 54.6% |

| **双流网络(融合)** | **88.0%** | **59.4%** |

| 密集轨迹(手工特征,此前最强) | 87.9% | 57.2% |

看这张表最直观的感受是,融合之后的效果比任何单条流都强出一大截,88.0% 对比空间流的 72.6%,足足高了 15 个百分点。这说明两条流学到的信息确实是互补的,不是简单的重复劳动。

而更关键的历史意义在于,88.0% 相比密集轨迹的 87.9%,虽然只高出 0.1 个百分点,看起来微不足道,但这是深度学习在视频动作识别这个任务上第一次不落后于手工特征,甚至反超。放在 2014 年那个时间点,这句话的分量不亚于 AlexNet 在图像分类比赛上一炮打响。它证明了深度学习不是不能打视频,只是之前的路子没找对,一旦把运动信息合理地喂给网络,深度学习立刻就能追上甚至超越几年积累下来的手工特征方法。

后来的故事:这条路怎么被越走越宽

双流网络提出之后,后续的研究者们顺着这个思路做了大量延伸。

3 年后,Feichtenhofer 等人在 2016 年提出了改进版的双流网络融合方式,不再是简单地在最后一层把两条流的结果加权平均,而是让两条流在中间的卷积层就开始交互融合,进一步提升了准确率。

同样重要的一条延伸线是 3D 卷积网络的复兴。2017 年,Carreira 和 Zisserman(还是那个 Zisserman)提出了 I3D 网络,把双流网络里的 2D 卷积核直接膨胀成 3D 卷积核,同时结合大规模的 Kinetics 视频数据集进行预训练,这个方法后来成为视频理解领域很长一段时间的标杆架构。有意思的是,I3D 依然保留了双流结构,一条处理 RGB 画面,一条处理光流,说明双流的设计理念并没有被后来的方法抛弃,而是被吸收进了更强大的网络架构里。

再往后,随着计算资源和数据集规模的进一步扩大,研究者们开始探索能不能让网络直接从原始视频里学出运动信息,不再依赖预先计算好的光流,这条路线上出现了 SlowFast 网络等一系列工作,用不同帧率的两条通路分别捕捉快速运动和缓慢的场景变化,某种程度上也是双流思想的另一种变体。

写在后面

读这篇论文时最触动我的一点是,研究者没有执着于"让深度学习自己学会一切",而是老老实实承认,某些信息(比如光流里编码的运动方向)人类已经有很成熟的计算方法,直接喂给网络反而更高效。这其实是一种谦逊,不是所有问题都非要端到端解决才算高级。

另一个值得琢磨的地方是,单独的时间流比空间流表现更好这件事,提示我们对"看懂一个动作"这件事,运动轨迹可能比场景外观更本质。这跟人类识别熟人走路姿态、判断陌生人情绪时更依赖动态线索的直觉,其实是暗合的。

这篇论文没有解决的问题是,光流的计算本身还是依赖传统算法,不是端到端训练出来的,这多少留了一个补丁式的痕迹。后来的研究者们一直在琢磨怎么让网络自己学出运动表示,这条路走了快十年,直到今天依然没有完全画上句号。

Q&A

Q1:双流网络是什么?

A:双流网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别方法,用两个独立的卷积神经网络分别处理静态画面(空间流)和运动信息光流场(时间流),最后融合两者的判断结果,第一次让深度学习方法在准确率上超过了手工设计的密集轨迹特征。

Q2:双流网络为什么要单独处理光流?

A:因为视频识别的关键不只是画面里有什么,更在于动作怎么随时间变化。直接让网络从原始像素里学习运动规律效果不好,提前用光流算法把运动信息计算出来再喂给网络,效果明显更好,时间流单独的准确率能到 81%,比空间流的 72.6% 还高。

Q3:双流网络后来被哪些工作改进了?

A:2016 年 Feichtenhofer 等人改进了两条流的融合方式,让中间层就开始交互。2017 年 Carreira 和 Zisserman 提出的 I3D 网络把 2D 卷积核膨胀成 3D,并结合 Kinetics 大规模数据集预训练,成为后续视频理解领域的重要标杆,且依然保留了双流结构。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-