
你随手刷到一段视频,一个人助跑,起跳,跃过横杆,落地。你几乎不用思考,脱口而出两个字:跳高。这件事对人脑来说简单得近乎本能,但对机器来说,曾经是一道怎么都迈不过去的坎。
2012年,AlexNet在ImageNet图像分类比赛上一战封神,错误率从26%砍到16%,深度学习从那一刻起成了计算机视觉的新宠。但很少有人提起的是,这股风潮吹进视频动作识别领域之后,接下来整整两年,深度学习都没能打赢一个听起来很土的老方法,改进密集轨迹。
改进密集轨迹(iDT):一种手工设计的视频特征提取方法,通过追踪像素点在连续帧之间的运动轨迹,再统计轨迹周围的纹理和运动信息来判断动作类别,2013年由王恒等人提出,是深度学习真正站稳脚跟之前,动作识别领域最强的方法。
在UCF-101这个包含101类人类动作、超过1.3万段视频的测试集上,iDT能做到86%左右的准确率。2014年,卡内基梅隆的Karpathy团队试过一个更直接的办法,把视频一帧一帧丢进卷积网络,用他们称为“慢融合”的方式训练,结果只做到60%出头,比iDT低了二十多个百分点。
二十多个百分点的差距意味着什么。意味着同样识别五个动作,深度学习方法要比手工特征多认错一个还不止。这在图像分类领域已经被深度学习按在地上摩擦过的大背景下,显得格外刺眼。同样是卷积网络,换到视频上怎么就不灵了。
问题的根源其实不难猜。动作的本质不只是画面里有什么,更是画面怎么变化。单帧卷积网络再强,看懂的是“这是什么场景、有什么物体”,看不懂的是“接下来发生了什么”。
牛津大学VGG组的Karen Simonyan和Andrew Zisserman在2014年给出了一个答案。
VGG组:牛津大学visual geometry group的简称,这个研究组几个月后发表的VGGNet后来成为图像分类领域最常用的骨干网络之一,这篇论文和VGGNet几乎是同期的工作,出自同一群人手里。
他们的思路是,两条路同时走,一条专门看画面内容,一条专门看运动本身,最后把两条路的判断结果合起来。这就是后来被广泛引用的双流网络。
双流网络:由两个独立训练的卷积神经网络组成,一个输入静止的视频帧,捕捉画面内容,另一个输入光流图,捕捉运动信息,最后把两边的预测结果融合起来,得到最终判断。
空间流,先看懂这是在哪儿、有什么
空间流本质上是一个普通的卷积网络,吃进去的是单帧RGB图像,网络结构借用了成熟的图像分类架构,先在ImageNet上预训练,再拿到UCF101上微调。
ImageNet:一个包含超过百万张标注图片、涵盖上千类物体的大规模图像数据库,深度学习领域几乎所有图像模型的预训练起点都来自这里。
这个设计背后的逻辑其实挺朴素。很多动作靠环境线索就能猜中大半,游泳池旁边大概率在游泳,琴房里大概率在拉小提琴,网球场上大概率在打网球。空间流干的事,就是把这种“场景提示动作”的直觉教给网络。
但这条路有一个绕不开的天花板。单看一张照片,很难分清一个人是正要跳起还是刚落地,是正要坐下还是刚站起来,这些动作的静态画面可能几乎一模一样。
这就像让你只看一张照片判断一场体育比赛的具体瞬间。照片里有泳池、有泳姿、有运动员,你能猜到这是游泳项目,但你分不清这个人是刚跳入水中,正在换气,还是即将触壁转身。
如果只靠这一张照片做判断,你的答案永远停留在“这是什么场景”的层面,没法回答“具体发生了什么动作”。空间流网络的局限正是这样,它看得懂背景,看不懂过程。
空间流解决的根本矛盾是,如果完全不利用场景和物体的先验信息,网络要从零开始摸索运动模式,效率会很低。但如果只依赖场景信息,又会在需要分辨具体动作细节的任务上失手,比如区分走路和慢跑。实验数据印证了这个局限,空间流单独在UCF101上只做到72.6%,比iDT的86%低了十几个点,证明光靠画面内容是远远不够的。
时间流,教网络看懂运动本身
时间流输入的不是普通图像,而是光流图。
光流:描述视频里每个像素点在相邻两帧之间移动方向和速度的信息,通常用两张图表示,一张记录水平方向的位移,一张记录垂直方向的位移,是计算机视觉里捕捉运动最经典的手段之一。
为了让网络看到的运动信息更完整,论文没有只用相邻两帧的光流,而是把连续10帧的光流图堆叠在一起,变成一个20通道(10帧乘以2个方向)的输入。这样网络看到的是一小段时间窗口里完整的运动轨迹,而不是某一瞬间的位移快照。
这个设计背后有个现实约束,当年的硬件条件下,想用三维卷积直接在原始视频立方体上学习时空特征,计算量大到难以训练。用预先计算好的光流图投喂给普通二维卷积网络,是一个用计算成本换可行性的折中方案。
另一个现实约束是训练数据不够。UCF101只有1.3万多段视频,相比ImageNet的百万级图片,这个规模训练一个深度网络很容易过拟合。
过拟合:模型在训练数据上表现很好,但因为记住了太多训练集特有的细节,换到没见过的新数据上表现明显变差的现象。
论文的解决办法是多任务学习,把UCF101和HMDB51两个数据集放在一起训练,底层网络共享参数,只在最后输出层分别保留两套分类器,各自对应两个数据集的动作类别。
HMDB51:另一个常用的动作识别数据集,包含51类动作、约7000段视频,数据规模比UCF101还小,常被研究者和UCF101搭配使用来检验方法的泛化能力。
这有点像语言学习。如果你只背了一本一百句对话的教材,很容易把这一百句背得滚瓜烂熟,但换个场合碰到没背过的句子就露馅了。如果换成同时学两套教材,共享底层的语法规则,再分别记各自的词汇和场景,学到的语法基础会更扎实,遇到新场景出错的概率也会降低。
如果不这样做,仅靠一个数据集的几千段视频,网络很容易记住训练样本的细枝末节,而不是真正学会识别运动模式本身。时间流要解决的根本矛盾,是运动信息到底该怎么表示给网络,光流图提供了一个计算成本可控、又已经被几十年计算机视觉研究验证有效的答案。
测试阶段还有一个细节值得一提。论文从每段视频里均匀采样25帧,每帧再做四角加中心共5种裁剪并配合水平翻转,相当于每段视频生成250个预测结果,最后取平均。这种做法在当年并不罕见,但也说明研究者为了把网络的判断稳定下来,愿意在推理阶段多花这份计算力。
单独的时间流在UCF101上做到81.0%,比空间流的72.6%高出不少,说明运动信息对识别动作比画面内容更关键,但距离iDT的86%依然有差距。
双流融合,1加1为什么大于2
两条网络分别训练完成后,把各自输出的分类分数做融合。最简单的办法是直接取两边softmax概率的加权平均,更进一步的办法是把两边的分类分数当作新特征,训练一个支持向量机做最终决策。
支持向量机:一种经典的机器学习分类算法,通过寻找一个最优的分界线把不同类别的样本尽可能分开,在深度学习流行之前是图像分类领域的主力方法之一。
两条流为什么合起来会更强,道理不复杂。画面内容告诉你大概的场景范围,运动轨迹告诉你具体在做什么动作,两者互补,能大幅缩小判断的模糊区间。
这很像你同时通过一个人的脸和声音辨认身份。只看脸,你可能认错一对双胞胎。只听声音,你可能被一段失真的电话录音骗过去。但当你同时看到脸、听到声音,这两条信息各自的弱点正好被对方补上,认错的概率会大幅下降。
双流网络的融合就是这个道理。只用空间流,UCF101上的准确率是72.6%。只用时间流,是81.0%。两者融合之后,跳到了88.0%,比表现最好的单一分支还高出七个百分点。这不是简单的数字平均,是两种信息互相纠正了彼此的误判。
融合这一步要解决的根本矛盾是,单一信息源永远有盲区。空间流在依赖运动细节的动作上(比如区分走路和跑步)天生吃亏,时间流在依赖具体物体识别的动作上(比如区分弹吉他和弹贝斯)同样天生吃亏,只有把两者结合,才能同时补上这两类盲区。
| 方法 | UCF101 | HMDB51 |
| 改进密集轨迹(iDT) | 85.9% | 57.2% |
| 空间流单独 | 72.6% | 40.5% |
| 时间流单独 | 81.0% | 54.6% |
| 双流融合 | **88.0%** | **59.4%** |
这是深度学习第一次在视频动作识别任务上超过打磨多年的手工特征方法。在2014年,这个结果的分量不亚于两年前AlexNet在图像分类上的那次胜利,区别只是,这次深度学习晚了整整两年才补上这一课。
论文里还有一处细节容易被忽略,但很说明问题。研究者把时间流网络第一层学到的卷积核拿出来可视化,发现这些卷积核大多呈现明显的方向性条纹,和经典图像处理里用来检测边缘方向的滤波器长得很像。这不是人为设计出来的,是网络自己从光流数据里学出来的,说明网络确实抓住了运动信息里最关键的部分,就是方向和速度的变化模式,而不是什么偏门的统计噪音。
这篇论文的影响没有停在2014年。
一年后,2015年,Tran等人提出了C3D,直接用三维卷积核在原始视频帧上学习时空特征,不再需要事先计算光流这一步,把运动信息的提取也交给网络自己完成。
C3D:一种用三维卷积神经网络直接处理视频片段的方法,卷积核本身带有时间维度,可以同时学习空间和时间上的特征,省去了单独计算光流的步骤。
两年后,2016年,王利民等人提出了Temporal Segment Networks,针对双流网络只能看一小段连续帧窗口、照顾不到长视频整体结构的问题,改成把整段视频切成若干段,每段单独抽样再联合建模,让网络能顾及更长时间范围内的动作模式,在UCF101上把准确率进一步推高到94%以上。
三年后,2017年,Carreira和Zisserman,没错,还是那个Zisserman,提出了I3D,把双流网络里的二维卷积核直接膨胀成三维卷积核,同时继续保留RGB分支和光流分支的双流结构,再配合DeepMind新发布的大规模视频数据集Kinetics做预训练,把动作识别的准确率又推上了一个台阶。
Kinetics:由DeepMind发布的大规模视频动作识别数据集,包含数十万段标注视频,规模远超UCF101和HMDB51,被用作后续很多视频模型的预训练数据集。
双流网络的核心思路,内容信息加运动信息两条腿走路,到这里依然没有被放弃,只是实现方式从二维卷积加光流堆叠,升级成了三维卷积加光流堆叠。
写在后面
重读这篇论文时,一个容易被忽略的细节让我多想了一会儿。两条网络的训练完全独立,空间流不知道时间流学到了什么,时间流也不知道空间流学到了什么,直到最后一步才把两边的分数拼在一起。这种做法简单粗暴,却恰好避开了联合训练两种差异巨大的输入(自然图像和光流图)可能带来的优化困难。
一个值得追问的问题是,如果当时就尝试端到端联合训练两条分支,会不会学到更好的融合方式,还是反而因为优化难度暴增而效果更差。论文没有给出答案,但三年后的I3D依然选择保留两条独立分支,而不是强行揉在一起,某种程度上说明分开训练在当时及后续很长一段时间里,仍然是更实际的选择。
另一个让我印象深刻的点是,整套方法建立在光流这个已经存在了几十年的经典计算机视觉概念之上。深度学习在这里扮演的角色不是发明新概念,而是把一个老工具塞进一个新框架里重新发挥作用。这提示一个更大的思考,很多时候突破不是凭空造出新东西,而是把旧工具放进新结构里,让旧工具重新变得有效。
下次刷到一段视频,不妨试着闭上眼睛只听声音,再试着静音只看画面,看看自己能分辨出多少动作。你会发现,机器曾经纠结了两年才想明白的事情,你的大脑同时处理两条信息流,早就毫不费力地在做了。
Q&A
Q1:双流网络是什么?
A:双流网络是2014年由牛津大学Simonyan和Zisserman提出的视频动作识别方法,由两个独立的卷积神经网络组成,一个处理单帧画面捕捉场景内容,一个处理光流图捕捉运动信息,最后融合两边的判断结果,在UCF101上准确率达到88.0%,首次超过了手工特征方法iDT的85.9%。
Q2:为什么深度学习一开始在视频动作识别上打不过手工特征?
A:因为早期直接把视频帧丢进卷积网络只能学到画面内容,学不到运动过程,2014年Karpathy团队的尝试在UCF101上只做到60%出头,比手工方法iDT的86%低了二十多个点,而双流网络通过额外引入光流分支解决了这个问题。
Q3:双流网络后来被哪些方法改进了?
A:2015年的C3D用三维卷积直接学习时空特征省去光流计算,2016年的Temporal Segment Networks改进了长视频的时序建模把准确率推到94%以上,2017年的I3D把双流结构的二维卷积膨胀为三维卷积并用Kinetics数据集预训练,进一步提升了性能。







