2014年,那个打不过手工特征的深度学习

2014年之前,如果你去问一个做计算机视觉的研究者:"深度学习能不能用来识别视频里的动作?"
多半会得到一个犹豫的答案。
图像识别领域那时候已经天翻地覆了。2012年AlexNet横空出世,把ImageNet图像分类的错误率从26%砍到15%,深度学习一夜之间成了显学。但视频动作识别是另一个战场,而这个战场上,深度学习一直打不过一群"老古董"方法。
最有名的那个老古董,叫做**密集轨迹**
> 密集轨迹(Dense Trajectories):一种手工设计的视频特征提取方法,通过追踪视频中密集分布的点随时间的运动轨迹,统计轨迹周围的图像和运动信息来判断动作类别。
这套方法在UCF-101这样的动作识别数据集上能做到87%左右的准确率,而当时所有尝试用深度学习做视频动作识别的工作,都没能超过它。差距不是一两个点,而是实打实的十几个点。
这在当时是很尴尬的一件事。图像识别已经被深度学习攻克了,视频不就是图像加上时间维度吗?为什么深度学习偏偏在视频上失灵?
牛津大学的Karen Simonyan和Andrew Zisserman决定啃这块硬骨头。他们后来发表的论文,题目叫做《用于视频动作识别的双流卷积网络》,成为了这个领域的一个转折点。
有意思的是,这两位作者几个月后又发表了另一篇论文,叫VGGNet,成了图像识别领域另一个里程碑。也就是说,同一个团队,同一年,一边在图像识别上推陈出新,一边在视频识别上另辟蹊径。这不是巧合,而是同一批人对卷积网络能力边界的连续探索。
问题出在哪:视频比图像多了什么?
要理解这篇论文的贡献,得先搞清楚视频识别到底难在哪。
图像分类,网络只需要学会"看",一张照片里有没有猫,有没有狗,靠的是空间上的纹理、形状、颜色这些线索。
视频不一样。一个人在挥手还是在鼓掌,单看某一帧画面往往看不出来,你需要看到手臂随时间怎么运动。这个"随时间怎么运动"的信息,叫做**时序信息**
> 时序信息:视频中物体随时间变化的动态特征,比如运动的方向、速度、加速度,区别于单帧画面里的静态外观信息。
直接把视频的每一帧扔进一个普通的卷积网络,网络能学到的只是"这一帧长什么样",学不到"这个东西正在怎么动"。
早期有研究者尝试把3D卷积网络直接怼上去,让网络自己从连续帧里学运动模式。结果不理想,准确率远低于密集轨迹。为什么会这样?一个直接的原因是数据不够。ImageNet有上百万张标注图片,而当时最大的动作识别数据集UCF-101只有13320个视频片段,分成101类。对于需要从头学会捕捉运动模式的3D卷积网络来说,这点数据完全不够看。
这就好比让一个从没见过自行车的人,只给他看5张自行车的照片,就指望他学会骑车的诀窍,他连车把往哪边转会往哪边走都还没搞明白,更别提掌握骑车时身体重心该怎么协调了。数据量不够,模型学不到规律,这不是网络设计的问题,是原材料的问题。
如果不解决这个数据瓶颈,那网络架构设计得再精巧也是空中楼阁。Simonyan和Zisserman的思路是:既然网络自己从原始像素里学运动特征这么难,那能不能先用传统方法把运动信息提取出来,变成一种网络更容易消化的形式,再交给卷积网络处理?
核心方案:让两条网络各自专注一件事
论文提出的架构叫**双流网络**
> 双流网络(Two-Stream Network):由两个独立的卷积神经网络组成的架构,一条处理静态图像信息,一条处理运动信息,最后把两条网络的判断结果融合起来得出最终答案。
第一条流叫空间流,输入就是视频里的单张RGB画面,负责识别场景和物体,比如画面里有没有球场、有没有游泳池、人穿的是什么衣服。这条流本质上和普通的图像分类网络没什么区别,可以直接借用在ImageNet上预训练好的网络权重,省了不少功夫。
第二条流叫时间流,这才是整篇论文真正的巧思所在。它的输入不是原始画面,而是**光流场**
> 光流场(Optical Flow):描述视频中每个像素点从一帧到下一帧运动方向和速度的向量场,可以理解为给画面里每个点都画一个箭头,指出它接下来往哪儿动、动多快。
光流场是用传统算法(论文里用的是一种叫TVL1的方法)预先从连续帧里计算出来的,不是靠深度网络学的。计算出来之后,把水平方向的运动和垂直方向的运动分别存成两张灰度图,叠在一起变成一个双通道的输入,喂给第二条卷积网络。这条网络看到的,全是"什么东西往哪个方向动了多少",完全不掺杂颜色、纹理这些外观信息。
为什么要这么拆?因为静态外观和动态运动其实是两种性质完全不同的信息,一个是"这是什么",一个是"这在做什么"。让同一个网络既学会看清楚场景,又学会捕捉运动细节,相当于让一个学生同时准备两门风马牛不相及的考试,分心是必然的。拆成两条独立的网络,各自专注一件事,学习效率会高很多。
这就像一个厨房里,如果让一个人同时负责炒菜和结账收银,他手忙脚乱,两件事都做不好。但如果厨房里一个人专心炒菜,另一个人专心收银,各自把自己的活儿做到最好,最后配合起来,上菜又快又准。双流网络就是把"看懂场景"和"看懂动作"这两件事,分给两个专才去干,而不是逼一个通才硬扛。如果不拆开,直接让一个网络吃原始帧序列,前面提到的3D卷积网络的低准确率已经说明了后果,网络会在有限的数据里迷失方向,分不清哪些像素变化是有意义的运动,哪些只是噪声。
论文里还有一个细节值得说一下。为了让时间流吃到更丰富的运动信息,作者没有只喂给它两帧之间的光流,而是把连续10帧计算出来的光流场堆叠在一起,变成一个20通道的输入(10帧,每帧2个方向)。这样网络看到的不是某一瞬间的运动快照,而是一小段时间窗口里运动的演变过程,信息更完整。
两条流各自训练好之后,怎么把它们的判断结果合并成一个最终答案?论文尝试了几种融合方式,最简单的是直接平均两条流输出的分类概率,效果居然已经相当不错。更复杂一点的方法是训练一个额外的支持向量机来学习两条流该怎么加权组合。实验发现,加权融合比简单平均稍好一些,但差距不大,说明两条流本身各自已经学得足够好,融合方式的重要性反而是次要的。
数据不够怎么办:多任务训练的补丁
前面提到过,动作识别的数据集当时普遍偏小。UCF-101只有101类,HMDB51数据集更小,只有51类,视频数量也更少。用这么小的数据训练一个深度网络,很容易过拟合,网络记住了训练集里的细节,却学不会真正有用的规律。
作者用了一个叫**多任务学习**的技巧来缓解这个问题。
> 多任务学习(Multi-task Learning):让同一个网络同时在多个相关任务上训练,共享底层特征表示,用一个任务的数据帮助另一个任务学得更好。
具体做法是,网络的主体部分共享参数,但在最后接了两个不同的分类输出层,一个输出UCF-101的101类预测,另一个输出HMDB51的51类预测。训练的时候,来自两个数据集的视频都会经过同一个网络主体,只是最后走向不同的输出层。这样网络的底层特征提取能力,实际上是被两个数据集共同"喂养"出来的,相当于人为地把训练数据量翻了一倍还多。
这个思路放在生活里也很好理解。假如你想学一门新语言,比如西班牙语,但你能找到的西班牙语学习资料很有限。这时候如果你同时也学一点意大利语,两种语言的语法结构和词根有大量相似之处,学意大利语的过程会反过来加深你对西班牙语语法逻辑的理解。两门课分开看资料都不够,但放在一起学,底层的语言直觉反而练得更扎实。多任务学习就是让网络在两个"资料都不够"的任务上互相搭把手,如果不这么做,网络就只能在一个小数据集上死磕,很容易学出一些只对训练集里那几百个视频成立、但换个场景就失效的伪规律。
实验结果:数字说话
论文在两个标准数据集UCF-101和HMDB51上做了系统的对比实验。结果列出来看非常清楚。
| 方法 | UCF-101准确率 | HMDB51准确率 |
|---|---|---|
| 仅空间流(单帧RGB) | 72.6% | 40.5% |
| 仅时间流(光流) | 81.0% | 54.6% |
| 双流网络(平均融合) | 86.9% | 58.0% |
| **双流网络(SVM加权融合)** | **88.0%** | **59.4%** |
| 密集轨迹(当时最强手工特征) | 87.9% | 57.2% |
这组数字里藏着几个关键信息。
先看只用空间流的效果,72.6%。如果整篇论文只做了这一件事,也就是把单帧图像扔进卷积网络硬train一发,那结果会比密集轨迹的87.9%差了十五个百分点还多。这意味着每识别5个动作,光看画面外观的网络就要比手工方法多认错将近1个。这也印证了前面说的,只看静态画面,分不清挥手和鼓掌。
再看只用时间流的效果,81.0%,比空间流高了将近九个百分点。这个结果本身就很说明问题:运动信息对判断"这是什么动作"来说,比静态画面更关键。这也是为什么论文要专门设计一条网络来处理光流,而不是把运动信息当成外观信息的附属品。
而当两条流融合之后,准确率冲到88.0%,第一次超过了密集轨迹的87.9%。差距看起来很小,只有0.1个百分点,但这个"第一次超过"的意义,远大于这0.1个百分点本身。这是深度学习在视频动作识别这个具体战场上,第一次打赢了统治多年的手工特征方法。放在2014年的语境下,这句话的分量不亚于两年前AlexNet在图像识别上掀起的那场革命,只是这次的对手换成了视频。
在HMDB51这个更难、数据更少的数据集上,双流网络的59.4%对比密集轨迹的57.2%,优势更明显一些,超出了两个多百分点。这也从侧面证明了前面提到的多任务学习确实起了作用,因为HMDB51的数据量比UCF-101还要小,网络更容易过拟合,而多任务训练相当于给这个小数据集偷偷续了血。
一个容易被忽略的细节:光流到底重要在哪
这篇论文里有个实验设计的小心思,值得单独说一说。
作者做了一个对照实验,看看如果把光流场换成简单的帧差(就是直接拿后一帧的像素值减前一帧),网络的表现会怎样。结果发现效果明显不如用光流。这说明真正有用的运动信息,不是简单的像素变化,而是经过光流算法计算出来的、带有方向和幅度的结构化运动信息。
这就好比你想知道一支球队昨晚比赛跑动积极不积极,如果只是简单地把两张不同时刻的全场照片叠在一起看哪里变了颜色,你能看出些模糊的轮廓,但看不出谁往哪个方向跑了多远。而光流相当于给每个球员的每一步都标好了箭头和长度,你一眼就能看出这是一次快速反击还是原地倒脚。信息的组织方式,直接决定了后续网络能从里面挖出多少有效模式。如果不做这层预处理,直接把原始像素差异丢给网络,网络得自己从噪声里摸索出运动的方向性,这正是前面提到的纯3D卷积网络效果不佳的原因之一。
这篇论文之后发生了什么
双流网络提出之后,后续研究者在这个框架上做了大量延伸工作。
2015年,Feichtenhofer等人发表了一篇论文,研究双流网络里两条流之间该在网络的哪一层进行信息交互,而不是等到最后一层才简单相加。他们发现让两条流在中间层就开始交换信息,效果比只在最后融合更好,这个思路后来被称为跨流融合。
2016年,Wang等人提出了**时序分段网络**(Temporal Segment Network),把一个长视频切成若干段,每段单独跑一次双流网络,再把各段结果汇总,这样网络能看到整个视频的时间跨度,而不只是抽样出来的几个片段,进一步把UCF-101上的准确率往前推了几个点。
2017年,Carreira和Zisserman(还是Zisserman)提出了**I3D网络**(Inflated 3D ConvNet),把2D卷积核直接"膨胀"成3D卷积核,同时结合双流的思路,一条处理RGB,一条处理光流,两条都换成3D卷积网络。这篇论文还顺带发布了一个规模远超UCF-101的新数据集Kinetics,彻底解决了数据不够的老问题,让3D卷积网络终于有了施展空间。
从这条脉络看得出来,双流网络提出的"拆开处理外观和运动"这个核心思路,在后续几年里被反复验证和沿用,只是承载运动信息的具体网络结构一路在换,从2D卷积到跨层融合到最后的3D卷积。
写在后面
读这篇论文的时候,最让我意外的不是准确率数字,而是那个只有0.1个百分点的胜利。研究者们可以选择等到深度学习方法明显碾压手工特征再发表,但他们没有等,抓住了这个刚刚反超的临界点。这说明科研里的"第一次"往往不是靠压倒性优势赢的,而是靠找准了对的方向,哪怕开局只领先一点点。
另一个让我反复琢磨的细节是,网络自己去学运动特征学不好,但把光流这种传统算法算出来的结构化信息喂给网络,效果立刻就上去了。这其实是在提醒我们,深度学习不是万能的暴力美学,很多时候传统方法几十年积累下来的领域知识,用对了地方,反而是深度网络的加速器,不是被淘汰的对象。
这个思路会不会在别的领域也适用,比如现在很火的一些多模态大模型,是不是也存在某种"手工先验"可以先做一遍粗加工,再交给网络去学更高层的东西?这个问题我觉得还挺值得琢磨。
Q&A
Q1:双流网络是什么?
A:双流网络是2014年Simonyan和Zisserman提出的视频动作识别架构,由两条独立的卷积神经网络组成,一条处理单帧RGB图像捕捉场景外观,一条处理光流场捕捉运动信息,最后融合两条网络的判断结果,是深度学习首次在视频动作识别上超过手工特征方法密集轨迹的工作。
Q2:双流网络为什么要分成两条网络处理,不能用一个网络吗?
A:因为静态外观信息(这是什么)和动态运动信息(在做什么)性质完全不同,让一个网络同时学两种信息效果不好,此前直接用3D卷积网络从原始帧学习运动特征的尝试准确率明显不如手工特征,拆成两条网络各自专注一件事,训练效率和最终效果都更好。
Q3:双流网络的效果到底比传统方法密集轨迹好多少?
A:在UCF-101数据集上,双流网络融合后准确率达到88.0%,密集轨迹是87.9%,只高出0.1个百分点,但这是深度学习在这个任务上第一次反超手工特征方法,意义大于数字本身。在HMDB51数据集上双流网络的优势更明显,达到59.4%对比密集轨迹的57.2%。