ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

用两条眼睛看视频:当深度学习第一次打赢了手工特征

用两条眼睛看视频:当深度学习第一次打赢了手工特征 2014 年,一件让计算机视觉圈子挺不是滋味的事情正在发生。深度学习已经在图片识别上把传统方法按在地上摩擦两年了。AlexNet 在 2012 年一出场,直接把 ImageNet 图像分类的错误率从 26% 砍到 15%,整个领域都在惊呼卷积神经网络的时代到了。但是一转到视频,风向完全变了。**在视频动作识别这个任务上,深度学习整整打不过一种叫密集轨迹的手工特征方法,而且不是小差距,是被按在地上摩擦。** 动作识别*让计算机看一段视频,判断视频里的人在做什么动作,比如跑步、打网球、骑自行车。 密集轨迹Dense Trajectories*一种手工设计的视频特征提取方法,通过跟踪视频中密集分布的像素点的运动轨迹,提取运动信息来判断动作类别,在深度学习火起来之前是这个领域的霸主。具体差多少?当时最好的深度学习方法在 UCF-101 这个动作识别数据集上只能做到 65% 到 70% 左右,而密集轨迹这类手工特征方法能轻松达到 85% 以上,有些改进版本甚至摸到 87%。这是二十个百分点的差距。二十个百分点意味着什么?意味着每识别 5 段视频,深度学习就要比手工方法多认错 1 个,而手工方法在这方面几乎是稳定发挥。这事儿挺打脸的。CNN 都能在静态图片里认出猫和狗了,怎么加上时间维度反而不会看视频了?牛津大学的两位研究者 Karen Simonyan 和 Andrew Zisserman 就是在这个背景下,写出了这篇后来被称为双流网络的论文。有意思的是,这两位是同一个实验室的战友,几个月后他们又联手发布了 VGGNet,那个后来成为无数视觉任务标配骨干网络的经典模型。这两篇论文差不多是同期的工作,一篇解决了视频,一篇定义了图片网络的标准结构。这不是巧合,是同一批人在同一段时间里死磕视觉理解这件事的产物。问题出在哪:为什么CNN看不懂视频里的运动先搞清楚一件事,CNN 在图片上表现好,靠的是什么?靠的是它能从像素堆里自动学出边缘、纹理、形状这些视觉模式,一层一层往上堆,最后拼出这是一只猫的判断。这套本事对付静态图片非常在行。但视频不是一张图片,视频是一连串图片,它多了一个维度,时间。一个动作,比如挥手,单独看某一帧,你可能根本看不出来,手就是举在那里而已。你必须看这个手在接下来几帧里怎么运动,才能判断这是挥手还是别的动作。这就是问题的核心:**静态的外观信息能看出场景是什么、有什么物体但看不出物体在动什么。**早期把 CNN 搬到视频上的尝试,大多是简单粗暴地把视频当成一堆图片,或者把时间维度也塞进卷积核里,让网络自己去学3D 的图片是什么样。这就好比让一个只学过临摹静态照片的画家,突然让他去理解一段舞蹈的节奏和韵律,他能看出舞者穿的什么衣服、站在什么背景前,但很难抓住那种动的感觉,因为他从来没被专门训练去看动这件事。如果不专门处理运动信息会怎样?实验已经给出答案了,直接把视频当 3D 图片喂给 CNN,效果远远不如手工设计的运动轨迹特征。因为手工方法是研究者根据对运动的深刻理解精心设计出来的,专门盯着动这件事;而粗暴堆叠帧数的 CNN,没有被明确告知你要重点关注运动,它自己很难从海量像素里领悟出这个重点。核心思路:把看什么和看怎么动分成两条线Simonyan 和 Zisserman 的解法说起来挺直白,但在当时是个漂亮的破局点。既然一个网络很难同时兼顾这是什么和它怎么动两件事,那就别让一个网络干两份活,拆成两个网络,一个专门看外观,一个专门看运动,最后把两边的判断结果加权融合。这就是双流网络Two-Stream Network的由来。 双流网络*由两个独立的卷积神经网络组成的架构,一条叫空间流,负责识别画面里的物体和场景;另一条叫时间流,负责识别画面里的运动模式,两条网络的输出最后融合成最终判断。空间流很好理解,它的输入就是视频里的某一帧图像,和普通的图片分类网络没什么区别,负责回答画面里有什么比如球场、球拍、草地这些线索,能帮你猜出这大概是网球相关的动作。时间流才是这篇论文真正的巧思所在。它的输入不是图像,而是光流场optical flow。 光流场*描述视频中相邻两帧之间每个像素点的运动方向和速度的一种表示方法,可以理解成给每个像素画一个箭头,指示它接下来往哪个方向移动了多少。光流场本质上是把运动这件事从像素颜色里剥离出来,变成一张纯粹描述位移的图。作者把连续多帧的光流叠在一起,作为时间流网络的输入,让这个网络专门去学习运动的模式长什么样,完全不用操心画面里到底是个人还是个球。这个设计思路的关键在于,光流已经是前人研究运动信息时反复验证过的有效表示。而不是让网络自己去从原始像素里瞎摸索运动规律,直接给它喂现成的、被证明有效的运动信号,相当于省去了网络自己重新发明轮子的过程。这里有个很实在的类比。假设你要培训两个新员工,一个负责鉴定商品的种类,一个负责判断商品在传送带上的移动速度是否正常。如果你把这两份工作交给同一个人,让他同时盯着商品的外观和移动轨迹,他很可能顾此失彼,看图案的时候忘了计时,看速度的时候看错了商品。但如果你直接给这两个人分工,一个只看图片资料,另一个只看一份专门画好的运动轨迹记录表,他们各自的判断都会更准,最后你把两人的结论汇总一下做决策。如果不分工,硬让一个人同时处理两类信息,大概率两边都做不精,这正是早期视频 CNN 遇到的困境。网络结构长什么样?下面这张图对应论文 Figure 1画得很清楚,空间流输入单帧 RGB 图像,时间流输入堆叠的光流帧,两路各自经过卷积网络提取特征,最后再融合分类结果。图1双流卷积网络架构示意图。上方是空间流接收单张RGB图像作为输入下方是时间流接收连续多帧堆叠的光流场作为输入。两条网络结构相似但参数独立训练最终softmax输出做融合。这个架构的好处还不止于分工明确。因为两条网络的输入形式差别很大,一条是自然图像,一条是运动场,它们可以用不同规模的数据分别训练,互不干扰,甚至可以用已经在图片分类任务上训练好的网络去初始化空间流,这在当年数据量普遍不够大的背景下,是个相当实用的技巧。数据不够怎么办:借用图片分类的老底子深度学习一个绕不开的软肋是,它特别吃数据。而当时的视频动作识别数据集,规模远远比不上 ImageNet 那种上百万张图片的量级,像 UCF-101 这种数据集,视频数量以千计,对于从零训练一个深层网络来说远远不够。作者想了个办法,空间流网络的结构和参数可以直接借用已经在 ImageNet 上训练好的图片分类网络,因为空间流的任务本质上就是从图片里识别物体和场景,这和图片分类是同一类问题,拿现成的、已经学得很好的模型来做起点,再用视频数据微调,效果比从零开始训练要好得多。 预训练Pre-training*先在一个数据量充足的任务上训练模型,让它学到通用的特征表达能力,再把这个训练好的模型搬到数据量较少的目标任务上继续训练,这样可以大幅缓解目标任务数据不足的问题。这个道理其实挺朴素。你要教一个已经会开手动挡轿车的人去开货车,他不需要从踩油门刹车这种基础动作重新学起,他已经具备了驾驶的基本感觉,你只需要教他货车特有的操作差异就行了,学习效率会比培养一个完全没开过车的新手快得多。如果非要坚持从零训练,不仅耗时间,在数据量不够的情况下,网络很容易学出一堆没有泛化能力的错误模式,这在当时的视频数据规模下几乎是必然会踩的坑。时间流则没法直接借用图片分类网络的参数,因为光流图和自然图像的统计特性差别很大,作者只能在有限的视频数据上从头训练这条网络,不过通过多数据集联合训练、数据增强等手段,依然把效果做出来了。融合方式:两条流怎么商量出最终答案两条网络各自给出一个分类概率分布之后,怎么合并成一个最终判断?论文里试了几种融合方式,包括简单地把两边的 softmax 输出取平均,以及训练一个额外的分类器比如 SVM来学习怎么给两条流的输出分配权重。实验发现,直接平均已经效果不错,用 SVM 做加权融合能再往上提一点。这里作者其实是在回答一个问题:两条流谁更靠谱,该不该给它们同样的信任度实验结果显示,单独用空间流,在 UCF-101 上大概能拿到 73% 左右的准确率;单独用时间流,大概能拿到 83% 左右;而把两条流融合起来,能冲到 88% 左右。这组数字挺有意思的地方在于,时间流单独拿出来看,比空间流还要强不少,这说明运动信息对判断动作类别的重要性,其实高于静态的外观信息。这在直觉上也说得通,毕竟动作识别这个任务本身的核心就是动作,而不是场景。如果只用空间流会发生什么?准确率停在 73% 左右,比融合后的 88% 少了整整 15 个百分点。这说明单纯依赖外观信息,网络虽然能猜个大概,比如看到游泳池就猜游泳相关的动作,但对于外观相似、动作却完全不同的场景就容易翻车,比如打开门和关上门这两个动作,场景几乎一模一样,唯一的区别就在于门把手转动的方向,这种细节只有运动信息才能捕捉到。反过来,如果只用时间流会怎样?准确率能到 83%,已经相当不错,但依然比融合方案差 5 个百分点左右,因为纯运动信息有时候也会有歧义,比如扔球和扔飞盘这两个动作的手臂运动模式可能相似,但结合画面里球和飞盘的外观差异,就能轻松区分开。这恰好印证了双流设计的初衷,外观信息和运动信息各自都不完整,只有两者互相补足,才能撑起一个靠谱的判断。关键实验结果:第一次,深度学习赢了来看一下这篇论文最核心的对比数据,发表当年在两个主流数据集上的表现。| 方法 | UCF-101 准确率 | HMDB-51 准确率 ||---|---|---|| 空间流(单独) | 约 73.0% | 约 40.5% || 时间流(单独) | 约 83.7% | 约 54.6% || **双流融合(SVM)** | **约 88.0%** | **约 59.4%** || 同期最好手工特征方法 | 约 87.9% | 约 61.1% |注:不同论文版本和融合方式下具体数字会有小幅浮动,这里取原论文报告的代表性数值。看这张表,你会发现一个微妙但意义重大的转折点,在 UCF-101 这个数据集上,双流网络的 88% 已经追平甚至略微超过了当时最好的手工特征方法。而在 HMDB-51 这个更小、更难的数据集上,双流网络还没能完全反超,依然落后手工方法几个百分点。这个结果放在 2014 年,分量不轻。**这是深度学习第一次在大规模视频动作识别任务上,做到和巅峰期的手工特征方法打平甚至反超,而不是像之前那样被甩开二十个百分点。**这不是深度学习在这个任务上大获全胜的时刻,更像是一个证明这条路走得通的信号弹。此前很多人怀疑,深度学习是不是天生就不适合处理视频里的运动信息,而双流网络用实打实的数字回答了这个疑问,只要给网络喂对了信息(光流),而不是指望它自己从原始像素里领悟运动的本质,它是可以学好的。这条思路后来走到了哪里双流网络提出之后,这个分而治之的框架在接下来几年里成了视频理解领域的主流骨架,很多后续工作都是在这个基础上做加法。2016 年,Feichtenhofer 等人发表的论文对双流网络的融合方式做了改进,提出在网络的中间层就进行空间流和时间流的特征融合而不是等到最后输出层才融合,这样两条流可以更早地互相交流信息,进一步提升了准确率。2017 年,DeepMind 团队提出了 I3D 网络(Inflated 3D ConvNet),这篇论文延续了双流的双分支结构,但把原本的 2D 卷积膨胀成 3D 卷积,让网络能直接在时空维度上提取特征,同时依然保留了 RGB 流和光流两条分支的设计。I3D 借助当时新出的大规模视频数据集 Kinetics 做预训练,把 UCF-101 上的准确率进一步推高到 98% 左右,这个数字在几年前是完全无法想象的。也有一批研究者走向了另一个方向,他们琢磨,既然计算光流本身就很耗时间和计算资源,能不能让网络直接从原始视频帧里学出运动信息,不再依赖手工计算的光流。这条思路催生了后续像 3D 卷积网络、Non-local Networks 等一系列不依赖显式光流的模型,某种程度上是在验证双流网络当年提出的问题:CNN 到底能不能自己学会看运动。答案是,给足够的数据和合适的结构,是可以的,但双流网络那种明确分工、直接喂光流的思路,在很长一段时间里都是效果和效率的一个稳妥选择。写在后面读这篇论文最触动我的地方,其实是那个 15 个百分点的差距实验。很多论文喜欢直接呈现最好的融合结果,但这篇论文老老实实把两条流拆开单独测试,让读者自己看到外观信息和运动信息各自的短板在哪。这种拆解式的实验设计,某种程度上比最终的准确率数字更有价值,它告诉你的不是我们做到了多少,而是问题出在哪,我们怎么补上的。还有一点值得琢磨,光流这个东西本身是几十年前经典计算机视觉里的老技术,双流网络没有发明新的运动表示方法,只是把这个老工具喂给了新的深度网络架构。这种旧知识加新框架的组合方式,后来在很多领域反复出现,倒是提醒我们,突破有时候不一定来自全新的发明,而是来自对已有知识的重新组织。一个还没被这篇论文回答的问题是,光流的计算本身依赖前人对运动建模的理解,这本质上还是带着手工设计的痕迹。如果有一天,网络真的能完全从原始像素里自己领悟出比光流更好的运动表示,那会是什么样子?这条追问,后来的研究者们确实一直在做。如果一个只见过静态照片的人,第一次看视频,他会先注意到画面里的东西,还是先注意到东西在动?这个问题,双流网络给出的答案是,两者都重要,而且运动信息可能更重要一点。QAQ1双流网络是什么A双流网络是牛津大学研究者 Simonyan 和 Zisserman 在 2014 年提出的一种视频动作识别模型它把识别任务拆成两条独立的卷积神经网络一条空间流负责识别画面里的物体和场景另一条时间流负责识别光流场里的运动模式最后融合两条网络的判断结果。Q2双流网络为什么要用光流而不是直接用视频帧A因为光流场能把运动从像素颜色信息里单独剥离出来让网络专注学习运动模式不用同时兼顾外观和运动两件事。直接用原始视频帧训练的早期方法效果远不如手工设计的运动特征而喂光流能让网络学得更专注更高效。Q3双流网络的效果比之前的手工特征方法好多少A在 UCF-101 数据集上双流网络融合后达到约 88% 的准确率追平甚至略微超过当时最强的手工特征方法约 87.9%而在此之前深度学习方法只能做到 65%到70%左右差距高达二十个百分点。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进