![]()
2014年,如果你去问一个计算机视觉领域的研究者,深度学习能不能识别视频里的动作,大概率会得到一个尴尬的沉默。
那一年,AlexNet已经在图像分类上把所有人打得措手不及,深度学习几乎统治了静态图片的世界。但只要把静态图片换成一段视频,情况就完全反过来了。
**当时最好的深度学习方法,准确率只有65%左右,而一个叫做"密集轨迹"的手工特征方法,能做到87.9%。**
密集轨迹*:一种手工设计的视频特征提取方法,通过跟踪视频中密集分布的采样点的运动轨迹,统计轨迹周围的图像和运动信息来描述动作。
差了22个百分点是什么概念。意味着每识别5个动作,深度学习方法就要比手工方法多认错1个还多。这不是小数点后的差距,这是量级上的差距。深度学习在图片上赢了,却在视频上输得很惨,这件事让很多人开始怀疑,是不是深度学习压根不适合处理视频这种带时间维度的数据。
这就是牛津大学的Karen Simonyan和Andrew Zisserman在2014年面对的局面。他们后来在同一年发表了VGGNet,那篇论文让VGG这个名字家喻户晓。但在此之前,他们先解决了这个视频识别的难题,而这篇论文,就是我们今天要聊的双流卷积网络。
视频比图片难在哪
先说清楚一件事,视频识别到底难在哪里,为什么深度学习在图片上大杀四方,到了视频这里却水土不服。
一张静态图片,你要判断里面是猫还是狗,靠的是纹理、轮廓、颜色这些空间信息。卷积神经网络处理这类信息特别拿手,一层一层的卷积核就是在学习从边缘到形状再到物体的层级化特征。
但一段视频,比如一个人在挥手还是在鼓掌,光看某一帧的画面往往是不够的。挥手和鼓掌在单帧上可能长得几乎一样,两只手都举在空中,区别在于接下来手是怎么运动的。
**动作识别的核心信息藏在时间维度里,而不是空间维度里。**
这就好比你给一个从没见过棒球的人看一张照片,照片里一个人举着球棒,你问他这个人是在打球还是刚打完准备走。单张照片根本看不出来,你得看一连续几个动作,看球棒挥出去了没有,球飞出去了没有。如果只给一张照片,哪怕这张照片再清晰,信息量也是缺失的。如果不给出运动信息,单纯堆叠再多的卷积层,网络学到的也只是"这个场景里有一个人和一个球棒"这种静态描述,压根抓不住"挥棒"这个动作本身。
之前的深度学习方法为什么打不过手工特征,问题就在这里。它们大多是把视频的每一帧或者几帧堆在一起,直接扔给一个三维卷积网络去学,指望网络自己从像素的时序变化里领悟出运动信息。这个想法听起来很美,但现实是网络很难从原始像素堆里直接学出干净的运动模式,尤其是在当时训练数据量还不算特别大的情况下。
拆成两条流,一条看画面一条看运动
Simonyan和Zisserman的思路,说出来其实挺直接:既然网络自己学运动信息学得不好,那就不逼它自己学,直接把运动信息算好了喂给它。
于是他们把整个网络拆成了两条独立的通路。
**第一条叫空间流,专门看单帧画面,负责识别场景和物体的外观信息,比如这是什么场景,画面里有什么东西。**
**第二条叫时间流,专门看光流场,负责捕捉运动模式,比如手在往哪个方向挥,速度多快。**
光流*:描述图像序列中像素点运动方向和速度的一种表示方法,可以理解为把两帧之间每个像素挪动的轨迹画成一张图。
光流这个东西不是Simonyan他们发明的,它是计算机视觉里一个很老的概念,早在深度学习之前,光流就被用来做运动估计和视频压缩。他们的创新点在于,把预先计算好的光流场直接当成图像一样,喂给一个卷积神经网络去处理。
具体来说,时间流网络吃进去的不是普通的RGB图片,而是一叠光流图,记录了连续几帧里每个像素往哪个方向、移动了多远。这个输入本身就已经把运动信息用数值的方式表达出来了,网络不需要再费力气去猜"这两帧之间发生了什么变化",因为答案已经写在输入里了。
这两条流各自训练一个独立的卷积网络,最后把两边预测的分数做加权融合,得出最终判断。
这个设计思路让我想起一件生活里很常见的事。你去医院看病,医生一般不会只看你的CT片子就下判断,他会同时看片子,也看你的血液化验单。片子告诉他你身体结构上哪里出了问题,化验单告诉他你身体的代谢和炎症指标是什么状态。这是两种完全不同维度的信息,一个是"结构",一个是"动态过程",缺了任何一个,诊断都可能出错。如果只看CT片子不看化验单,你可能漏掉一个正在发展中的炎症,因为炎症在结构上还没造成明显变化。空间流和时间流的关系就是这样,空间流看的是"结构"性的画面信息,时间流看的是"动态"性的运动信息,两者互补,而不是重复。
论文里的实验狠狠证实了这一点。**如果只用空间流,准确率是72.6%,如果只用时间流,准确率能到81%,而两条流融合起来,准确率跳到88%。**
这组数字挺说明问题的。单独的时间流比单独的空间流还厉害,这说明运动信息对动作识别来说,比画面本身的外观信息更关键。但即便时间流已经这么强了,加上空间流之后还能再涨7个百分点,说明两者提供的信息确实是互补的,不是谁能替代谁的关系。
光流怎么变成网络能吃的输入
这里有个细节值得展开讲一下,光流场具体是怎么变成卷积网络的输入的。
光流本质上,对每一个像素点,都有一个二维向量,告诉你这个点往水平方向挪了多少,往垂直方向挪了多少。你可以把它想象成给每个像素画了一个箭头,箭头的方向和长度表示这个像素接下来往哪儿跑、跑多快。
Simonyan和Zisserman把连续帧之间的光流,拆成水平分量和垂直分量两张图,叠在一起作为网络的输入通道。为了让网络能捕捉稍长一点时间跨度的运动信息,他们没有只用相邻两帧的光流,而是把连续多帧,论文里用的是10帧的光流叠在一起,变成一个多通道的输入,一次性喂给网络。
这个做法背后有一个朴素但重要的考虑。一个动作往往不是一瞬间完成的,挥手这个动作可能要持续半秒到一秒,如果只看两帧之间的瞬时光流,网络看到的运动信息片段太短,很难判断这是挥手还是别的动作。叠加多帧光流,相当于给网络看一个动作片段的运动轨迹,而不是一瞬间的运动快照。
这就像你要判断一个人是在散步还是在跑步,你不能只看他脚落地那一瞬间的姿态,你得看他连续几步的节奏和步幅变化。只看一瞬间,你可能会把一个人正在迈大步走路误判成慢跑。看足够长的一段连续动作,才能看出真正的节奏模式。如果Simonyan他们只用两帧光流,时间流网络很可能会退化成一个对瞬时姿态敏感但对动作节奏迟钝的模型,识别效果会大打折扣。
论文里还有个很讲究的地方,他们把光流网络的第一层卷积核可视化出来看了看,发现学出来的滤波器大多是方向性的,像是在专门检测某个特定方向的运动模式。这不是设计出来的,是网络自己训练出来的结果。这说明网络确实理解了光流这种输入的本质,光流场里最重要的信息就是方向,网络也就自发地学会了去关注方向。
训练数据不够怎么办
深度学习一个绕不开的问题是数据量。2014年那会儿,视频动作识别的标准数据集比图片分类的数据集小得多,像UCF-101这样的数据集也就一万多个视频片段,分成101个动作类别。这个规模放到今天看小得可怜,当年做ImageNet图片分类的时候,训练集都有上百万张图片。
数据不够,网络就很容易过拟合,学到的不是动作本身的规律,而是训练集里那几个视频特有的背景噪声。
Simonyan和Zisserman想了两个办法。
第一个办法是多任务学习,让同一个网络同时在两个不同的数据集上训练,一个是UCF-101,一个是HMDB-51,这两个数据集的动作类别不完全一样,但共享底层的网络参数。这样网络能从两份数据里一起学习通用的动作特征,相当于变相扩大了可用的训练数据量。
多任务学习*:让一个模型同时学习多个相关任务,通过共享底层参数,使得模型能从多个任务的数据里共同受益,缓解单一任务数据不足的问题。
第二个办法更巧妙一些,他们在ImageNet这个超大规模的图片数据集上,先预训练空间流网络。空间流处理的毕竟是普通图片,那些从上百万张图片里学到的边缘、纹理、形状的通用特征,拿到视频动作识别上来用,依然是有效的。这就是迁移学习的思路,先在数据充足的任务上打好基础,再迁移到数据稀缺的任务上做微调。
迁移学习*:将一个模型在数据充足的任务上学到的知识,迁移应用到另一个数据稀缺但相关的任务上,以此提升在小数据集上的表现。
这个做法挺像一个学生在准备一场专业性很强的考试,比如中医执业医师考试,但市面上找不到足够多的模拟题。聪明的做法不是死磕那几十道题反复刷,而是先把西医的基础解剖学、生理学这些通用知识打扎实,因为这些底层知识在很多医学领域都是通用的,然后再拿仅有的那些中医专业题目去查漏补缺。如果一个学生只死磕那几十道题,他大概率会把这几十道题背得滚瓜烂熟,但换一道没见过的新题就懵了,这就是过拟合。先打通用基础再针对性微调,才能在小样本的情况下学到真正有用的东西。
数据说话:双流网络到底强在哪
论文在两个当时最主流的动作识别数据集上做了测试,一个是UCF-101,一个是HMDB-51。
| 方法 | UCF-101 准确率 | HMDB-51 准确率 |
| 空间流单独 | 72.6% | 40.5% |
| 时间流单独 | 81.0% | 54.6% |
| **双流融合** | **88.0%** | **59.4%** |
| 密集轨迹(手工特征,当时最强) | 87.9% | 57.2% |
这张表格里最值得琢磨的一行是最后的对比。双流网络的88.0%,和密集轨迹的87.9%,几乎是打了个平手,双流网络只领先了0.1个百分点。
单看这个数字,你可能会觉得,这不就是打了个平手吗,有什么值得大书特书的。但放到当时的历史情境里看,这个"打平"的意义完全不一样。
**在这篇论文之前,深度学习在视频动作识别上,从来没有真正追上过手工特征,更别说打平了。**
这是深度学习第一次证明,自己在处理带有时间维度的复杂任务上,能够和精心设计了十几年的手工方法掰手腕。这个信号的意义,不亚于AlexNet在ImageNet上证明深度学习能打败传统的图像分类方法。它告诉整个领域一件事,深度学习不是只能处理静态图片,只要给它喂对了信息,它同样能处理动态的、带时间结构的数据。
在HMDB-51数据集上,双流网络更是以59.4%对57.2%,反超了密集轨迹2.2个百分点,这是深度学习方法第一次在标准动作识别数据集上真正超过手工特征。
这条思路后来走向了哪里
双流网络这个思路提出之后,并没有停在这一篇论文里,后面好几年,大量的工作都是在这个骨架上继续添砖加瓦。
**2016年,Feichtenhofer等人发表了一篇论文,提出了时间段网络的改进思路,把双流网络里两条流融合的时机提前了,不再是只在最后的分数层面简单加权,而是在网络中间层就开始做跨流的信息交互,这个改动把UCF-101上的准确率进一步推高。**
**2016年,Wang等人提出了时序分段网络TSN,这篇工作解决了双流网络的一个明显短板,原来的双流网络每次只能处理很短的一小段视频片段,对于长视频里跨越较长时间的动作模式捕捉能力有限。TSN的做法是把整段视频均匀切成好几段,每段都单独跑一次双流网络,再把各段的结果汇总起来做最终判断,这让模型能够兼顾视频的全局时序结构,而不只是盯着某个局部片段。**
时序分段网络*:一种改进的动作识别网络结构,通过把长视频切分成多个片段分别处理再融合结果,来捕捉跨越较长时间跨度的动作模式。
再往后,3D卷积网络逐渐兴起,像C3D和I3D这些工作,试图让网络直接从原始视频帧里同时学习空间和时间特征,不再依赖预先计算好的光流,这某种程度上是在挑战双流网络里"必须手工提供运动信息"这个前提。但即便到了3D卷积和后来的Transformer架构成为主流的今天,双流网络提出的这个核心洞察,空间信息和时间信息应该被区别对待、分别建模,依然在深度地影响着后续几乎所有的视频理解架构的设计思路。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是Simonyan和Zisserman在2014年提出的视频动作识别方法,把网络拆成空间流和时间流两条独立通路,空间流处理单帧画面识别场景和物体,时间流处理预先计算好的光流场捕捉运动信息,最后把两条流的预测结果融合得出最终判断。
Q2:双流卷积网络的效果比之前的方法好多少?
A:在UCF-101数据集上,双流网络融合后达到88.0%的准确率,和当时最强的手工特征方法密集轨迹的87.9%基本持平,在HMDB-51数据集上更是以59.4%对57.2%反超了手工特征方法,这是深度学习第一次在视频动作识别上追平甚至超过手工方法。
Q3:为什么要把网络拆成空间流和时间流两条通路?
A:因为动作识别的关键信息藏在时间维度里,单帧画面往往看不出动作本身,比如挥手和鼓掌单帧可能长得很像。把运动信息用光流的形式预先计算好单独喂给一条网络,比让网络自己从原始像素堆里学运动模式效果更好,实验显示单独的时间流准确率就能达到81%,比单独空间流的72.6%高出不少。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
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.