2014 年之前,如果你在做视频动作识别,手工特征几乎是唯一靠得住的选择。
那时候有个方法叫密集轨迹
**密集轨迹**:一种手工设计的视频特征提取方法,通过追踪视频里密集采样的点的运动轨迹,再统计轨迹周围的图像和运动信息来识别动作
它当时的准确率是在 UCF101 数据集上能到 87% 左右。而深度学习呢,用普通的卷积神经网络直接怼视频帧,效果差得让人尴尬,只有六十多个百分点,跟手工特征差了二十多个点。
这事儿放到今天很难理解。2012 年 AlexNet 已经在图像识别上把手工特征打得没有还手之力,为什么到了视频这里,深度学习反而掉链子了?
问题出在时间维度上。
一张图片是空间信息,一个物体长什么样、在哪个位置,卷积网络处理这个得心应手。但视频不一样,视频的关键信息很多时候不在某一帧里,而在帧与帧之间的变化里。一个人挥手和一个人放下手臂,单看某一帧可能长得差不多,区别只有在看运动方向的时候才能分辨出来。
早期的方法简单粗暴,把视频的多帧图像叠在一起,当成一个更厚的图片扔进卷积网络,指望网络自己学会从这堆帧里提炼出运动信息。
结果网络学不明白。
这就是牛津大学 Karen Simonyan 和 Andrew Zisserman 在 2014 年面对的困境,他俩后来也是 VGGNet 的作者,这篇论文和 VGGNet 差不多是同一时期的工作,都是在琢磨怎么把卷积网络用得更聪明。他们意识到,如果指望一个网络同时学会"这是什么"和"这在怎么动",这个网络的任务其实是两件事拧在一起,太难了。
拆成两条独立的流水线
他们的解法是,把这两件事彻底分开,让两个网络各管一段。
一个网络专门看长得像什么,输入是单独一帧的 RGB 图像,负责识别画面里的物体、场景、人物姿态,这一路叫空间流
**空间流网络**:只接收单帧静止图像作为输入的卷积网络分支,专门负责识别画面中的物体和场景等静态视觉信息
另一个网络专门看动作怎么动,输入不是图像,而是光流场,负责捕捉运动信息,这一路叫时间流
**时间流网络**:接收光流场作为输入的卷积网络分支,专门负责捕捉画面中物体的运动方向和速度信息
**光流**:描述视频中相邻两帧之间每个像素点运动方向和速度的一种表示方法,本质上是一张记录了"谁往哪个方向动了多远"的图
最后,两个网络各自给出一个判断,再把两边的结果融合起来,得到最终的动作分类。
这个设计思路,放到生活里可以这样理解。假设你要判断一个人在做什么动作,你会同时用到两种线索。一种是这人穿着什么、周围环境是什么样,比如他手里拿着球拍,旁边是网球场,这些信息告诉你大概率跟打网球有关。另一种线索是他手臂挥动的方向和速度,这告诉你他到底是发球还是接球还是走路去捡球。如果你只看第一种线索,你分不清他此刻具体在做哪个动作,因为场景是静止的。如果你只看第二种线索,你可能连他在打网球还是在打羽毛球都分不清楚,因为挥拍动作有点像。两种线索缺一个都会出错,得两个一起用才靠得住。
如果不这样拆分会发生什么?论文里做了对比实验,只用空间流网络单独跑,UCF101 上的准确率是 72.8%。只用时间流网络单独跑,准确率是 81.2%。两个网络融合之后,准确率跳到 88.0%。
这十几个百分点的差距说明了什么?说明单看画面长什么样,或者单看东西怎么动,都只掌握了半张答案卷。两条线索合在一起才补全了另一半。
光流从哪来,又意味着什么
这里有个技术细节需要说清楚。时间流网络的输入不是原始视频帧,而是提前用传统算法计算好的光流场,作者用的是一种叫 TVL1 的光流估计算法。
这就带来一个问题,如果光流本身算得不准,后面网络再怎么厉害也没用。这就好比做菜,食材本身不新鲜,厨艺再好也救不回来。作者也确实在论文里花了篇幅讨论光流质量对结果的影响,包括用光流的两个方向分量,还是叠加多帧光流堆成一个更厚的输入,这些细节都影响最终效果。
作者还尝试了一个技巧,叫多任务学习
**多任务学习**:让同一个网络同时在多个相关数据集上训练,共享底层参数,以此提升模型的泛化能力
因为当时可用的视频动作识别数据集都不大,UCF101 只有一万多个视频片段,训练一个深度网络容易过拟合。作者把网络同时放到 UCF101 和另一个数据集 HMDB51 上一起训练,共享网络的大部分参数,只在最后分类层区分开,这样网络能从更多数据里学到更通用的特征。
这个思路类似于一个学生如果只做一种类型的习题,很容易只会那一种题的解法,遇到稍微变形的题就懵。如果同时做几门相关学科的习题,反而能学到更底层、更通用的解题思路。多任务训练之后,UCF101 上的准确率又往上提了一点,到了 88% 左右。
数据说话:这次深度学习真的赢了
论文里给出的核心对比数据大致是这样的:
| 方法 | UCF101 准确率 |
| 单帧卷积网络 | 约 73% |
| 空间流单独 | 72.8% |
| 时间流单独 | 81.2% |
| 密集轨迹(当时最强手工特征) | 87.9% |
| **两流网络融合** | **88.0%** |
这个数字表面上看只比密集轨迹高了 0.1 个百分点,看起来不算什么大胜。但意义不在这零点几个百分点上,意义在于这是深度学习第一次在视频动作识别这个任务上追平并小幅超过手工特征的天花板。
在这之前的两年,深度学习在图像分类上已经把传统方法按在地上摩擦,但在视频这个更复杂的任务上,一直被密集轨迹按着打。这篇论文证明了,只要网络结构的设计跟任务的本质匹配上,深度学习照样能在视频领域打出同样的战绩。
这个历史节点的分量,不亚于 2012 年 AlexNet 在图像识别竞赛上的横空出世。区别在于,AlexNet 靠的是堆更深的网络和更多数据,两流网络靠的是对问题本身的拆解,先想清楚任务里到底藏着几种不同性质的信息,再分别设计对应的处理方式。
这条思路后来走到了哪里
这篇论文的思路影响了后面好几年视频理解领域的研究方向。
3 年后,Carreira 和 Zisserman(同一个 Zisserman)在 2017 年发表了 I3D 论文,把两流网络里的 2D 卷积换成了 3D 卷积,让网络直接从连续帧里学习时空特征,不再需要单独计算光流,同时提出了更大规模的 Kinetics 数据集用于预训练,把动作识别的准确率又往上推了一大截。
再往后,2018 年 Facebook 的研究者提出了 SlowFast 网络,用两条不同帧率的路径分别捕捉慢速的语义信息和快速的运动信息,本质上还是延续了"把不同性质的信息分开处理再融合"这个核心思路,只是从光流换成了不同的时间采样率。
这些后续工作有一个共同点,都在往"能不能让网络自己学会提取运动信息,不再依赖手工算好的光流"这个方向努力。这从另一个角度说明了两流网络当年那个设计里,光流这一环其实是一个聪明但笨重的补丁,它解决了问题,但也留下了计算量大、依赖传统算法的尾巴,后来的研究者们一直在琢磨怎么把这个尾巴去掉。
写在后面
读这篇论文的时候,我总在想一个问题,为什么直接把多帧图像堆在一起喂给网络,网络学不出运动信息,而人为算好光流再喂进去,网络一下就学明白了。
这背后其实藏着一个挺朴素的道理,网络不是万能的,它能从数据里学到规律,但前提是这些规律得以某种方式"露出线头",让梯度下降能摸到方向。原始像素堆叠里的运动信息藏得太深,网络的卷积核很难自己摸索出"这是运动"这个概念。光流场把运动信息直接摆在了表面上,相当于帮网络把线头抽出来递到它手上。
这让我联想到教小孩学东西的场景。有些概念直接讲抽象定义,孩子听不懂,但换个方式,把抽象的东西先转化成孩子能直接感知的具体形式,孩子一下就开窍了。两流网络做的事情,某种程度上就是把"运动"这个抽象概念,转化成了光流场这种网络能直接感知的具体形式。
论文里还有一个细节我觉得值得单独说一下,作者尝试过把光流场用彩色编码可视化出来看,你会发现网络学到的第一层卷积核,很多都是方向敏感的滤波器,专门捕捉某个方向上的运动。这不是人为设定的,是网络自己从数据里学出来的。这说明网络在光流这种表示下,确实抓住了运动信息里最核心的那个维度,方向。
这篇论文没有解决的问题也很明显,光流计算本身很贵,而且是一个独立于深度学习之外的传统算法环节,整个系统并不是端到端可训练的。这个缝合的痕迹,后来花了好几年才被慢慢磨平。
Q&A
Q1:双流网络是什么?
A:双流网络是 2014 年 Simonyan 和 Zisserman 提出的视频动作识别方法,用两个独立的卷积网络分别处理单帧图像和光流场,再融合两者的判断结果来识别视频里的动作。
Q2:双流网络和密集轨迹相比效果怎么样?
A:在 UCF101 数据集上,双流网络融合后的准确率约为 88.0%,密集轨迹是 87.9%,双流网络首次让深度学习方法在视频动作识别上追平并略微超过了当时最强的手工特征方法。
Q3:双流网络之后有哪些改进工作?
A:2017 年的 I3D 用 3D 卷积替代了双流结构并引入 Kinetics 数据集预训练,2018 年的 SlowFast 网络用不同帧率的两条路径替代了光流,都延续了分离处理不同性质信息再融合的思路。
热门跟贴