![]()
2014 年,如果你去问一个做视频动作识别的研究者“深度学习行不行”,大概率会得到一个尴尬的摇头。
图像识别领域里,卷积神经网络已经靠 AlexNet 打了一场漂亮的翻身仗。可是一旦把静态图片换成视频,神经网络突然就不好使了。当时最好的深度学习方法在一个叫 UCF-101 的动作识别数据集上准确率是 65.4%,而一个叫 improved trajectories 的手工特征方法能做到 87.9%。
差了 22 个百分点。
这意味着什么?意味着每 5 段视频里,深度学习方法就要比手工方法多认错 1 个动作。这在当时不是小差距,而是一种“深度学习到底适不适合视频”的存在性质疑。要知道,那正是卷积网络在图像领域气势如虹的时候,视频却像是它啃不动的一块硬骨头。
Karen Simonyan 和 Andrew Zisserman 这两位来自牛津大学的研究者,决定啃一啃这块骨头。有意思的是,这两人几个月后又发表了另一篇论文,叫 VGGNet,后来成了图像识别领域最经典的网络结构之一。也就是说,他们几乎是在同一个时间段,一边琢磨怎么让卷积网络看懂静态图片,一边琢磨怎么让它看懂动态视频。这篇双流网络的论文,就是后者的答案。
视频比图片难在哪里
要理解这篇论文的巧妙之处,得先搞清楚视频识别到底难在哪儿。
一张图片是静态的空间信息:这是一只猫,那是一把椅子。可视频是空间信息加上时间信息的组合。一个人挥手和一个人放下手,可能在某一帧上看起来几乎一样,你必须看连续的好几帧,看动作是怎么变化的,才能判断这个人到底在做什么。
> 卷积神经网络(CNN):一种通过卷积操作提取图像局部特征的深度学习模型,图像识别领域的主力模型。
问题是,当时的卷积网络天生就是为处理单张静态图片设计的。硬把它套到视频上,通常的做法是把视频的每一帧当成图片扔进网络,或者简单粗暴地把好几帧堆叠在一起当作一个“更厚的图片”输入。这两种做法都有个共同的毛病:网络很难学到真正有效的运动信息,它顶多是在学习“这一帧长什么样”,却学不到“这个东西是怎么动的”。
这就好比你想让一个人通过看照片学会跳舞。你给他一张舞者摆好造型的照片,他能描述出这个姿势,但他永远学不会“转身接抬腿”这个动作是怎么完成的,因为动作本身藏在连续帧的变化里,不在单张照片里。如果你不给他连续的画面,只给静态截图,他学到的永远是造型集锦,不是舞蹈。
那时候能有效捕捉运动信息的,反而是一套纯手工设计的特征,叫做 improved trajectories,靠着追踪像素点的运动轨迹和计算方向直方图,把动作的时间维度信息提取得相当扎实。深度学习在这一点上,完全被手工方法压着打。
核心思路:把网络拆成两条流
Simonyan 和 Zisserman 的解法,现在看起来简单到近乎“暴力”,但在当时是个相当聪明的思路转弯。
他们没有硬逼着一个网络同时学会“看清楚这是什么”和“看清楚这是怎么动的”,而是干脆造了两个网络,一个专门看空间信息,一个专门看运动信息,最后把两边的判断结果加权融合。
这两条流分别叫空间流和时间流。
> 空间流(Spatial stream):输入单帧 RGB 图像,负责识别画面里的物体、场景、人物外观这类静态信息,本质上和普通图像分类网络没什么区别。
空间流做的事情你很好理解,它看一帧画面,判断这画面里有没有篮球场、有没有游泳池、有没有一个人举着球拍。这些静态背景和物体信息,对判断动作类别其实帮助很大。你看到游泳池,大概率这个动作和游泳有关,这跟看运动本身没关系,纯粹是场景先验。
> 时间流(Temporal stream):输入的不是普通图像,而是光流场(optical flow),专门捕捉像素在连续帧之间的运动方向和速度。
时间流才是这篇论文真正的巧思所在。它输入的不是原始画面,而是光流。
> 光流(Optical flow):描述图像中每个像素点在连续两帧之间移动方向和速度的向量场,本质上是一张“运动地图”,用颜色和方向编码每个位置的位移。
光流这个东西,通俗点说,就是把“这个像素往哪个方向动了多远”这件事,变成一张可以看的图。传统计算机视觉里早就有成熟的算法能算出光流场,论文里用的是一种叫 TVL1 的方法。研究者把连续帧之间计算出来的水平方向和垂直方向的位移,分别当成一张“图”,叠加在一起,变成一个可以输入到卷积网络里的东西。
这一步设计的关键在哪里?在于研究者没有让网络自己去“猜”运动信息是什么,而是先用一套成熟的传统算法把运动信息计算好、可视化好,直接喂给网络。网络不需要再从零学习“什么是运动”,它只需要学习“看到这种运动模式对应哪个动作类别”。
这就好比教一个新手厨师做菜,你可以让他从洗菜切菜开始全部自己摸索,也可以先把菜都切配好,直接教他怎么下锅炒。如果让网络自己从原始像素里学会计算光流,那基本上是在逼它重新发明轮子,数据量和训练难度都会陡增。而先把光流算好再喂给它,网络就可以把全部精力放在“识别动作模式”这个更本质的问题上。如果不这样做,极有可能网络要花大量参数和样本去学习一个本可以用几十年前的传统算法几行代码解决的问题,得不偿失。
论文里还有个细节值得说一下。研究者尝试了两种光流输入方式,一种是光学流叠加,另一种是双向光流,也就是同时看“未来往哪动”和“过去从哪来”的运动信息。结果发现双向光流效果更好一些,说明运动的“来龙”和“去脉”都对判断动作有帮助,不是只看单一方向就够了。
为什么要用两条流,而不是一条
这里就要回到那个反事实的问题:如果只用空间流,会发生什么?
论文里的实验数据说得很清楚,只用空间流(也就是只看单帧图像,不看运动信息),在 UCF-101 上的准确率是 72.6%。而把空间流和时间流结合起来之后,准确率跃升到 88.0%。
15.4 个百分点的差距,这就是“看得懂动作”和“只看得懂场景”之间的鸿沟。这也从数据上直接证明了,视频识别这件事,空间信息和时间信息缺一不可,单靠图像分类网络硬套是解决不了动作识别问题的。
有意思的是,单独只用时间流(只看光流,不看原始画面)的准确率是 83.7%,比单独空间流的 72.6% 还高不少。这说明在动作识别这件事上,运动信息本身的判别力,可能比静态画面信息更强。这某种程度上也印证了一个朴素的直觉:你要判断一个人在做什么,看他怎么动,往往比看他站在什么背景前面更靠得住。
论文里还给出了第一层卷积核的可视化图。看那张图你会发现,时间流网络学出来的卷积核,大多呈现出明显的方向性条纹结构,而不是空间流那种更接近边缘、颜色斑块的模式。这不是偶然,这说明网络自己“发现”了光流场里最重要的信息就是运动的方向性,它学到的滤波器天然就在响应“往哪个方向动”这件事,完全没有人为干预,是数据本身塑造出来的结构。
两条流怎么融合起来
两条流各自训练完,分别给出一个对动作类别的概率预测,最后怎么合成一个最终判断,这也是论文里讨论的一个点。
最简单的办法是直接平均两条流的预测分数,论文里发现这样简单平均效果已经不错了。他们也尝试了用一个额外的支持向量机去学习两条流应该按什么比例加权融合,效果会再好一点,但差距不算特别大。这说明这套双流架构本身的设计已经把大部分工作做好了,融合方式只是最后的锦上添花。
这里其实藏着一个更普遍的设计哲学,叫“分而治之再合并”。你把一个复杂问题拆解成两个相对简单、性质不同的子问题,分别用最适合的方式解决,最后再把答案拼起来。这跟一个团队做项目很像,如果让一个人既懂设计又懂编程还要懂运营,那这个人大概率什么都做得不精。但如果拆成三个专才分头干活,最后开个会把三份工作对齐,整体效率和质量往往更高。如果不拆,硬让一个网络既学空间又学时间,那网络的参数和注意力会被两种性质完全不同的信息拉扯,谁都学不精。
迁移学习也帮了大忙
还有一个不太起眼但很重要的细节:数据。
动作识别的数据集在当时普遍偏小,UCF-101 只有一万多段视频,训练一个深度网络很容易过拟合。研究者的解法是用一个更大规模的视频数据集 Sports-1M 先预训练网络,再迁移到目标数据集上微调。
> 迁移学习(Transfer learning):先在数据量更大的相关任务上训练模型,再把学到的参数迁移到目标任务上继续训练,用来缓解目标任务数据不足的问题。
这个思路你可以类比成学外语。如果你已经精通法语,再去学西班牙语会明显快很多,因为很多语法结构、词根规律是相通的,你不需要从零开始建立“语言”这个概念,只需要在已有的基础上做调整。网络也是一样,先在大规模体育视频上学会“什么样的画面变化对应什么类型的运动”,再拿到 UCF-101 上做针对性微调,能省下大量本来需要靠海量标注数据才能学到的东西。
实验证明这一步确实关键,预训练之后再微调,比直接在小数据集上从零训练效果好得多。这也从侧面说明,深度学习之前在视频任务上打不过手工特征,不完全是网络结构本身的问题,数据量不足也是一个被低估的瓶颈。
结果说话:这次深度学习真的赢了
最后来看最关键的数字。
| 方法 | UCF-101 准确率 |
| 手工特征(improved trajectories) | 87.9% |
| 深度学习此前最好方法 | 65.4% |
| 仅空间流 | 72.6% |
| 仅时间流 | 83.7% |
| **双流网络融合** | **88.0%** |
双流网络最终以 88.0% 的成绩,第一次让深度学习方法超过了当时最强的手工特征方法。这个提升看起来只有零点几个百分点,但它的意义不在于赢了多少,而在于赢了。这是深度学习在视频动作识别这个子领域第一次证明自己能打,在此之前整个领域都笃定手工设计的轨迹特征才是唯一靠谱的路线。这次胜利的分量,不亚于 AlexNet 在图像分类上的那次突破,只是知名度小得多。
后来的故事
这篇论文之后,双流架构几乎成了视频理解领域接下来好几年的标准范式。
2015 年,Facebook 的研究者提出了 C3D,尝试用三维卷积直接对时空信息一起建模,不再拆成两条流,而是让一个网络同时消化空间和时间维度。这是对双流思路的一次正面挑战,试图证明网络也可以自己学会处理时空信息,不需要依赖预先计算好的光流。
2016 年,Feichtenhofer、Pulgar-Vidal 和 Zisserman(是的,还是这个组)又发表了 Temporal Segment Networks 相关的工作,把双流网络进一步扩展成对整段视频稀疏采样多个片段分别处理再融合,解决了原始双流网络只能看局部短时间窗口、看不到长时间动作模式的问题。
再往后,2017 年 Carreira 和 Zisserman(还是 Zisserman)提出了 I3D,把双流网络里的二维卷积全部换成三维卷积,同时保留了双流结构,并且引入了一个更大规模的视频数据集 Kinetics 做预训练,把动作识别的准确率又往上推了一大截。这基本上是双流思路和三维卷积思路的一次融合收官。
从时间线上看,这篇 2014 年的双流网络论文,像是打开了一道闸门,后面几年整个视频理解领域的工作,基本都在“要不要用光流”“要不要用三维卷积”“怎么处理长时间依赖”这几个问题上反复打磨,而这几个问题的雏形,早在这篇论文里就已经被提出来了。
写在后面
读这篇论文最触动我的一点,是研究者没有执着于“让深度学习自己学会一切”这种纯粹主义。他们大方地承认,传统的光流算法在提取运动信息这件事上已经做得很好了,直接拿来用就行,没必要非要网络从像素堆里重新发明一遍。这种务实态度,在深度学习历史上其实不算主流,后来的趋势是越来越端到端,越来越排斥手工设计的中间步骤。但双流网络提醒我们,端到端不是唯一正确答案,有时候把传统方法和深度学习拼接起来,反而是当时数据和算力条件下最优的解法。
另一个让我意外的细节是,单独的时间流准确率居然比空间流还高。这多少说明,在“认出一个动作”这件事上,运动本身携带的信息量,可能比我们直觉里认为的场景和外观信息更重要。这跟人类认知动作的方式,似乎也有种隐约的呼应。
如果光流这个中间步骤后来被三维卷积完全取代,那这篇论文留下的最持久的遗产,到底是双流这个具体架构,还是“空间和时间信息值得分开对待”这个更抽象的洞察?
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别模型,用两个独立的卷积网络分别处理单帧图像(空间流)和光流场(时间流),再融合两者的预测结果,第一次让深度学习方法在 UCF-101 数据集上超越了当时最强的手工特征方法。
Q2:双流网络为什么要分成空间流和时间流两部分?
A:因为视频识别既需要看懂画面里有什么(空间信息),又需要看懂物体怎么运动(时间信息),一个网络同时学两种性质不同的信息效果不好。实验显示只用空间流准确率只有72.6%,只用时间流是83.7%,两者融合后能达到88.0%,说明拆开处理再融合效果更好。
Q3:双流网络对后来的研究有什么影响?
A:影响很大,2015年的C3D尝试用三维卷积直接建模时空信息,2016年的Temporal Segment Networks解决了双流网络看不到长时间动作模式的问题,2017年的I3D把双流结构和三维卷积结合并引入Kinetics大数据集,进一步提升了准确率。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
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.