来源:市场资讯
(来源:科技行者)
2014 年之前,如果你让一台电脑分辨视频里的人是在"打网球"还是在"打棒球",最靠谱的办法居然不是神经网络。
那时候深度学习已经在图像识别上大杀四方了。2012 年的 AlexNet 把图片分类的错误率一下打下来十几个百分点,整个计算机视觉圈子都在传"深度学习要统治一切"。可是到了视频动作识别这个任务上,事情变得很尴尬。
一个叫"密集轨迹"的手工特征方法,稳稳占据着榜首。它不是神经网络,是研究者手动设计的一套规则,追踪画面里密密麻麻的点怎么运动,然后统计这些运动轨迹的模式。这套土办法在权威的 UCF-101 动作识别数据集上能做到 85% 左右的准确率,而当时能找到的神经网络方案,只能做到 65% 上下,差了整整 20 个百分点。
20 个百分点是什么概念?
意味着每 5 个动作里,深度学习就要比手工方法多认错 1 个。放在图像分类上,这个差距会被认为是灾难性的失败。
于是当时圈子里有一种隐隐的共识:视频这东西太复杂了,神经网络学不明白动作里的时间信息,还是老老实实用手工特征吧。
这篇文章要讲的论文,就是在这个背景下出现的。作者是 Karen Simonyan 和 Andrew Zisserman,来自牛津大学,论文叫《Two-Stream Convolutional Networks for Action Recognition in Videos》,2014 年发表。顺便说一句,这两位几个月后又发了另一篇论文,叫 VGGNet,后来成了图像识别领域最经典的网络结构之一。同一个组,同一段时间,一边琢磨怎么让神经网络看懂图片,一边琢磨怎么让神经网络看懂视频里的动作,这两件事其实是拧在一起的。
难在哪里:神经网络缺了一根筋
要理解这篇论文的巧妙之处,先得搞清楚视频识别到底难在哪。
一张静态图片,神经网络只需要认出"这是什么东西"。一段视频,多了一个维度:时间。一个动作是"挥拍",光看某一帧画面,可能根本看不出这人是在挥拍还是仅仅举着球拍站着。动作的本质藏在连续帧之间的变化里。
传统的卷积神经网络
卷积神经网络*:一种通过卷积操作提取图像局部特征的深度学习模型,擅长识别图片里的物体、纹理、形状。
天生是为静态图片设计的。你把视频的每一帧单独喂给它,它能告诉你这一帧里有没有人、有没有球拍,但它没有办法直接感知"动作"这个概念,因为动作是跨越多帧才能看出来的东西。
早期有研究者尝试把视频直接堆叠成一个三维数据块,让网络在时间和空间两个维度上同时做卷积,指望网络能自己学会捕捉运动信息。这个思路听起来很合理,但实际效果并不好。网络在海量的像素变化里很难自己摸索出"这是运动"这种抽象概念,尤其是训练数据不够多的时候,网络学到的更多是背景纹理之类的表面特征,而不是真正的动作模式。
这就好比你想教一个从没见过运动会的人认识"跑步"这个动作,但你给他看的只是一张一张孤立的照片,还期待他自己从这些照片的像素变化里推理出"跑步"的概念,而不告诉他"腿在交替摆动"这个关键线索。他大概率会盯着跑道的颜色、观众的衣服这些无关的细节瞎猜。如果你直接告诉他"看腿的摆动轨迹",他会瞬间抓住重点。这正是当时神经网络在视频任务上的处境,它没有被直接告知"运动信息在哪里",只能在原始像素里大海捞针。
核心思路:把"长什么样"和"怎么动"拆开来看
Simonyan 和 Zisserman 的想法说出来其实很朴素:既然网络自己很难从原始像素里学出运动信息,那就不要让它自己学了,直接把运动信息喂给它。
具体怎么做?他们把视频识别这个任务拆成了两条独立的通路,一条专门看"这一帧长什么样",另一条专门看"画面是怎么动的"。这两条通路各自训练一个卷积神经网络,最后把两边的判断结果融合起来做最终决策。
这就是论文标题里"Two-Stream"的意思。
双流卷积网络*:由两个独立的卷积神经网络组成的架构,一个处理静态画面(空间流),一个处理运动信息(时间流),最后融合两者的判断结果。
空间流很好理解,就是普通的图片分类网络,输入是视频里的某一帧画面,网络学习识别画面里的场景、物体、人物姿态,这些信息能帮助判断"这可能是个什么动作"。比如看到球场、球网,网络会倾向于猜测这是网球相关的动作。
时间流才是这篇论文真正的巧思所在。它的输入不是原始画面,而是光流场。
光流*:描述视频中相邻两帧之间,画面上每个点是怎样移动的一种表示方法,本质上是一张记录了运动方向和速度的图。
光流这个概念在计算机视觉里其实是个老朋友,早在深度学习流行之前,做视频分析的人就在用它。光流会告诉你,画面上的每一个像素点,从上一帧到下一帧,往哪个方向挪动了多远。如果把一段挥拍的视频算出光流,你会看到手臂和球拍区域的光流箭头都指向挥动的方向,而背景几乎是静止的,光流值接近零。
这一步操作的巧妙之处在于,它把"运动"这件本来隐藏在多帧变化中的抽象信息,提前用传统算法计算好,变成了一张可以直接输入卷积网络的图片。网络不再需要自己去猜测运动信息在哪里,它拿到的输入本身就是"运动的样子"。
这就像你要教一个孩子理解"哪里在下雨",与其让他盯着一整段监控录像自己去找雨滴的痕迹,你不如直接给他一张已经标好了"雨滴移动轨迹"的示意图。他不需要具备从原始视频里提取运动信息的能力,这件事已经替他做好了,他只需要学会看这张示意图,判断"这种运动模式对应的是什么天气"。如果不做这一步预处理,网络就要同时承担"理解运动"和"识别动作类别"两个任务,负担太重,学习效率会大打折扣。
论文里作者做了个很直接的对比实验,来验证这个设计到底值不值。
如果只用空间流,也就是只让网络看静态画面,不给它任何运动信息,在 UCF-101 数据集上的准确率是多少?
答案是 72.6%。
如果只用时间流,也就是只让网络看光流图,完全不看原始画面呢?
答案反而更高,达到 81%左右。
这个结果其实相当说明问题。单看画面长什么样,对判断动作类别的帮助有限,因为很多动作发生的场景是相似的。而运动模式本身,才是区分动作类别更本质的线索。这也印证了研究者最初的直觉:动作识别真正缺的不是"看得清",而是"看得懂运动"。
当把两条流结合起来,用一种加权平均的方式融合两边的预测结果,准确率达到了 88%左右。
这一下子超过了此前手工设计的密集轨迹方法的成绩,也是深度学习方法第一次在视频动作识别这个任务上超过了手工特征。
这个时间点值得多说一句。2012 年 AlexNet 让深度学习在图像分类上一战封神,那种震撼感,在视频动作识别领域,直到 2014 年这篇双流网络论文才第一次真正出现。整整晚了两年,深度学习才在这个子领域证明了自己不是花架子。
光流网络自己在学什么
论文里有一个细节我觉得特别值得拿出来聊聊。
作者去看了时间流网络第一层卷积核学到的东西,发现这些卷积核大多呈现出明显的方向性模式,就像是一组专门检测"某个方向上的运动"的探测器。
这不是研究者提前设计好塞进去的,是网络自己在训练过程中学出来的。
这说明网络确实理解了光流图里最重要的信息是什么,也就是运动的方向性。它不需要人告诉它"要关注方向",它通过大量数据训练,自己发现了这一点,然后把探测器长成了最适合捕捉方向信息的形状。这也从另一个角度证明了,把光流作为输入这个设计选择是对的路,网络确实能从这种输入里挖出有价值的模式,而不是在瞎学一些无关的噪声。
数据不够怎么办:从图像识别那里借点经验
这篇论文还有一个不太起眼但很务实的贡献,是关于训练数据不足的问题。
视频数据集在当时远比图像数据集小。UCF-101 只有一万多段视频,相比图像分类动辄几百万张训练图片的规模,差距很大。数据量不够,深层神经网络很容易过拟合,也就是在训练集上表现很好,换到没见过的数据上就表现拉垮。
密集轨迹方法虽然效果好,但它是手工设计的规则,不需要大量数据"学习",这也是它在数据稀缺年代占优势的原因之一。神经网络想要发挥威力,通常需要喂饱它才行。
Simonyan 和 Zisserman 借用了图像识别领域已经验证过的一套做法,用在图片分类任务上表现很好的大规模数据集先把网络的空间流部分预训练一遍,再拿到视频数据上做微调。这个思路本质上是把从图片里学到的"什么是猫、什么是人、什么是球拍"这类通用视觉知识,迁移到视频任务上,而不用完全从零开始学。
这就像一个已经会开小汽车的人去学开卡车,他不需要从"什么是方向盘、什么是刹车"这种最基础的概念重新学起,他可以直接站在已有驾驶经验的基础上,专注去适应卡车更大的车身和更长的刹车距离。如果非要让他假装完全没有驾驶经验从零练起,那是浪费他已经拥有的知识,学习效率会低很多。
这个迁移学习的思路,后来成了整个深度学习领域处理数据稀缺问题的标准做法之一,不仅仅局限在视频识别上。
这篇论文之后,故事怎么发展的
双流网络这个框架提出之后,后续研究基本都是在这个骨架上往前推。
2015 年,Wang 等人发表了 Trajectory-Pooled Deep-Convolutional Descriptors(TDD)方法,把手工设计的轨迹特征和双流网络提取出来的深度特征结合在一起,进一步把 UCF-101 上的准确率往上推了一截。这个工作某种程度上是一种"过渡期"的产物,说明当时研究者还没有完全放心把手工特征丢掉,而是想办法把两边的优势捏合到一起。
更关键的后续工作来自 Feichtenhofer、Pinz 和 Wildes 在 2016 年发表的论文,他们提出了一种改进的双流网络融合方式,把原本在最后阶段才融合的两条流,改成在网络中间层就开始进行信息交互,让空间流和时间流能更早地互相"通气",而不是各自闭门造车到最后一步才合并意见。这个改动让准确率进一步提升。
再往后,2017 年 Carreira 和 Zisserman(还是同一个 Zisserman)提出了 I3D 网络,把双流网络的思路和三维卷积结合起来,同时借助一个新建的大规模视频数据集 Kinetics 做预训练,进一步把这个方向推向了更强的性能。有意思的是,I3D 依然保留了双流结构的核心设计,一条流处理原始画面,一条流处理光流,说明双流这个基本框架的生命力一直延续了下来,即便具体的网络结构已经换了好几代。
写在后面
这篇论文最打动我的地方,其实不是准确率数字本身,而是那个"不硬学,先给线索"的思路。
深度学习给人的一贯印象是,只要数据够多、网络够深,它什么都能自己学出来。这篇论文提醒我们,有些信息如果你能提前用传统方法算好再喂给它,效果会好得多,也快得多。这不是对深度学习能力的否定,反而是一种更聪明的配合方式。
光流网络第一层卷积核自己学出方向性滤波器这件事,也让我想起一个更普遍的现象:好的输入设计,往往能让网络的学习变得异常轻松,而网络学到的东西,常常会回过头证明这个输入设计是对的。这是一种双向验证。
一个还没被这篇论文解决的问题是,光流的计算本身依赖传统算法,这一步是独立于神经网络训练之外的,计算量不小,也没办法端到端地联合优化。如果光流本身也能被神经网络学出来,而不是靠外部算法算好再喂进去,会不会有更好的效果?后来的研究确实往这个方向走了一些,但那是另一个故事了。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别方法,它用两个独立的卷积神经网络分别处理静态画面(空间流)和运动信息(时间流),再把两边的判断结果融合起来,第一次让深度学习在视频动作识别任务上超过了手工特征方法。
Q2:为什么双流网络要用光流而不是直接用原始视频帧?
A:因为动作的关键信息藏在帧与帧之间的运动变化里,网络很难自己从原始像素中学出这种运动模式。光流提前用传统算法算好了每个像素点的运动方向和速度,相当于把运动信息直接喂给网络,让网络不用再费力自己去挖掘运动线索。
Q3:双流网络之后有哪些重要的改进工作?
A:2016 年 Feichtenhofer 等人提出让空间流和时间流在网络中间层就开始融合,而不是等到最后一步。2017 年 Carreira 和 Zisserman 提出 I3D 网络,结合三维卷积并用 Kinetics 大规模数据集预训练,依然保留了双流结构的核心思路。
热门跟贴