两条视频流打败了整个深度学习界 Chinese original

2014年,深度学习已经在图像识别上打得手工特征毫无还手之力了。AlexNet两年前横空出世,把ImageNet图像分类的错误率从26%直接砍到15%,整个计算机视觉圈子都在往深度学习转向。

但有一个领域死活攻不下来。

视频动作识别。

当时最强的方法叫密集轨迹

*Dense Trajectories,一种手工设计的特征提取方法,通过追踪视频中密集分布的点的运动轨迹,再结合方向梯度直方图等手工特征来描述动作*

它的改进版在UCF-101数据集上能做到87.9%的准确率。而深度学习方面,最好的尝试也就65%左右,差了整整20多个百分点。

20个百分点的差距意味着什么。意味着每5个动作里,深度学习就要比手工方法多认错1个。这不是接近,这是被按在地上。

这件事挺让人困惑的。图像识别里神经网络已经证明了自己,为什么换成视频就完全不灵了?

问题出在“动作”这个东西的本质上。一张图片你可以看颜色、看形状、看纹理来判断这是猫是狗。但一个动作,比如“开门”还是“关门”,单看一帧画面根本分不出来。你需要知道东西是怎么动的,方向、速度、轨迹。这些信息藏在时间维度里,不在空间维度里。

当时的神经网络处理视频,基本思路是把每一帧当成一张图片扔进卷积网络,或者简单粗暴地把多帧堆叠起来一起处理。这就好比你想知道一个人是在挥手还是在挠头,结果给你的却是十张互相独立的照片,让你自己去猜中间发生了什么。网络能学到的东西非常有限,因为动作的连续性、方向性这些关键信息,在这种处理方式里根本没有被保留下来。

牛津大学的Karen Simonyan和Andrew Zisserman这时候提出了一个思路。既然网络学不好“动”这件事,那就别让网络自己去猜运动信息了,直接把运动信息喂给它。

把动作“翻译”成图片再喂给网络

他们的做法是引入光流

*Optical Flow,描述视频中每一个像素点在相邻两帧之间移动方向和速度的一种表示方法,本质上是一张记录了运动矢量的图*

光流不是原始的视频画面,而是专门计算出来的,每个像素点记录着“这个点接下来往哪个方向移动、移动了多快”。把连续几帧的光流叠在一起,就变成了一张记录着运动轨迹的“地图”。

这里就是这篇论文最核心的设计,双流网络

*Two-Stream Network,同时用两个独立的卷积神经网络分别处理原始视频帧(空间流)和光流图(时间流),最后把两条网络的判断结果融合起来做最终决策*

一条网络叫空间流,输入是普通的视频帧,负责识别画面里有什么东西,场景、人物、物体外观。另一条网络叫时间流,输入是光流图,专门负责捕捉动作本身的运动模式。两条网络各自训练,各自输出一个判断,最后把两个判断结果加权融合,得出最终的分类结果。

为什么要分成两条网络,而不是把光流和原始画面堆在一起丢给同一个网络处理?

这就好比让一个人同时用眼睛看形状颜色,又用手去感知震动频率,如果强迫这两种完全不同性质的信息在最初阶段就混在一起处理,大脑反而会处理得更糟糕。视觉皮层和触觉皮层本来就是分开工作的,分别处理完了信息,最后在更高层次上整合判断,效果远好于一开始就把两种信号搅在一起。人的神经系统演化出分区处理再整合的机制,不是没有道理的。如果强行把两种信息一开始就混在一起,网络很难同时学会“这是什么东西”和“这个东西在怎么动”这两件性质完全不同的任务,信息互相干扰,谁都学不好。

实验结果证实了这个直觉。如果只用空间流,单独看画面内容,准确率是72.6%。如果只用时间流,单独看光流,准确率是81.2%。这本身已经很有意思了,说明运动信息比画面内容更能反映动作类别,光看动没看人,反而比只看人不看动更准。而当两条流融合起来一起判断,准确率跳到了88%,超过了当时最强的手工特征方法。

这是深度学习第一次在视频动作识别任务上打赢手工特征方法。放在2014年这个时间点,这句话的分量不亚于AlexNet当年横空出世给整个图像识别领域带来的震动。

数据不够怎么办,拿图像数据集来凑

深度学习一直有个软肋,需要海量数据才能训练出好效果。当时的视频动作识别数据集,规模比ImageNet小得多,UCF-101一共也就13000多个视频片段,而ImageNet有上百万张标注图片。数据不够,网络很容易过拟合,学到的是数据集里的噪声而不是真正的规律。

论文里的解决办法是用预训练。空间流网络可以先在ImageNet这样规模庞大的图像数据集上训练,学会识别物体、场景这些通用视觉特征,再迁移到动作识别任务上做微调。这就像一个人先在图书馆里读遍了各种基础知识,再去专攻一个具体课题,总比从零开始要快得多、稳得多。如果不做预训练直接从头训练,网络在小数据集上很容易记住那几千个训练样本的细枝末节,遇到没见过的新视频就懵了,泛化能力差,这一点在论文的对比实验里也能看到明显的准确率下降。

时间流因为输入是光流图,和自然图像的统计特性差别较大,预训练用得没有空间流那么直接,但论文里通过多种数据增强手段,比如从视频里截取不同的片段、做角点裁剪等方式,人为增加训练样本的多样性,一定程度上缓解了数据不足的问题。

光流网络自己学到了什么

论文里还有一个挺有意思的观察。研究者去看了时间流网络第一层卷积核学到的样子,发现这些卷积核大多呈现出明显的方向性,像是专门在检测某个方向上的运动模式。

这不是研究者事先设计出来的,是网络自己从数据里学出来的。这说明网络确实抓住了光流图里最关键的信息,方向。一个动作能不能被正确分类,很大程度上取决于身体各部分往哪个方向移动,网络自己发现了这一点,并且用卷积核的形式把这种敏感性刻在了参数里。这也从另一个角度印证了双流网络这个设计思路是对的,给网络喂对了信息,它自己会去学该学的东西。

后来的人怎么把这个思路往前推

这篇论文发表之后,双流网络这个框架成了视频动作识别领域好几年的标准范式,后续大量工作都是在这个骨架上做改进。

2016年,Feichtenhofer等人发表的论文提出了改进的双流融合方式,不再是简单地在最后一层把两条流的结果加权平均,而是在网络中间层就让空间流和时间流的信息发生交互,进一步提升了准确率。

2017年,Carreira和Zisserman(没错,还是Zisserman)提出了I3D网络,把双流网络里的二维卷积扩展成三维卷积,直接在时间维度上做卷积操作,同时还构建了规模更大的Kinetics数据集用于预训练,这个思路后来成为视频理解领域另一条重要的技术路线。

这两项后续工作,一个是在双流网络内部做得更精细,一个是干脆换了一种网络结构来处理时序信息,但都绕不开这篇论文最早提出的核心洞察,动作识别需要把外观信息和运动信息分开建模。

写在后面

读到这篇论文的时候,最触动我的其实不是双流网络这个架构设计,而是那个准确率对比,72.6%对81.2%,单独的运动信息比单独的画面信息更能判断动作类别。这多少推翻了一个直觉,我们平时理解一个动作,好像总是先看清楚“是什么东西在动”,再去判断“它在做什么”。但数据说的是另一件事,先搞清楚“怎么动”,可能比先搞清楚“是什么”更重要。

这让我想到一个不太相关但挺有意思的联想。判断一个人说话是不是在撒谎,心理学研究里常提到,微表情和肢体动作的可信度,有时候比语言内容本身还高。内容可以编,但下意识的动作模式很难完全伪装。双流网络里时间流的优势,某种程度上也是同一个道理,外观可以有各种迷惑性,伪装、遮挡、背景干扰,但运动的模式更难藏。

这篇论文没解决的问题也很明显,光流的计算本身开销不小,而且是提前离线算好的,不是端到端学出来的,这多少违背了深度学习“让网络自己学一切”的初衷。后来的三维卷积路线某种意义上就是想把这一步也交给网络自己去学。这两条路线谁更好,到今天可能都没有一个绝对的答案。

Q&A

Q1:双流网络是什么?

A:双流网络是Simonyan和Zisserman在2014年提出的视频动作识别方法,同时用两个卷积神经网络分别处理原始视频帧和光流图,再把两条网络的判断结果融合起来做最终分类。

Q2:双流网络为什么要把空间信息和运动信息分开处理?

A:因为画面内容和运动模式是性质完全不同的两种信息,如果一开始就混在一起给网络处理,网络很难同时学好这两件事。分开训练再融合,实验证明准确率能达到88%,远高于单独用任何一条流。

Q3:双流网络之后有哪些重要的改进工作?

A:2016年Feichtenhofer等人提出了在网络中间层就让两条流交互融合的方法,2017年Carreira和Zisserman提出I3D网络,把二维卷积换成三维卷积直接处理时序信息,并配合更大规模的Kinetics数据集训练。

作者声明:作品含AI生成内容
举报/反馈
Share to: Weibo Qzone
Interested in cooperating on this story?
We will get back to you within 1 business day
Leave a Message