用两条眼睛看动作:当深度学习第一次打败了手工特征

2014年的深度学习圈子里,流传着一件让很多人不太舒服的事。

AlexNet 在 2012 年横空出世,把图像分类任务打得服服帖帖,深度学习一夜之间成了显学。可当研究者们兴冲冲地把同样的卷积神经网络搬到视频动作识别上,想着"这不是小菜一碟吗",结果却被现实浇了一头冷水。

在视频动作识别这个赛道上,深度学习居然打不过一群手工设计的特征。当时最强的方法叫密集轨迹

**密集轨迹(Dense Trajectories)**:一种手工设计的视频特征提取方法,通过追踪视频里密集分布的点随时间的运动轨迹,再结合方向梯度直方图等描述子来判断动作类别,是深度学习之前的主流方案。

它在标准测试集 UCF-101 上能做到 87.9% 的准确率,而深度学习方法即便费尽心思调参,也只能摸到 73% 左右的门槛,差了整整十几个百分点。这不是小数点后的差距,这是一整个量级的落后。

这事儿说起来挺讽刺。图像识别领域深度学习赢得那么轻松,怎么到了视频这里就翻车了?问题的根子在于,图片是静态的,一张图一个瞬间,卷积网络学的是空间里的纹理、边缘、形状。可视频不一样,视频的核心信息藏在时间轴上,一个人是在挥手还是在鼓掌,你光看一帧画面根本分不清,你得看他手臂在接下来的几帧里怎么动。

深度学习当时的卷积网络压根不知道怎么处理"时间"这个维度。它把视频当成一堆互不相关的图片扔进网络,自然抓不住动作的本质。

这就是 Karen Simonyan 和 Andrew Zisserman 在 2014 年提出双流卷积网络时面对的局面。他们俩来自牛津大学,同一个实验室,值得一提的是,这两人几个月后又发表了另一篇论文,叫 VGGNet,后来成了图像识别领域的经典模型之一。也就是说,这篇双流网络论文和 VGGNet 几乎是同期的工作,出自同一批人,同一段研究爆发期。

核心问题:怎么让神经网络"看懂"动作

要理解这篇论文的巧妙之处,得先弄明白动作识别到底难在哪。

一个动作,比如挥手,包含两种信息。一种是"长什么样",画面里有没有一个人、他的姿态是什么样子,这是空间信息。另一种是"怎么动",手臂从下往上还是从左往右,速度快还是慢,这是时间信息,也就是运动信息。

传统卷积网络天生擅长处理第一种。它一层一层地学纹理、学形状、学物体的局部结构,这套逻辑用来判断"这是不是一只猫"很拿手。可它对第二种信息完全没有设计,网络看到的永远是孤立的一帧,你给它一张挥手挥到一半的照片和一张挥拳挥到一半的照片,它可能根本分不出区别,因为静态画面长得太像了。

之前也有人尝试过用 3D 卷积直接在视频立方体上做卷积,指望网络自己学出时间维度的模式。但效果不理想,训练难度大,数据量不够的时候网络根本学不到有效的运动特征。

Simonyan 和 Zisserman 的思路很直接:如果网络自己学不好运动信息,那就别让它学,直接把运动信息喂给它。

这个思路听起来简单,但背后有个关键的观察。计算机视觉里早就有一种成熟的技术专门用来描述画面里的运动,叫光流。

**光流(Optical Flow)**:描述视频中每个像素点从一帧到下一帧移动方向和速度的向量场,本质上是一张"运动地图",箭头指向哪,像素就往哪动。

光流不是深度学习的产物,它是几十年计算机视觉研究积累下来的经典算法,已经被验证过能相当准确地捕捉画面里的运动模式。既然这个轮子已经造得很好了,何必让神经网络重新发明一遍?

双流网络:两个眼睛各管一摧

论文提出的架构其实概念上很朴素,搭两个完全独立的卷积网络,一个专门看外观,一个专门看运动,最后把两边的判断结果加权融合。

第一条流叫空间流

**空间流(Spatial Stream)**:输入是视频里的单帧 RGB 图像,负责识别画面里的场景、物体和人物姿态等静态外观信息,本质上和普通的图像分类网络没什么区别。

它的任务很纯粹,就是看一张照片,判断这个场景像什么动作。比如背景是游泳池,画面里有个人在水里,这条流就能大致猜到"这可能是游泳"。它靠的是场景和物体的先验知识,跟人在做什么动作的具体细节关系不大。

第二条流叫时间流

**时间流(Temporal Stream)**:输入不是原始图像,而是连续多帧计算出来的光流场,负责捕捉动作的运动模式,判断画面里的东西在往哪个方向、以什么样的方式移动。

这条流看到的不是"图像",而是一堆箭头,每个像素点在过去几帧里往哪个方向跑了多远。它完全不关心背景是红色还是蓝色,只关心运动轨迹长什么样。挥手和鼓掌在静态画面上可能很像,但运动轨迹完全不同,挥手是大幅度的左右或上下摆动,鼓掌是双手快速的相向运动。

这套设计的巧妙之处在于两条流分工明确,谁都不用逾越自己的边界。空间流不用费心思猜运动,时间流也不用管场景是什么。

这就好比一个乐队里的鼓手和贝斯手。鼓手负责节奏,贝斯手负责低音线,两人各自专注自己的声部,最后合起来才是完整的音乐。如果让鼓手同时兼顾贝斯的活,他可能哪个都做不精,因为两件事需要的技巧和注意力完全不同。如果不这样分工,让一个网络同时消化图像纹理和帧间运动这两种性质迥异的信息,网络的参数就得在两种任务之间拉扯,学习效率会大打折扣,这也正是之前 3D 卷积方法遇到的瓶颈之一。

论文里给出了一张第一层卷积核的可视化图,时间流学到的滤波器大多呈现出明显的方向性条纹,跟空间流学到的那种边缘、纹理检测器长得很不一样。这不是偶然,这说明网络自己也发现了,光流场里最重要的信息就是方向,箭头往哪指,这才是关键。

那融合方式呢?论文尝试了几种,最后发现简单地把两条流最后输出的分类分数按一定权重加起来,效果就已经相当好,甚至比更复杂的融合方式表现更稳。这也从侧面说明,两条流各自捕捉的信息确实是互补的,没有太多冗余,不需要网络内部做复杂的交互,简单相加就够了。

光流怎么塞进卷积网络:多帧堆叠的设计

时间流具体怎么处理光流数据,这里有个值得展开的细节。

光流本身是逐帧计算的,一帧对应一张光流图,光流图有两个通道,一个记录水平方向的位移,一个记录垂直方向的位移。论文没有只用一帧的光流,而是把连续 L 帧(论文里用的是 10 帧)的光流图沿着通道方向堆叠在一起,作为时间流网络的输入。

这个设计的用意是给网络提供更长的时间窗口。想想看,一个动作往往不是一瞬间完成的,挥拍打网球需要一个完整的引拍、挥拍、收拍过程,只看一帧光流,网络看到的可能只是挥拍中间某一瞬间的局部运动,信息量不够。堆叠多帧光流,相当于给网络一段"运动录像",而不是一张"运动快照"。

论文里做了对照实验,测试不同堆叠帧数对准确率的影响。结果显示帧数从 1 增加到 10 时,准确率持续提升,之后增益开始放缓。这说明动作识别确实需要一定长度的时间上下文,但也不是越长越好,边际收益会递减。

这就像你想判断一个人是不是在打招呼,只看他手抬到一半的那一瞬间,你可能猜不准,他也可能是在挠头。但如果给你连续看十几帧,抬手、挥动、放下这个完整过程,你几乎不会看错。可如果给你看几十秒的连续动作,多出来的那些帧其实提供不了额外的判断依据,因为招手这个动作本身就没那么长,多余的时间窗口只是在浪费计算资源。

数据不够怎么办:预训练和多任务学习的补丁

双流网络还面临一个现实问题:当时的视频动作数据集规模都不大,UCF-101 也就一万多个视频片段,这对于训练一个深层卷积网络来说远远不够,很容易过拟合。

论文这里用了两个补丁。第一个是给空间流做预训练

**预训练(Pre-training)**:先在一个大规模的数据集上训练网络学习通用特征,再把这些学到的参数迁移到目标任务上继续训练,从而减少对目标任务数据量的依赖。

空间流本质上就是在做图像分类,这跟 ImageNet 上的物体识别任务在技术形式上是相通的,所以直接借用在 ImageNet 上预训练好的参数作为起点,再用视频数据微调,效果立竿见影。

第二个补丁是针对时间流的,因为光流数据集没有 ImageNet 那么大的现成资源可以预训练。论文采用了一种叫多任务学习的策略

**多任务学习(Multi-task Learning)**:让同一个网络同时在多个相关任务上训练,共享底层特征表示,从而用更少的数据学到更泛化的特征。

具体做法是把 UCF-101 和另一个动作数据集 HMDB-51 放在一起训练,网络共享大部分参数,只在最后分类层区分是哪个数据集的任务。这相当于变相扩充了训练数据的规模和多样性,缓解了单一数据集数据量不足的问题。

实验证明这个策略确实管用,加入多任务学习后,时间流单独的准确率有明显提升。

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

论文在 UCF-101 和 HMDB-51 两个标准数据集上做了详尽的对比实验,几个关键结果值得摆出来看。

| 方法 | UCF-101 准确率 |

|---|---|

| 空间流单独 | 73.0% |

| 时间流单独 | 83.7% |

| **双流融合** | **88.0%** |

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

这组数字很能说明问题。如果只用空间流,准确率是 73%,这跟之前深度学习方法卡在的瓶颈差不多。单独的时间流反而比空间流表现更好,达到 83.7%,说明运动信息对判断动作类型的重要性其实超过静态外观。而当两条流融合起来,准确率冲到 88.0%,终于超过了密集轨迹的 87.9%。

这 15 个百分点的差距,从空间流单独的 73% 到双流融合的 88%,意味着什么?意味着原来每识别 4 个动作,深度学习就要认错 1 个多,而引入运动信息之后,错误率被大幅压低。这不是微调参数带来的小修小补,这是架构设计思路上的根本转变带来的质变。

更关键的历史意义在于,这是深度学习第一次在视频动作识别这个具体任务上超过了手工设计特征的方法。放在 2014 年这个时间点看,这句话的分量不亚于 AlexNet 在图像分类上掀起的那场革命。图像识别领域的深度学习革命已经打响两年了,视频领域却迟迟没能跟上,双流网络第一次证明了,只要给神经网络喂对了信息,不是让它自己苦苦挖掘运动模式,而是直接把光流这种经过验证的运动表示喂进去,深度学习照样能赢。

后续影响:从双流到更深的时空建模

双流网络这个思路提出之后,被后续研究者反复验证、扩展、改造,成了视频理解领域很长一段时间的基础框架。

2016 年,Feichtenhofer 等人发表了 Convolutional Two-Stream Network Fusion 论文,把两条流在网络中间层就进行融合,而不是等到最后输出层才简单相加,这样网络可以在更早的阶段学习两种信息之间的交互关系,进一步提升了准确率。

2017 年,Carreira 和 Zisserman(对,还是 Zisserman)发表了 I3D 论文,也就是 Inflated 3D ConvNet。他们把双流网络里的 2D 卷积核直接"膨胀"成 3D 卷积核,同时利用在 ImageNet 上预训练好的 2D 网络权重作为 3D 网络的初始化,既保留了双流网络里空间流和时间流分工的思想,I3D 依然是两条流的结构,又解决了 3D 卷积网络此前难以有效训练的问题。I3D 在 Kinetics 数据集这个规模更大的基准上刷新了当时的最好成绩,成为后续视频理解研究里被广泛使用的骨干网络之一。

这两个后续工作的共同点是,它们都没有推翻双流网络的核心思想,把外观和运动分开处理这件事本身依然被认为是对的,它们做的是优化融合方式和网络结构,让这套思想执行得更彻底、更高效。

写在后面

读这篇论文最触动我的地方,是它提醒你一个容易被忽略的道理:不是所有信息都值得让模型从零学起。

深度学习的叙事里常常暗含一种信仰,数据够多、网络够深,模型总能自己学到该学的东西。但双流网络的成功恰恰是反过来做的,它承认光流这个手工设计的运动表示已经足够好,直接把现成的知识注入网络,而不是逼着卷积层从原始像素里重新发明"运动"这个概念。

这跟后来大语言模型领域的一些争论隐隐呼应,到底该给模型加多少人类先验知识,还是让它端到端地自己学?双流网络给出的答案是,在数据不够、任务本身有成熟先验可用的阶段,插入这种先验往往比死磕端到端更划算。

它没解决的问题是,光流本身的计算是独立于网络训练的,是不是能设计出一种运动表示,既保留光流的有效性,又能端到端训练、和网络一起优化?后来的一些工作确实往这个方向走了,这算是双流网络留下的一个悬念。

Q&A

Q1:双流卷积网络是什么?

A:双流卷积网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别模型,用两个独立的卷积网络分别处理静态图像(空间流)和光流运动信息(时间流),再融合两者的判断结果,是深度学习首次在动作识别任务上超越手工特征方法的方案。

Q2:双流网络为什么要用光流而不是让网络自己学运动信息?

A:因为当时深度学习网络很难从原始视频帧里自动学出有效的运动模式,而光流是已经被验证成熟的运动表示技术,直接把光流输入网络能大幅提升效果,实验显示准确率从单独空间流的73%提升到融合后的88%。

Q3:双流网络之后还有哪些重要的改进工作?

A:2016年Feichtenhofer等人提出的卷积双流融合网络把两条流在中间层就融合,效果更好;2017年Carreira和Zisserman提出的I3D把2D卷积膨胀成3D卷积,同时保留双流结构,在Kinetics数据集上取得了当时最好的成绩。

作者声明:作品含AI生成内容
举报/反馈
分享到: 微博 QQ 空间
对本文内容有合作意向?
我们将在 1 个工作日内与您联系
留言咨询