}


2014 年,深度学习已经在图片识别上打得手工特征毫无还手之力。AlexNet 两年前横空出世,把 ImageNet 的错误率一下子拉低了十几个百分点,整个计算机视觉圈子都在往深度学习转向。

但有一个领域,深度学习死活打不过老方法:视频里的动作识别。

你给机器看一段视频,问它这个人在干什么,跑步、打网球还是在切菜,当时最好的深度学习方案准确率只有 65% 左右,而一个叫做**密集轨迹**

> 密集轨迹:一种手工设计的视频特征提取方法,通过追踪视频中密集分布的点的运动轨迹来描述动作,在深度学习出现前是动作识别领域的主流方案。

的手工特征方法,能做到 87% 左右。

差了 20 个百分点。这是什么概念?意味着每 5 个动作里,深度学习就要比手工方法多认错 1 个。这不是小差距,这是一个方向性的溃败。图片识别上深度学习赢得干净利落,视频动作识别上却输得莫名其妙。

问题出在哪?Karen Simonyan 和 Andrew Zisserman 这两位来自牛津的研究者决定把这件事弄明白。他们的答案后来发表在一篇叫《Two-Stream Convolutional Networks for Action Recognition in Videos》的论文里,论文标题已经把答案写出来了:两条流。

视频比图片难在哪

先说清楚这件事到底难在哪里。

识别一张图片里有没有猫,你只需要看清楚形状、颜色、纹理,这些都是空间信息,卷积网络处理这类问题已经很拿手了。

但识别一段视频里的人在做什么,光看形状远远不够。一个人站着不动,手臂举高,你能看出这是在做什么吗?如果他是在挥拍,那是打网球;如果他是在挥手,那是在打招呼。区别不在姿势的静态形状,在于这个动作接下来往哪个方向、以什么速度运动。

换句话说,动作识别的核心信息藏在**时间维度**里,藏在画面帧与帧之间的变化里,而不是藏在单帧画面的空间结构里。

之前的深度学习方案,几乎都是把视频当成一堆图片扔进卷积网络,指望网络自己从连续的帧里学出运动的规律。这个想法听起来合理,但实际效果很差。为什么?因为卷积网络的卷积核感受野有限,它擅长捕捉局部的空间结构,却很难从原始像素的时序变化里,直接学出"这个物体在往右上方移动"这种运动模式。

这就像让一个人通过反复看一堆没有编号的照片,去猜出这些照片原本的播放顺序和运动轨迹。如果照片本身就是杂乱的像素点,靠观察颜色变化去反推运动方向,效率极低,你要花大量时间在“这堆像素怎么排列才对”这件事上,反而没功夫去想“这个动作到底是什么”。而如果有人先帮你把每张照片之间物体挪动的方向和速度标好,你一眼就能看出这是挥拍还是挥手。

Simonyan 和 Zisserman 的洞察就在这里:**运动信息不该指望网络从原始像素里自己挖出来,应该提前算好,直接喂给网络。**

把动作拆成两条流

他们的方案叫“双流网络”

> 双流网络:一种将视频动作识别任务拆分成两个独立卷积网络分别处理的架构,一条处理静态画面,一条处理运动信息,最后把两条网络的判断结果融合起来。

具体怎么拆?

第一条流叫**空间流**,输入是视频里单独一帧的静态图像,负责识别画面里有什么东西,人、球拍、球场,这条流本质上就是一个普通的图片分类网络,可以直接借用已经在 ImageNet 上训练好的模型,因为识别物体这件事,图片网络已经很擅长。

第二条流叫**时间流**,这才是整篇论文的关键创新。它的输入不是原始画面,而是**光流场**。

> 光流场:描述视频中相邻两帧之间,画面里每一个点的运动方向和运动速度的一种图像表示,本质上是一张记录了“谁往哪儿动了多快”的地图。

光流场是怎么算出来的?拿两张相邻的视频帧,对比每个像素点的位置变化,用传统的光流计算算法把这个变化提取出来,变成一张新的图。这张图里不再是颜色和形状信息,而是纯粹的运动方向和运动强度信息。

把光流图喂给一个卷积网络,这个网络学的不是“这是什么东西”,而是“这个东西在往哪个方向、以什么方式运动”。

这里有个特别值得展开的设计细节:他们不是只用两帧之间的光流,而是把连续多帧,论文里用了 10 帧,的光流场堆叠在一起,作为时间流网络的输入。为什么要堆叠多帧而不是用一帧就够?因为一瞬间的运动方向可能有噪声,或者不足以代表一个完整动作的特征,比如挥拍这个动作,你只看其中一瞬间的手部移动,可能会跟挥手搞混,但看连续十帧的运动轨迹,挥拍的弧线和挥手的直线摆动就区分得很清楚了。

这就像你看一场足球比赛的慢动作回放,如果只给你一帧画面,你可能猜不出这脚是要传球还是要射门,但如果给你连续十帧的球和脚的运动轨迹,一下就能看出这是一次大力抽射还是轻轻一磕的传球。如果不堆叠多帧,只看单张光流图,网络就会像只看了一帧回放的观众,经常在动作方向相近但性质不同的动作之间犯迷糊。

两条流怎么合起来

空间流告诉网络画面里有什么,时间流告诉网络东西在怎么动,最后这两条网络各自输出一个分类预测结果,然后**融合**这两个结果,得到最终判断。

论文里试了几种融合方式,最简单的是直接平均两条流的预测分数,另一种是训练一个额外的分类器(比如 SVM)把两条流的输出特征拼起来再判断。实验发现后一种效果更好一些,但差距不算特别悬殊,这说明两条流各自已经学得足够好,融合方式本身不是决定成败的关键,两条流的分工才是。

这里有个很实际的问题:光流计算需要用到传统算法,这在当时的计算条件下并不便宜,视频一多,算光流的时间成本会很高。研究者也测试了如果用更粗糙、计算更快的光流算法会怎样,发现精度会有一些损失,但没有想象中那么严重,这说明网络对光流的精度有一定的容忍度,不需要完美的光流才能工作。

数据说话:两条流到底谁更强

论文在两个标准的动作识别数据集上做了实验,UCF-101 和 HMDB-51,这是当时学术界公认的两个动作识别基准测试集。

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

| 只用空间流 | 72.6% | 40.5% |

| 只用时间流 | 81.0% | 54.6% |

| **双流融合(平均)** | **86.9%** | **58.0%** |

| 双流融合(SVM) | **87.0%** | **59.4%** |

| 之前最好的手工特征方法 | 87.9% | 61.1% |

先看单独用空间流的效果:72.6%。这个数字比整体方案低了 14 个百分点,说明如果只看静态画面,网络确实抓不住动作的本质,它能认出画面里有人有球拍,但认不出这个人到底是在发球还是接球。

单独用时间流的效果反而更好,81.0%,比空间流高了将近 9 个百分点。这个结果本身就很说明问题:**运动信息比静态外观信息,对动作识别更重要。**

两条流融合之后,跳到 86.9%到 87.0%,比单独用任何一条流都高出至少 6 个百分点。这证明两条流确实是互补的,一条负责看清是什么,一条负责看清怎么动,合在一起才是完整的判断。

再看最后一行,当时最好的手工特征方法是 87.9%,双流网络的 87.0% 已经追到只差不到 1 个百分点,在 HMDB-51 上差距是 1.7 个百分点。

这个结果放在 2014 年,意义不亚于 AlexNet 在图片分类上的突破。这是深度学习第一次在视频动作识别任务上追平手工特征的水平,虽然还没有真正超过,但差距已经小到可以忽略,而且这是一个全新的方向,还有巨大的优化空间。要知道几个月前,深度学习在这个任务上还落后 20 个百分点,双流网络一下把差距缩小到 1 个百分点左右,这个跃升速度本身就说明了拆分“看什么”和“怎么动”这个思路抓住了问题的根本。

有意思的是,Simonyan 和 Zisserman 几个月后又发表了 VGGNet,那篇论文靠更深的卷积网络架构统治了当年的 ImageNet 图片分类比赛。两篇论文出自同一批人,同一个时间段,这不是巧合,他们显然是同时在探索“更深的网络能不能带来更好的特征”和“不同类型的输入该怎么拆分处理”这两条线,一条线走向了更深的网络,一条线走向了多流架构,殊途同归地都在推动深度学习往前走。

这个思路后来走到哪儿了

双流网络这个思路提出以后,被后续研究反复验证和扩展。

2015 年,Feichtenhofer 等人发表了《Convolutional Two-Stream Network Fusion for Video Action Recognition》,这篇论文没有停留在最后一步简单融合两条流的输出,而是探索在网络中间层就把两条流的特征交叉融合,让空间信息和时间信息更早地互相影响,结果把 UCF-101 上的准确率进一步推高,证明了双流架构还有很大的优化空间。

更值得一提的是 2017 年 DeepMind 团队发表的《Quo Vadis, Action Recognition》,提出了 I3D 网络。这篇论文把双流网络的思路和三维卷积结合起来,直接用三维卷积网络处理连续帧序列,同时保留双流结构(一条处理 RGB 画面,一条处理光流),在更大规模的 Kinetics 数据集上把动作识别的准确率大幅提升,也证明了双流架构不是一个只能在小数据集上奏效的技巧,而是一个能随着数据规模扩大继续发挥作用的基础设计。

这两个后续工作有一个共同点:它们都没有推翻双流架构的核心假设,把静态外观和运动信息分开处理这件事是对的,它们做的是在这个假设之上,用更巧妙的方式融合、用更强的网络结构去实现。这从另一个角度说明,Simonyan 和 Zisserman 当年抓住的那个方向性判断,经受住了后续几年的考验。

写在后面

这篇论文最打动我的地方,不是准确率数字本身,是那个最初的判断:网络学不出运动信息,那就别逼它学,直接把答案算好喂给它。

这背后有一层更普遍的思考:深度学习不是万能的自动特征提取器,它擅长从数据里挖掘某一类结构,但对另一类结构可能完全无能为力。承认这一点,然后针对性地帮它一把,往往比死磕“端到端全自动”更有效。后来很多领域的突破,比如给语言模型加检索模块,给推荐系统加显式的用户行为特征,某种程度上都是同一个逻辑:先搞清楚模型天生擅长什么、不擅长什么,再决定要不要人工介入。

论文里空间流和时间流各自的准确率差了近 9 个点,这个差距本身也值得琢磨:一个号称在做“动作识别”的任务,光靠看清楚画面里有什么东西,是远远不够的。这提醒我们,很多任务的名字会误导你对它本质的理解。

Q&A

Q1:双流网络是什么?

A:双流网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别方法,把视频拆成两条卷积网络分别处理,一条处理单帧静态画面识别物体外观,一条处理光流场识别运动信息,最后融合两条网络的判断结果。

Q2:双流网络比之前的方法好在哪?

A:在提出之前,深度学习方法在动作识别上只有 65% 左右准确率,比手工特征方法的 87% 低了 20 个百分点。双流网络把准确率提升到 87% 左右,几乎追平了当时最好的手工特征方法,是深度学习第一次在这个任务上接近手工方法水平。

Q3:为什么要单独设计一条处理光流的时间流?

A:因为动作识别的核心信息在于运动方向和速度,而不是单帧画面的静态外观,卷积网络很难直接从原始像素里学出运动模式,提前计算好光流场再喂给网络,能让网络专注学习运动特征,效果比单纯堆图片帧好很多。