2014 年,深度学习已经在图片识别上打得风生水起。AlexNet 两年前横空出世,把 ImageNet 图像分类的错误率从 26% 砍到 16%,整个计算机视觉圈都在往卷积神经网络这条路上冲。
但有一件事很奇怪。
同样是卷积神经网络,同样是深度学习最擅长的视觉任务,到了视频动作识别这个领域,却怎么打都打不过一群老派的手工特征方法。
你可能没听过这些方法的名字,比如密集轨迹*
密集轨迹(Dense Trajectories):一种传统的视频动作识别方法,通过在视频画面上密集采样点并追踪它们随时间的运动轨迹,再手工设计特征描述这些轨迹的形状和方向
但它在当时的权威数据集上准确率能做到 85% 以上,而同期尝试用深度网络硬啃视频的论文,准确率普遍卡在 65% 到 70% 之间。二十个百分点的差距不是小数目。
二十个百分点的差距意味着什么?意味着在识别一百个动作视频时,深度学习方法要比手工特征多认错二十个,相当于每五个视频里就多错一个。这在图像识别领域已经是被淘汰方法和最先进方法的差距量级。
这就是这篇论文出现之前的真实局面:深度学习在图片上摧枯拉朽,在视频上却举步维艰。牛津大学 Karen Simonyan 和 Andrew Zisserman 这两位研究者决定要搞清楚,问题到底出在哪。
视频比图片难在哪:卡住深度学习的那道坎
图片识别只要解决一个问题,这张照片里有什么东西。
视频动作识别要解决两个问题,画面里有什么东西,以及这些东西是怎么动的。
一个人站在那里张开双臂,可能是在打招呼,也可能是要拥抱,也可能是在做体操的预备动作,单凭一张静止画面很难分辨。你需要看到接下来几帧发生了什么,双臂是合上了还是保持张开,身体是前倾还是站直,这些动态信息才是判断动作类别的关键线索。
问题是,当时的卷积神经网络非常擅长从静态图像里挖掘空间结构,边缘、纹理、形状、颜色分布,这些都是它的拿手好戏。但让它直接吃进一段连续视频帧,试图自己学出时间维度上的运动规律,效果就是不理想。
研究者试过很多办法,把多帧图像直接堆叠起来喂给网络,让网络自己从像素变化里推断运动。这个思路听起来合理,但实际训练出来的模型,性能就是上不去。
Simonyan 和 Zisserman 的直觉是,问题可能不在网络结构本身,而在于喂给网络的原始材料。像素强度的变化对网络来说太隐晦了,运动信息藏在一堆数字的细微差异里,网络很难自己把它挖出来。
如果换一种方式,把运动信息提前用一种更直白的形式计算出来,再喂给网络,会不会好很多?
这个思路直接催生了这篇论文最核心的设计,把一个视频拆成两条完全独立的处理流水线,一条专门看画面内容,一条专门看运动方向。
双流网络:让两个专家各干各的活
这篇论文提出的方法叫做双流卷积网络*
双流卷积网络(Two-Stream Convolutional Networks):一种视频动作识别架构,用两个独立的卷积神经网络分别处理视频的静态外观信息和动态运动信息,最后融合两者的判断结果
这个架构说白了就是两个卷积神经网络各干各的活,谁也不管谁,最后在结果层面碰头。
第一条流叫空间流*
空间流(Spatial Stream):双流网络中处理单帧静态图像的分支,负责识别画面中的物体、场景和人物外观等空间信息
这一路的输入就是视频里随便抓的一帧画面,跟普通图像分类网络干的事情一模一样。它看到的是场景是室内还是室外,有没有球、有没有乐器、人物穿什么衣服,这些静态线索对判断动作类别也很有用,比如看到游泳池和泳衣,就大概能猜到是游泳这个动作。
第二条流叫时间流*
时间流(Temporal Stream):双流网络中处理运动信息的分支,输入是光流场而不是原始图像,专门捕捉画面中物体和人体的运动模式
这一路吃的不是原始画面,而是一种叫光流*
光流(Optical Flow):描述图像序列中每个像素点在连续帧之间移动方向和速度的向量场,本质上是把"什么东西往哪个方向动了多少"这件事用数字精确表达出来
的东西。光流场把画面里每一个点的运动方向和速度都算出来,变成一张张只包含运动信息、不包含颜色和纹理的图。时间流网络专门在这种运动图上训练,学会从运动模式里判断这是在跑步、跳跃还是挥手。
这两条流训练完之后,网络在预测阶段各自给出一个判断,再把两边的分数做个加权平均,得出最终结果。
为什么要这样拆开而不是让一个网络同时处理外观和运动?
这里有个类比可能说得清楚。想象你要判断一个人在做什么运动,你可以同时看两份材料,一份是照片,一份是这个人身体各部位运动轨迹的示意图。如果把这两份材料硬印在同一张纸上叠在一起给你看,你反而会看得更费劲,因为颜色纹理和运动箭头混在一起,眼睛会不知道该聚焦在哪里。但如果分开给你看,先看照片形成一个初步判断,再看运动轨迹图验证或补充这个判断,两条线索独立发挥作用,最后综合起来,判断反而更准更快。深度网络在这一点上和人的认知机制出奇地相似,把两种性质完全不同的信息硬塞进同一套卷积核里学习,网络要同时兼顾两种模式的特征提取,学习负担太重,效果打折。分开训练让每个网络专心做一件事,反而学得更透彻。
如果不这样分流会发生什么?论文里其实间接给了答案。之前那些直接把多帧图像堆叠喂给单一网络的尝试,效果始终不如人意,这就是没有分流硬吃的下场,运动信息被淹没在静态像素的汪洋大海里,网络自己很难把这根针从草堆里挑出来。
值得说的是,时间流单独拿出来跑,效果好到让人意外。在标准测试集上,光是时间流单独作战,准确率就能达到 83.7%,远超人们对"运动信息比外观信息更次要"的预设。这说明运动模式本身包含着极其丰富的判别信息,一个人挥手和一个人挥拳,光凭运动轨迹的差异就足够区分开来,根本不需要看清这个人穿什么颜色的衣服。
光流场:把"动了多少"翻译成机器能读的语言
光流场这个概念值得多说几句,因为它是这篇论文能成功的地基。
光流本质上是一种运动的翻译。原始视频里,物体运动这件事是隐藏在连续帧像素值变化里的,你要盯着一堆数字的细微起伏才能猜出什么东西往哪动了。光流算法做的事情,就是把这种隐藏的运动信息显式计算出来,变成一张清清楚楚标好方向和速度的地图。
论文里用的是一种叫做密集光流的计算方法,给画面里的每一个像素点都算出一个运动向量,包含水平方向的位移和垂直方向的位移。把这两个方向的位移分别存成两张灰度图,叠在一起就构成了喂给时间流网络的输入。为了让网络能感受到一段时间内的运动趋势而不是单帧之间的瞬时抖动,论文还把连续十帧的光流叠在一起作为一个输入单元,这样网络看到的是一小段时间窗口内完整的运动轨迹,而不是孤立的一帧。
这里有个技术细节特别值得琢磨。研究者试过两种叠光流的方式,一种是让镜头始终固定在同一批像素点上追踪运动,另一种是每一帧都重新计算光流再简单堆叠。实验发现前一种方式效果更好,这符合直觉,因为持续追踪同一批点能捕捉到运动的连续性和轨迹形状,而不只是零散的瞬时快照。
这就好比你想判断一个人到底是在走路还是在原地踏步,光看某一瞬间脚的朝向根本判断不出来,你得追踪脚这几秒钟内到底往前挪了没有。如果只看单帧光流,网络能感知到的只是"这一瞬间有东西在动",却感知不到"这个动作有没有位移趋势",走路和原地踏步这类高度相似的动作就很容易被搞混。持续追踪同一批点,相当于给网络提供了一段完整的运动电影而不是几张零散的运动快照,判断的把握自然更大。
有意思的是,研究者还发现,把光流场里的方向信息做一个小小的处理,比如同时提供水平和垂直两个方向的光流分量,效果会比只提供一种简化的运动幅度信息更好。这说明运动的方向性本身携带着大量判别信息,网络学出来的第一层滤波器很多都呈现出明显的方向性模式,说明网络自己发现了方向是理解动作的关键线索,这不是人为设计出来的,是网络在训练过程中自己领悟出来的。
数据不够怎么办:从图片世界借点家底
深度网络出了名地吃数据,而视频动作识别领域当时最大的公开数据集样本量远不如图像识别领域那么充裕。这就带来一个现实问题,网络这么大,数据这么少,很容易过拟合,也就是网络把训练集背下来了,换一批没见过的视频就懵了。
论文里给出的解法是多任务学习*
多任务学习(Multi-task Learning):让同一个网络同时在多个相关数据集或多个任务目标上训练,通过共享底层特征表示来缓解单一数据集样本不足的问题
具体做法是让空间流网络同时在两个不同的动作识别数据集上训练,网络的主体结构共享,只在最后输出层为每个数据集单独设一个分类头。这样网络能从两份数据里一起汲取养分,等于是把两个不算大的数据集拼成一个更丰富的训练素材库,同时因为两个任务都是识别人类动作,底层学到的特征也能相互印证,比单独在一个小数据集上死磕效果更稳。
这有点像一个学生同时准备两门相近的考试,比如物理和数学建模,很多底层的推导能力和逻辑思维是相通的,同时复习两门反而能相互巩固基础知识,比单独埋头刷一门的题库更扎实。如果不采用这种共享训练,单独在小数据集上从零训练一个深层网络,很容易出现网络记住了训练集里的特定画面和场景布局,一旦换一批背景或换一批穿着不同的人做同样动作,识别就崩掉的情况。
除了多任务学习,论文还用了图像识别领域的常规操作来对抗过拟合,比如对训练样本做随机裁剪、水平翻转、色彩抖动这类数据增强*
数据增强(Data Augmentation):通过对训练数据做旋转、裁剪、翻转等变换人工扩充数据量,让模型见到更多样的输入变化,从而提升泛化能力
这些手段单独拿出来都不新鲜,图像分类领域早就用得很熟练了,但把它们系统性地组合起来用在视频这个新场景,配合双流架构和多任务训练,是这篇论文工程落地上的扎实功夫。
数据说话:双流网络到底赢了多少
下面这张表格列出了论文里几个关键的对比结果,数据来自当时权威的动作识别测试集。
| 方法 | 准确率 |
| 单独空间流网络 | 72.6% |
| 单独时间流网络 | 83.7% |
| **双流网络融合** | **88.0%** |
| 同期最强手工特征方法 | 87.9% |
这张表格信息量很大,值得拆开看。
如果只用空间流,也就是只让网络看单帧画面识别动作,准确率是 72.6%,这个数字甚至不如手工特征方法差太多以外的量级,说明单帧图像里的静态线索确实有用但很有限。
如果只用时间流,准确率跳到 83.7%,比单独空间流高出足足十一个百分点。这说明运动信息对判断动作类别的贡献远远大于单纯的画面内容,这也印证了前面说的,动作识别的核心线索本来就藏在"怎么动"而不是"长什么样"里。
把两条流的判断结果融合起来,准确率冲到 88.0%,比时间流单打独斗还要再提高四个多百分点。这说明外观信息和运动信息不是互相替代的关系,而是互补的关系,两者结合能看到的信息量比任何一路单独看都更完整。
最关键的一行是最后一行的对比。当时业界最强的手工特征方法能做到 87.9%,而这个基于深度学习的双流网络做到了 88.0%。
这一个百分点的差距看起来微不足道,但它的历史分量完全不在于这个数字本身,而在于这是深度学习第一次在视频动作识别这个战场上,追平并超过手工特征方法。
这个意义不亚于两年前 AlexNet 在图像分类上的横空出世。之前深度学习在视频领域被死死压制了两年,各种直接堆叠帧或者用三维卷积硬啃时空信息的尝试,效果都在 65% 到 70% 上下打转,这篇论文用一个看起来不算特别复杂的架构调整,把画面和运动拆开处理,一举把这个差距填平甚至反超。
这背后的方法论意义其实更值得琢磨。很多时候深度学习被认为的优势在于end-to-end,让网络自己从原始数据里学会一切,不需要人为设计特征。但这篇论文恰恰是反过来,先用传统的信号处理手段,光流算法,把运动信息显式提炼出来,再喂给深度网络去学习分类。这是一种深度学习和传统计算机视觉手段的合作,而不是深度学习单方面取代传统方法。这个思路在当时给了很多研究者启发,端到端不是唯一正确的路,把领域知识用传统手段先做一步预处理,往往能大幅降低深度网络的学习难度。
双流网络之后:这条路怎么继续走下去
这篇论文发表之后,双流架构成了视频动作识别领域接下来好几年的标准范式,后续大量工作都是在这个骨架上做改进。
2016 年,Feichtenhofer 等人发表的论文提出了时空融合卷积网络,把这篇论文里两条流"各自跑完再简单加权平均"的融合方式,改成了在网络中间层就进行融合,让空间流和时间流的特征能更早地互相交流,而不是等到最后一刻才碰头。这个改进让融合后的准确率进一步提升,也证明了这篇论文里"分开处理再融合"的思路是对的,只是融合的时机和方式还有很大优化空间。
2017 年,Carreira 和 Zisserman 发表了 I3D 网络的论文,这里的 Zisserman 正是这篇双流网络论文的两位作者之一,说明他本人也在持续沿着这条路深挖。I3D 把原本二维的卷积核直接膨胀成三维卷积核,让网络能够原生处理时间维度上的信息,同时依然保留了双流的整体思路,一路处理原始帧,一路处理光流,只是每一路内部都换成了三维卷积结构。这篇论文还引入了一个大规模的动作识别数据集 Kinetics,用海量数据配合三维卷积和双流思路,把准确率又往上推了一大截,成为后续很长时间里视频理解领域的标杆方法。
这两篇后续工作有个共同点,它们都没有推翻双流网络"外观和运动分开处理"这个核心判断,而是在这个判断成立的基础上,去优化融合时机、去升级底层网络结构、去扩充数据规模。这从侧面说明这篇论文最初做的那个架构决策,抓住的是问题的本质,而不是一个碰巧凑效的技巧。
顺带一提,Simonyan 和 Zisserman 这两位作者,在发表这篇双流网络论文的同一年,几个月之后又发表了另一篇论文,提出了后来大名鼎鼎的 VGGNet*
VGGNet:2014 年由牛津大学视觉几何组提出的深层卷积神经网络架构,以结构简洁、大量堆叠小尺寸卷积核著称,是图像识别领域影响深远的经典网络之一
这两篇论文出自同一个研究小组,同一年发表,一篇解决视频动作识别,一篇刷新图像分类的网络设计范式。这个时间线上的巧合本身就很说明问题,这个团队当时正处在对卷积网络结构理解最深入的阶段,同一批人在同一年里连下两城,分别在两个不同的视觉任务上留下了影响多年的经典设计。
写在后面
读这篇论文最触动我的一点,是它没有走"让网络自己学会一切"的浪漫路线,而是老老实实承认,某些信息用传统算法提前算出来,比让网络自己摸索更靠谱。光流算法本身在这篇论文之前已经存在了几十年,这篇论文的聪明之处是把这个老工具和新的深度网络接在一起,谁也没有取代谁。
还有一个细节值得单独说说,时间流单独跑就能到 83.7%,比空间流高出十一个百分点,这个结果某种程度上颠覆了我原本的直觉。我以前一直觉得"看清楚画面里有什么"应该是识别动作的基础,运动信息只是补充。但数据摆在那里,运动本身携带的判别力比静态外观强得多,这也许说明人类识别动作的方式和这个网络学到的方式,本质上更接近于"先看动作轨迹再看细节",而不是我们直觉里的"先看清楚场景再判断动作"。
这篇论文没有解决的问题是,光流计算本身需要额外的预处理开销,而且光流质量直接决定了时间流的上限,如果光流算法本身在复杂场景下计算不准,整条时间流就跟着遭殃。后来三维卷积路线的兴起,某种程度上也是想绕开这个对光流质量的依赖。这条分岔路后来走出了两个不同的方向,一条继续依赖显式计算的运动线索,一条尝试让网络直接从原始帧里端到端学会运动模式,这场争论到今天其实都没有一个绝对的胜负结论。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是 2014 年由牛津大学 Simonyan 和 Zisserman 提出的视频动作识别架构,用两个独立的卷积神经网络分别处理视频的静态画面和运动光流信息,最后融合两者的判断结果,准确率达到 88.0%,第一次超越了当时最强的手工特征方法。
Q2:光流场在双流网络里起什么作用?
A:光流场把视频里每个像素点的运动方向和速度显式计算出来,变成一张张运动地图,喂给专门处理运动的时间流网络。它把隐藏在像素变化里的运动信息翻译成网络能直接学习的形式,单独用这条流识别动作,准确率就能达到 83.7%。
Q3:双流网络之后有哪些重要的后续研究?
A:2016 年 Feichtenhofer 等人提出时空融合卷积网络,让两条流在中间层就开始融合而不是等到最后。2017 年 Carreira 和 Zisserman 发表 I3D 网络,把二维卷积膨胀成三维卷积,同时配合大规模 Kinetics 数据集,进一步推高了动作识别的准确率。
热门跟贴