2014 年之前,如果你是一个研究视频动作识别的学者,手里有两条路可选。
一条路是用手工设计的特征,比如密集轨迹
密集轨迹*:一种手工设计的视频特征提取方法,通过追踪视频中密集采样的点的运动轨迹,统计轨迹周围的图像和运动信息来描述动作
(资料图片仅供参考)
这条路当时的最好成绩大概是 85% 到 87% 的准确率,稳定、可靠,是各路比赛的冠军常客。
另一条路是用卷积神经网络
卷积神经网络*:一种通过卷积操作自动从图像中学习特征的深度学习模型,在图像分类领域已经取得巨大成功
这条路听起来很美好,毕竟卷积网络刚刚在图像识别上创造了 AlexNet 的奇迹。但事实很打脸。几乎所有把卷积网络直接搬到视频动作识别上的尝试,效果都不如手工特征。差距不是一点点,而是实打实的十几个百分点。
这在当时是一件很尴尬的事。深度学习明明在图像上已经证明了自己,为什么到了视频上就不灵了?
这正是 Karen Simonyan 和 Andrew Zisserman 这两位牛津大学研究者在 2014 年那篇论文里要回答的问题。他们的答案很简洁,叫做双流卷积网络。这篇论文后来成了视频理解领域绕不开的起点,几乎所有后续的深度学习视频方法,都能在它身上找到血缘关系。
视频比图片难在哪里
先说清楚这件事到底难在什么地方,不然后面的设计思路你会觉得莫名其妙。
图片分类,网络要做的事情说白了就是认出画面里有什么东西。一张猫的照片,网络学会识别耳朵、胡须、毛发的纹理,基本就能猜对。
但动作识别不一样。同样一张静止的画面,你能看出这是一个人,但你能看出他是在"挥手告别"还是"举手投篮"吗?很难,因为动作这个概念本身就依赖时间。你至少需要看到连续几帧,才能判断这个人的手臂是在往上抬还是往下放,是挥了一下还是持续举着。
换句话说,图片分类只需要外观信息,而动作识别还需要运动信息。
当时研究者尝试的做法,大多是把视频当成一堆图片的堆叠,直接扔进卷积网络,期望网络自己从像素的时间变化中学出运动的规律。这个思路听起来合理,但实际训练出来的效果很差。
为什么会这样?两位作者给出了一个关键判断:卷积网络虽然擅长从静态图像里挖掘空间结构,但让它直接从连续帧的像素堆叠里学出运动模式,太难了。运动信息藏得太深,网络自己摸索的效率太低,而当时能用来训练的视频数据集又太小,根本不够网络自己把这套复杂的运动规律学明白。
这就好比让一个从没学过乐理的人,直接给他一堆乐谱录音的波形图,让他自己总结出"什么样的波形变化算是一段旋律"。理论上信息都在波形里,但要靠自己从零摸索出规律,数据量得海量才行。如果乐理老师直接告诉他"音高的变化规律是这样,节奏的规律是那样",分开学,反而更快上手。这就是为什么单纯堆叠帧效果不好,信息虽然都在,但让网络自己从原始像素里把运动规律挖出来,效率太低。
双流架构:把外观和运动这两件事分开学
两位作者的解决思路,现在回头看非常直接,但在当时是个聪明的绕弯。
既然运动信息不好从原始像素里直接学,那就别让网络自己学了,直接把运动信息用一种更明确的形式喂给网络。
这个更明确的形式,就是光流
光流*:描述图像中像素点在连续两帧之间移动方向和速度的向量场,可以理解为把"运动"这件事用一张张箭头图画出来
具体来说,整个网络被拆成两条独立的流。
第一条叫空间流
空间流*:处理单帧RGB图像的卷积网络分支,负责识别画面中的物体、场景、人物外观等静态信息
它输入的是普通的一帧图像,负责的工作和一般的图像分类网络差不多,认出画面里有什么东西,比如识别出这是一个游泳池,画面里有个人。
第二条叫时间流
时间流*:处理光流场的卷积网络分支,专门负责识别动作的运动模式
它输入的不是原始图像,而是提前计算好的光流场,也就是相邻几帧之间每个像素的运动方向和速度。这条流看不到颜色、看不到纹理,它眼里只有一堆箭头,记录着画面里哪里在往哪个方向动、动得多快。
两条流各自训练各自的卷积网络,最后把两边的判断结果做一个融合,给出最终答案。
![双流网络结构图]
论文里给出的架构图非常直观:上面一条通路吃进单张RGB帧,下面一条通路吃进连续多帧计算出来的光流叠加图,两条通路结构相似但参数完全独立,训练到最后再用简单的加权或者SVM把两边的预测分数合并。
这个设计的巧妙之处在于,它把一个网络学不好的复杂问题,拆成了两个网络都能学好的简单问题。空间流干的活跟成熟的图像分类几乎一样,现成的经验直接搬过来。时间流虽然是新东西,但因为光流已经把运动信息用非常显式的方式表达出来了,网络不需要再费力从像素变化里反推运动,它只需要认出光流场里的模式就行,这个任务对卷积网络来说反而不难。
这就像是一个乐队指挥,原本想训练一个全能选手,既要懂旋律又要懂节奏,还要一个人同时兼顾。结果发现效果不好,索性拆成两个专才,一个专门盯旋律线,一个专门盯鼓点节奏,两人各司其职,最后合奏出来的效果反而比一个人硬撑要好得多。如果不拆开,硬让一个模型同时兼顾两件事,那就是前面说的那种效果很差的堆叠帧方案,历史已经验证过这条路走不通。
这里有一个特别值得展开说的细节。作者们观察第一层卷积核学到的东西,发现时间流学出来的滤波器,大多是明显的方向性模式,专门捕捉某个方向上的运动强弱。这不是人为设计出来的,是网络自己从光流数据里学出来的。这说明网络的确抓住了运动信息里最核心的东西,就是方向和强度,这也从侧面证明了把光流单独拎出来喂给网络,是一个抓住了问题本质的设计。
光流怎么算出来,这件事本身也有讲究
时间流吃的光流,不是随便算的。
作者用的是一种叫 TVL1 的光流估计算法,这是当时公认精度和速度都比较均衡的传统算法。他们没有用深度学习去学光流,而是直接用现成的经典算法先把光流算出来,再喂给网络。
为什么不直接把原始视频帧喂进去让网络自己学运动呢?前面已经说过,数据量不够,网络学不出来。而现成的光流算法已经是几十年计算机视觉研究打磨出来的成熟工具,精度足够高,直接拿来用,相当于站在前人肩膀上,省掉了让网络从零学习运动概念这一整个环节。
除了光流的选择,作者还做了两个细节优化,这两个细节看起来小,但对最终效果影响不小。
第一个是把光流场里的水平和垂直两个方向的分量,分开当成两个通道输入,而不是合成一个方向和大小的表示。这样网络能更细致地分辨横向运动和纵向运动的差异。
第二个是引入了一种叫双向光流的做法,也就是既算前一帧到后一帧的光流,也算后一帧到前一帧的光流,两个方向的信息都给网络。这相当于给网络提供了更完整的运动上下文,不只是知道"接下来会往哪动",也知道"刚才是从哪来的"。
这些优化听起来琐碎,但正是这类细节决定了同一个大方向下,不同实现之间效果的差距。这也提醒我们一个道理:一个好的框架思路只是起点,真正把效果做出来,往往要在数据预处理这类看似不起眼的环节上反复打磨。
数据太少怎么办:多任务学习登场
光流方案解决了运动信息怎么表示的问题,但还有一个更棘手的麻烦:训练数据太少。
当时最大的动作识别数据集,UCF101 也只有一万多段视频,分成101类动作。这个规模跟同期用来训练图像分类网络的 ImageNet 比,差了两个数量级。ImageNet 有超过一百万张标注图片,而 UCF101 连它的百分之一都不到。
数据量不够,直接训练一个大网络很容易过拟合,也就是网络记住了训练集里的细节,却学不会真正管用的规律,遇到新视频就掉链子。
作者的解法是多任务学习
多任务学习*:让同一个网络同时在多个相关但不完全相同的数据集或任务上训练,共享底层特征表示,以此增加有效训练数据量
具体做法是,他们把两个不同的动作识别数据集,UCF101 和 HMDB51,合并起来一起训练同一个网络。网络的底层结构共享,但在最后输出层,针对两个数据集分别设了独立的分类输出头,因为两个数据集的动作类别定义并不完全一样,不能强行合并成一套标签。
这个思路本质上是让网络在更大的数据池子里学习更通用的特征,同时又不强行抹平两个数据集之间类别定义的差异。相当于让一个学生同时上两门课外班,虽然两门课的具体考试内容不一样,但学的底层知识,比如基础的运动模式识别能力,是可以相互借力的。如果不做这一步,只用单一数据集从零训练,这么小的数据量根本撑不起一个深层网络,过拟合会非常严重,实验里也确实验证了这一点,多任务训练后准确率有明显提升。
这个细节其实反映了一个更普遍的问题。深度学习方法通常是数据饥渴型的,越深的网络越需要越多的数据才能训练充分。而现实世界里很多细分领域的数据集规模都不大,这个多任务学习的思路,某种程度上给后来的研究者提供了一个思路模板:数据不够,就想办法把相关但不同的数据源拼起来用。
结果:深度学习第一次赢了
说了这么多设计思路,最后要看实际效果。
在 UCF101 数据集上,双流网络达到了 88.0% 的准确率。这个数字放在今天听起来可能没什么惊喜,但放在2014年的语境里,意义完全不同。
当时最好的手工特征方法,像是改进版的密集轨迹特征,大概在 87% 左右。而在这篇论文之前,几乎所有直接用深度学习做视频动作识别的尝试,准确率都停留在 65% 到 75% 之间,和手工特征差了十几个百分点。
双流网络的 88.0%,第一次让深度学习方法反超了手工特征方法。这在当时是有分量的一件事,某种意义上和 AlexNet 在图像识别上掀起的震动是同一个级别的历史节点,只是发生的领域从静态图片换成了视频。
论文里也做了拆解实验,来验证两条流各自的贡献。
| 方法 | UCF101 准确率 |
| 仅空间流 | 72.6% |
| 仅时间流 | 81.0% |
| **双流融合** | **88.0%** |
这组数字很值得细品。仅用空间流,也就是只看单帧图像识别动作,准确率只有 72.6%。这也验证了前面说的判断,单靠画面外观,很多动作是分不清楚的。
仅用时间流,单靠光流场,准确率反而更高,达到 81.0%。这说明运动信息对动作识别的重要性,甚至超过外观信息。这个结果在当时也算是给了研究者一个提醒:过去很多深度学习方案都把重心放在处理RGB画面上,却低估了运动信息本身的价值。
而两者融合之后,准确率跳到 88.0%,比单独任何一条流都高出至少 7 个百分点。这说明外观信息和运动信息不是互相替代的关系,而是互补的,一个知道"画面里有什么",一个知道"东西怎么动",合在一起才能给出更完整的判断。
这就好比破案,单看监控画面里的人长什么样,只能猜个大概嫌疑范围,单看嫌疑人移动路径的轨迹记录,也只能猜个大概行为模式,但两份材料放在一起交叉比对,结论就靠谱多了。如果只用一份材料办案,漏判和误判的概率都会明显升高,这正是仅空间流或仅时间流准确率都明显低于融合结果的原因。
在另一个数据集 HMDB51 上,双流网络也拿到了 59.4% 的准确率,同样超过了当时的手工特征基准。
这篇论文之后发生了什么
双流网络这个思路一开花,后面几年整个视频理解领域几乎是照着这条路往前走的。
3 年后,Feichtenhofer 等人在 2016 年提出了 ST-ResNet,把双流架构里的基础网络换成了效果更强的残差网络结构,并且设计了更精细的跨流融合机制,让空间流和时间流在网络中间层就开始互相传递信息,而不是等到最后才简单加权合并,这进一步提升了准确率。
2017 年,Carreira 和 Zisserman(依然是同一个 Zisserman)提出了 I3D 网络,这是一次更大的架构升级。I3D 把原本处理2D图像的卷积核,直接扩展成了3D卷积核,让网络可以直接在时间维度上做卷积操作,某种程度上是把双流网络里时间流单独处理运动的思路,和空间维度的卷积结合到了一个统一的3D框架里。同时他们还提出了一个新的大规模视频数据集 Kinetics,用来解决前面提到的训练数据不足问题,这也是对双流网络论文里"数据太少"这个痛点的正面回应。
这两项工作,加上后续更多的变种,基本上定义了此后好几年视频动作识别领域的技术路线图。双流网络提出的核心洞察,外观信息和运动信息应该被区别对待、又需要被融合利用,这个基本判断到今天依然被广泛认可,即便后来的具体实现方式已经从两条独立的2D网络,演化成了各种更复杂的3D卷积、时空注意力机制。
写在后面
重新读这篇论文,最让我意外的是它解决问题的方式:不是让深度学习去学会一切,而是先想清楚人类已经掌握了什么,把那部分直接喂给网络,让网络专心学它真正擅长学的那部分。
光流算法是几十年传统计算机视觉的积累,作者没有想着用深度学习取代它,而是拿来当输入。这和现在很多"端到端从零学习"的思路是相反的,反而提醒我一个容易被忽略的事:有时候把问题拆解得更明确,比一股脑扔给模型让它自己悟,效率高得多。
另一个触动我的细节是仅用光流的准确率居然比仅用RGB画面还高。这多少有点反直觉,毕竟人类识别动作的时候,好像更多依赖看到的场景和物体。这提示动作识别这件事里,运动模式本身携带的信息量,可能被我们的直觉低估了。
一个人蒙着眼睛,只靠触摸感受一个物体表面纹理和一个人只靠肢体的运动轨迹判断这个人在做什么,哪个信息量更大,可能真的没有绝对答案,取决于具体场景。这篇论文用数据给了一个具体又略显意外的回答。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是2014年由牛津大学Simonyan和Zisserman提出的视频动作识别方法,通过两条独立的卷积网络分支分别处理单帧图像和光流场,再融合两者结果,第一次让深度学习方法在视频动作识别准确率上超过了手工特征方法。
Q2:双流网络为什么要分成空间流和时间流两条通路?
A:因为单纯让卷积网络从连续帧像素堆叠里自己学出运动规律,效果很差,当时数据量也不够。分开处理后,空间流专注识别画面外观,时间流专注识别提前算好的光流运动模式,两个任务都变得更容易学,最后融合效果比任何单一分支都好。
Q3:双流网络的准确率具体是多少,比之前的方法好在哪?
A:双流网络在UCF101数据集上达到88.0%准确率,超过了当时最好的手工特征方法(约87%),也远超之前直接用深度学习处理视频的方案(65%到75%区间),是深度学习首次在这个任务上反超传统方法。