![]()
2012年,AlexNet横空出世,深度学习在图像识别上打了一场漂亮的翻身仗。ImageNet比赛的错误率从26%直接砍到15%,整个计算机视觉圈子都在讨论卷积神经网络的威力。
但有一个领域,深度学习死活打不进去。
视频动作识别。
你把一段视频拆成一帧一帧的图片,扔给当时最强的卷积神经网络,它认人脸、认猫狗都没问题,可一旦要判断这个人是在"打网球"还是"挥高尔夫球杆",效果就是不如那些手工设计的老派方法。
这事儿说出来有点反常。因为图像识别的成功经验就在那里,理论上把同样的网络架构搬到视频的每一帧上,应该也能奏效。可现实是,在UCF-101这个标准动作识别数据集上,手工特征方法能做到87%左右的准确率,而深度学习的尝试却卡在65%上下,差了20多个百分点。
20个百分点是什么概念?意味着每5个动作里,深度学习方法就要比手工方法多认错1个。这不是小打小闹的差距,这是完全没打赢。
问题出在哪儿?答案其实藏在一个大家都忽略的地方:**动作是发生在时间里的,而不是发生在某一张照片里的**。
一张静止的照片能告诉你这个人举着球拍,但它没法告诉你球拍是在往上挥还是往下砸。你需要看运动,看这一帧和下一帧之间发生了什么变化。而当时的卷积神经网络,天生就是为处理单张静止图片设计的,它压根不知道"运动"这个东西存在。
牛津大学的Karen Simonyan和Andrew Zisserman盯上了这个问题。他们俩后来几个月内又发表了另一篇论文,叫VGGNet,也就是后来大名鼎鼎的VGG网络架构。这两篇论文其实是同一个研究小组同一时期的产出,一篇解决"网络该多深",一篇解决"网络该怎么看懂运动"。
光流:把运动本身变成一张能被卷积网络理解的图片
Simonyan和Zisserman的思路很直接:如果网络不知道运动是什么,那就把运动翻译成网络能看懂的语言,也就是图片。
他们用的工具叫光流。
> 光流*:描述视频中每一个像素点从上一帧到下一帧移动了多远、往哪个方向移动的一种向量场。简单说,就是给画面里的每一个点画一个"运动箭头"。
具体来说,他们把光流拆成两个分量:一个是水平方向的位移,一个是垂直方向的位移。每个分量单独存成一张灰度图,亮度代表位移的大小和方向。这样一来,原本抽象的"运动"就变成了两张具体的图片,可以直接扔进卷积神经网络里训练。
这个设计背后的判断是:**外观信息和运动信息,应该由两个独立的网络分别去学,而不是混在一起硬塞给一个网络**。
为什么要这样拆开?想象你去看一场篮球比赛直播,画面里同时有球员的球衣颜色、场馆背景、球的轨迹、人的跑动方向。如果你只盯着一张静止截图,你能看出球衣是红色的、背景是木地板,但你看不出这个球是正在被投出还是正在被接住。反过来,如果你只看运动轨迹的示意图,你能看出球在往篮筐方向飞,但你完全不知道这是哪个队的球员投的。
这两种信息各管一部分,硬拧在一起反而谁都学不好。所以论文提出的架构叫双流网络。
> 双流网络*:Two-Stream Network,由两个独立的卷积神经网络组成,一个专门吃RGB图像学外观,一个专门吃光流图学运动,最后把两边的判断结果融合起来。
一个网络叫空间流,输入是普通的RGB彩色图片,负责识别画面里有什么,比如球场、球拍、泳池这些场景和物体信息,这些线索往往已经能大致猜出动作类型。另一个网络叫时间流,输入是连续多帧计算出来的光流图,负责捕捉动作本身的动态特征,比如手臂挥动的方向、身体重心的位移轨迹。
两个网络结构基本一致,都是模仿当时流行的卷积网络设计,各自独立训练,最后在输出层把两边的分类分数做一个加权平均,或者训练一个简单的分类器把两路特征融合起来。
如果只用空间流会怎样?论文里做了对照实验,只用空间流的网络,在UCF-101上准确率是72.6%。而加上时间流之后,整体准确率跳到了88%左右,涨了15个百分点还多。这说明单靠画面里的静态物体线索,远远不足以判断动作,运动信息才是真正的核心线索。
反过来,如果只用时间流呢?单独的时间流网络能做到大约81%,比空间流的72.6%还要高。这个结果挺有意思,说明在纯粹的动作识别任务上,运动信息本身的价值,甚至比外观信息更大。
这也印证了最初的判断,动作识别和普通的物体识别不是一回事,普通物体识别看的是"这是什么",动作识别更多要看的是"发生了什么变化"。
为什么要用光流,而不是直接把好几帧图片堆起来喂给网络
这里有个自然会冒出来的疑问。既然要学运动信息,为什么不直接把连续几帧的原始图片堆叠起来,一起扔给一个卷积网络,让网络自己去学习帧与帧之间的差异?
论文里其实也做了这个实验,作为对照。结果是,直接堆叠原始帧的方式效果并不理想,提升非常有限,远不如显式计算光流的效果好。
原因在于,原始像素的堆叠里混杂了太多和运动无关的噪声,比如光照变化、背景纹理、摄像机的轻微晃动,这些东西会干扰网络去提取真正有用的运动模式。而光流是经过专门算法处理过的结果,它已经把"这个点往哪个方向移动了多少"这个核心信息提炼出来了,相当于帮网络提前做了一遍降噪和特征提取。
这就好比你想学一段舞蹈的动作要领,教练直接甩给你一整段没有任何注解的高清视频,你得自己去分辨哪里是关键的转身动作,哪里只是衣服在风里飘。但如果教练提前用红色箭头把每一个关键动作的运动方向标出来,你学习的效率会高很多。光流图,就是那个被提前标好箭头的版本。
如果不做这层预处理,会怎样?网络得自己从原始像素的剧烈变化里,大海捞针一样去分辨哪些变化是真正的身体动作,哪些只是背景噪声。这个任务对当时的网络容量和训练数据量来说太难了,这也是为什么直接堆叠帧的方案效果不理想。
多任务训练:用两个数据集一起喂饱一个网络
这篇论文还遇到一个很现实的麻烦,数据不够用。
当时可用的动作识别数据集,规模都不大。UCF-101大概有1万3千段视频,HMDB-51更小,只有约7000段。这个规模对于训练一个深层卷积网络来说是远远不够的,很容易过拟合,也就是网络把训练集里的细节死记硬背下来,换到新视频上就不灵了。
> 过拟合*:模型在训练数据上表现很好,但换到没见过的新数据上表现很差,相当于死记硬背题目答案而不是真正学会了解题方法。
Simonyan和Zisserman想出的办法是多任务学习。
> 多任务学习*:让同一个网络同时在多个相关但不完全一样的任务上训练,共享底层特征,只在最后的输出层区分不同任务,这样可以用更多数据把网络训练得更扎实。
具体做法是,他们让同一个时间流网络,同时在UCF-101和HMDB-51这两个数据集上训练。网络的大部分层是共享的,只有最后输出分类结果的那一层,针对两个数据集分别设置。这样一来,原本两个各自数据量不足的数据集,相当于被合并成了一个更大的训练资源池,网络能学到的运动模式更丰富,也更不容易在某一个小数据集上过拟合。
这就像一个健身教练,如果只带一个学员训练深蹲,能获得的反馈样本有限。但如果同时带十个学员训练深蹲,尽管每个学员的体型、力量各不相同,教练能观察到的"深蹲的正确要领是什么"这个共性规律,反而会因为样本量变大而总结得更准。多任务学习的逻辑也类似,不同数据集的具体动作类别不同,但底层的运动模式是相通的,合并训练能让网络更好地抓住这个共性。
实验证明这个办法确实有效,加了多任务训练之后,时间流网络在HMDB-51上的准确率有明显提升。
网络到底学到了什么,能从卷积核里看出来吗
论文里还有一个挺有意思的细节,他们把训练好的时间流网络第一层卷积核可视化出来看了看。
结果发现,这些卷积核大多呈现出明显的方向性,像一组组不同角度的条纹滤波器。
这不是巧合。这说明网络自己学出来的第一层特征,本质上就是在检测光流场里不同方向的运动模式,这和人类研究者手工设计运动特征时的直觉是一致的,运动方向本身就是判断动作类型最关键的信息之一。这个结果侧面印证了光流这个输入表示选得对,网络确实是在利用运动方向这个核心线索,而不是学到了一些无关的噪声模式。
最终成绩单,以及它在历史上意味着什么
把空间流和时间流融合之后,这篇论文在UCF-101上达到了88.0%的准确率,在HMDB-51上达到了59.4%。
作为对照,当时最好的手工特征方法,比如基于密集轨迹的方法,在UCF-101上大约是87%左右。也就是说,这是深度学习方法第一次在标准的视频动作识别数据集上,追平甚至小幅超过手工设计特征的表现。
这句话放在2014年的语境里,分量不轻。要知道两年前AlexNet在图像识别上的胜利,已经让整个学术圈接受了"深度学习能赢"这个事实,但动作识别领域迟迟没能复制这个胜利,大家一度怀疑是不是视频这种时序数据,天生就不适合用卷积网络处理。双流网络这篇论文相当于告诉大家,不是网络不行,是之前的做法没有找到正确的方式去表达"运动"这个信息。
|方法|UCF-101准确率|HMDB-51准确率|
|仅空间流|72.6%|-|
|仅时间流|~81%|-|
|**双流融合**|**88.0%**|**59.4%**|
|手工特征(密集轨迹)方法|~87%|~57%|
这篇论文之后,双流网络的思路成了视频动作识别领域接下来好几年的标准框架。
3年后,Feichtenhofer等人在2016年提出了一种新的融合方式,不再是简单地在最后一层把两路结果拼起来,而是让空间流和时间流在网络中间的多个层级上就开始交互融合,进一步提升了识别精度。
再往后,Carreira和Zisserman(同一个Zisserman)在2017年提出了I3D网络,把双流的思路和三维卷积结合起来,用三维卷积核直接在时间和空间两个维度上同时提取特征,不再需要单独计算光流这一步,同时还借助在Kinetics这个更大规模视频数据集上的预训练,把准确率进一步推高。这篇论文也成为后续很长一段时间视频理解领域的重要基准。
从这个脉络能看出来,双流网络提出的核心思想,外观信息和运动信息需要被分别对待、需要显式建模,这个判断本身经受住了时间的考验,后续的工作是在这个基础判断上不断寻找更高效的实现方式。
写在后面
读这篇论文时,最触动我的是那个第一层卷积核可视化的细节。研究者手工设计光流特征用了十几年,最后神经网络自己学出来的东西,长得和人类专家总结的方向性滤波器几乎一样。这说明有时候深度学习不是发明了全新的知识,而是用另一条路径,重新发现了人类已经摸索出来的规律,只是这条路径更省力、更容易扩展到大数据。
还有个容易被忽略的地方是,这篇论文里深度学习并没有真正"赢",只是打了个平手。88%对87%,差距小到几乎可以忽略。真正的转折点其实在后面几年,当数据规模和网络设计都跟上之后才彻底拉开差距。这提醒我,一个方法第一次追平旧方法的那个时刻,往往比它后来大幅超越旧方法的时刻更值得记住,因为那才是路走对了的证明。
如果光流这个"翻译运动信息"的思路,能用在别的非视觉的时序数据上,比如把某种传感器信号先转换成一种更直观的中间表示再喂给网络,会不会也有类似的效果?这个问题我觉得还挺值得想一想。
Q&A
Q1:双流网络是什么?
A:双流网络是Simonyan和Zisserman在2014年提出的视频动作识别模型,由两个独立的卷积神经网络组成,一个叫空间流,输入普通RGB图像学习外观信息,一个叫时间流,输入光流图学习运动信息,最后把两路结果融合得出最终判断。
Q2:光流为什么比直接堆叠视频帧效果更好?
A:光流是经过专门算法提炼出的运动信息,已经把每个像素点的移动方向和幅度计算清楚,相当于提前帮网络做好了降噪。而直接堆叠原始帧会混入光照变化、背景纹理等大量无关噪声,干扰网络学习真正的运动模式,实验显示直接堆叠帧的效果远不如光流。
Q3:双流网络最终的准确率如何,和当时的手工特征方法相比怎样?
A:双流网络融合后在UCF-101上达到88.0%准确率,在HMDB-51上达到59.4%,和当时最好的手工特征方法(约87%)基本持平甚至略有超越,这是深度学习第一次在视频动作识别上追平手工特征方法。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.