用两只眼睛看视频:当深度学习第一次学会了“动作“
2014年之前,如果你问计算机视觉领域的研究者一个问题,深度学习能不能看懂视频里的动作,很多人会摇头。
不是因为没人试过。卷积神经网络在静态图片识别上已经打得火热,AlexNet 在 2012 年横空出世,把 ImageNet 图片分类的错误率拉低了一大截,整个领域都在欢呼深度学习的时代到来了。可一旦把图片换成视频,事情就变得诡异起来:那些在图片上大杀四方的网络架构,一放到视频动作识别任务上,就集体哑火了。
最好的深度学习方法,在 UCF-101 这个动作识别数据集上,准确率只能做到 65% 左右。而同期最好的手工特征方法,一个叫做"密集轨迹"的老派技术,能做到 87.9%。
**这是整整 20 多个百分点的差距。**
意味着什么?意味着每识别 5 个动作,深度学习方法就要比手工特征多认错 1 个以上。这不是小差距,这是量级上的落后。一个被认为代表未来的技术,被一个基于人工设计规则的"老古董"按在地上摩擦了两年。这件事在当时相当反直觉,毕竟深度学习刚刚证明了自己在图片上的统治力,没人预料到换个维度就全面崩盘。
这篇论文的作者,Karen Simonyan 和 Andrew Zisserman,两人来自牛津大学,就是要来解决这个尴尬的问题。有意思的是,这两位几个月后又发表了另一篇论文,叫 VGGNet,后来成为整个视觉领域最常用的骨干网络之一。也就是说,他们在同一段时间里,一边琐磨着怎么让网络看懂静态图片的层次结构,一边琐磨着怎么让网络看懂视频里的运动。这两条线其实是同一群人脑子里同时转的两个问题。
问题出在哪:视频比图片多了一个维度,但这个维度很难学
先说清楚这件事到底难在哪。
一张图片,本质上是一个空间信息的矩阵,猫的耳朵在哪,眼睛在哪,轮廓怎么走,这些空间关系是静态的、可以被卷积核一层一层抓取出来的。
视频不一样。视频是一堆图片按时间顺序排列,多出来的那个维度是时间,而时间维度里藏着的是运动信息,也就是动作本身。你要判断一个人在"挥手"还是"鼓掌",光看单独一帧图片经常看不出来,你需要看这个人的手在连续几帧里怎么移动的。
问题是,卷积神经网络天生擅长抓取空间结构,却不擅长直接从像素的时间变化里提炼出运动模式。之前的研究者尝试过很多办法,比如把视频的多帧图像直接堆叠起来喂给三维卷积网络,让网络自己去学习时空特征。听起来合理,但实际效果很差,因为直接从原始像素学习运动信息,对网络来说太难了,数据量又不够大,网络根本学不出稳定的运动模式。
> 密集轨迹(Dense Trajectories)*:一种手工设计的传统动作识别方法,通过跟踪视频里密集分布的点在连续帧之间的运动轨迹,并计算轨迹周围的方向梯度和光流特征,拼出一套描述动作的特征向量,是深度学习之前的主流方法。
而密集轨迹这类手工方法为什么强?因为它不需要网络自己去发现运动的存在,人已经提前把光流计算好了,直接告诉网络:看,这里的像素往这个方向移动了这么多。这是一种"作弊",但作弊得很聪明,直接绕开了最难的那一步。
Simonyan 和 Zisserman 的洞察就在这里。他们想,如果手工方法能靠光流赢,为什么不干脆把光流直接喂给神经网络,而不是逼着网络从零开始学习运动?
双流架构:让一个网络专心看"长什么样",另一个专心看"怎么动的"
这篇论文最核心的贡献,就是提出了一个叫"双流卷积网络"的架构。
> 双流卷积网络(Two-Stream Convolutional Networks)*:一种把视频动作识别拆分成两条独立处理路径的神经网络架构,一条处理静态画面(空间流),一条处理运动信息(时间流),最后把两者的判断结果融合起来。
具体来说,整个系统被拆成两个互相独立的卷积网络。
第一条叫空间流,直接吃视频里的单帧 RGB 图片,学习的是"这个场景长什么样",谁在场景里,背景是什么,物体的外观特征是什么。这条路径本质上跟普通的图片分类网络没什么区别,甚至可以直接借用在 ImageNet 上训练好的模型做迁移。
第二条叫时间流,输入不是原始图片,而是提前用传统算法计算好的光流场。
> 光流(Optical Flow)*:描述视频中每个像素点在连续两帧之间移动方向和速度的向量场,可以理解成给每个像素画一个箭头,指出它接下来往哪儿跑,跑多快。
时间流网络看到的不是"画面",而是一张张由无数箭头组成的运动图。人挥手的时候,手臂区域的箭头会朝一个方向密集地摆动,静止的背景箭头几乎为零。网络专心学习这些箭头的模式,就能捕捉到动作本身,而不被画面里到底是谁、穿什么衣服这些无关信息干扰。
两条网络各自独立训练,最后在预测阶段把两边给出的分类概率做加权平均,融合成最终结果。
这个设计思路,其实可以类比成侦探破案时的分工。假设你要判断一个人是不是在撬锁,你可以派两个侦探过去,一个盯着监控画面研究这个人的长相、穿着、周围环境,专门确认"这是什么人在什么地方";另一个侦探根本不看长相,只死死盯着这个人手部动作的轨迹曲线,判断这套动作是不是撬锁的手法。如果只派第一个侦探,他可能因为这人穿着体面、气质像居民就放松警惕,看漏了手上的猫腻。如果只派第二个侦探,他能看出动作可疑,但完全说不出这是谁、发生在哪。两个侦探各自专注一个维度,反而比一个侦探同时兼顾所有信息更靠谱。这正是双流架构的用意:把"是什么"和"怎么动"这两个天然不同性质的问题,彻底拆开处理,而不是硬塞给一个网络逼它同时学会两件事。
如果不拆开会怎样?论文里其实间接回答了这个问题,当时那些直接用三维卷积从原始像素学习时空特征的方法,效果远不如双流架构,因为一个网络同时兼顾外观识别和运动提取,任务耦合太重,训练难度陡增,而数据量又跟不上,学不出干净的运动特征。拆开之后,时间流网络的任务变得单纯,只处理光流场,不需要再操心背景纹理和物体外观,反而学得更好。
光流怎么喂给网络:多帧堆叠而不是单帧
时间流网络具体怎么处理光流,这里还有一个细节设计。
论文没有只用相邻两帧算出的一张光流图,而是把连续 L 帧(论文里取 L=10)计算出的光流场堆叠成一个多通道的输入,水平方向的位移和垂直方向的位移分别堆叠,形成一个信息更丰富的输入张量。
这样做的原因也不难理解。单独两帧之间的运动信息太单薄,很多动作,比如"打高尔夫球的挥杆",需要看一段连续的运动轨迹才能判断清楚,只看某一个瞬间的光流,信息量不够。堆叠多帧光流,相当于把一小段时间窗口内的运动全部打包塞给网络,让网络看到的是一段完整的运动轨迹,而不是一帧的运动快照。
这就像你想判断一个人是在打网球正手还是反手,只看他挥拍那一瞬间某个像素的移动方向可能判断不出来,但如果你能看到他从引拍到挥拍再到收拍这一整段连续动作的运动轨迹,答案就一目了然了。单帧光流就像只给你看一张动作快照,而堆叠多帧光流则是给你看一小段慢动作回放,信息密度完全不同。
论文里还比较了两种光流的表示方式,一种是常见的光学流,另一种考虑了摄像机本身运动的因素,做了运动补偿的版本,进一步把摄像机的整体位移剔除掉,让光流场更纯粹地反映场景里物体本身的运动,而不是被摄像机晃动干扰。实验证明,做了运动补偿之后,效果确实有提升。
训练数据不够怎么办:从图片数据集里"借"参数
深度学习最饿的就是数据,而当时的视频动作识别数据集,规模跟 ImageNet 这种上百万张图片的数据集相比,小得可怜。UCF-101 只有一万多个视频片段,网络很容易在这么小的数据上过拟合。
论文给出的解法,是让空间流网络直接用在 ImageNet 上预训练好的参数做初始化,再在视频数据上微调。这个操作现在看起来是常规操作,但在当时属于比较早期、也比较关键的迁移学习实践。
> 迁移学习(Transfer Learning)*:把一个模型在某个任务上学到的知识,迁移到另一个相关但数据量较小的任务上,从而减少对新任务大规模数据的依赖。
这个思路等于是说,既然静态图片里已经蕴含了大量关于物体外观、纹理、形状的通用知识,没必要每次都从零学起。空间流网络的任务本质上跟图片分类很像,直接借用现成的知识底子,再针对视频场景做少量调整就够了。
这就好比一个已经精通中文书法的人去学日文书法,他没必要从握毛笔的姿势开始重新学,笔锋的运笔、力道的控制这些底层功夫是通用的,只需要针对日文假名的特殊笔画结构做补充训练。如果非要从零开始,训练成本会高得多,效果反而未必更好。如果不用预训练,单靠视频数据从零训练空间流网络,论文的实验也证实了会明显过拟合,效果打折扣。
实验结果:双流联手,终于追平甚至反超手工特征
这套架构最终在几个标准数据集上做了验证。
UCF-101 数据集包含 101 类人体动作,比如骑马、拉小提琴、打篮球。HMDB-51 数据集包含 51 类动作,规模更小,难度更大。
下面是论文里报告的核心对比结果:
| 方法 | UCF-101 准确率 |
|---|---|
| 只用空间流(单帧RGB) | 72.6% |
| 只用时间流(光流) | 81.0% |
| 密集轨迹(手工特征,此前最强方法) | 87.9% |
| **双流网络融合(本文方法)** | **88.0%** |
只看空间流的结果,72.6%,说明单靠画面外观信息去判断动作,效果并不差,但远远不够。
单独看时间流,81.0%,比空间流高出接近 9 个百分点,这个数字本身就很说明问题:对于动作识别这个任务,运动信息比外观信息重要得多。这也印证了前面的判断,动作的本质就是"怎么动",不是"长什么样"。
而当两条流融合起来之后,准确率来到 88.0%,首次追平甚至略微超过了当时最强的手工特征方法密集轨迹的 87.9%。
**这是深度学习第一次在视频动作识别这个任务上,打赢了手工设计的特征方法。**
这个数字差距看起来只有 0.1%,好像不痛不痏,但它的历史意义完全不在于这 0.1%本身。它标志着一条路走通了:深度学习不是天生不适合处理视频,只是之前的做法没有找到正确的输入方式。一旦把光流这种运动信息用对了地方,深度学习立刻能够和精心打磨了好几年的手工特征掰手腕,甚至反超。这跟 2012 年 AlexNet 证明深度学习能在图片分类上碾压传统方法,在意义上是同一个级别的事件,只是发生在视频这个更难的战场上。
这篇论文之后发生了什么
双流网络提出之后,很快成为视频理解领域一个绕不开的基准框架,后续大量工作都是在这个骨架上做改进。
2015年,Feichtenhofer 等人发表的论文进一步研究了空间流和时间流之间应该在网络的哪一层进行融合,而不是简单地在最后输出层做加权平均,提出了更早、更深层次的特征融合方式,进一步提升了准确率。
2016年,Wang 等人提出了 Temporal Segment Networks(时序分段网络),针对双流网络只能处理短时间片段、无法建模长视频里跨越较长时间的动作模式这个短板做了改进,把一段长视频切成多个片段,分别跑双流网络再做整体聚合,让模型能理解跨越更长时间跨度的动作结构,这个方法后来在多个动作识别竞赛里拿到了很好的成绩。
之后随着计算资源的提升,三维卷积网络(比如 I3D)重新回到舞台中央,用更深的三维卷积直接从堆叠帧里学习时空特征,某种程度上算是把双流网络当年绕开的那条路,又重新打通了,因为数据规模和算力都不再是当年的瓶颈。但双流网络这种把"外观"和"运动"分开建模的思路,即便到了后续很多模型里,依然以各种形式被保留和借鉴。
写在后面
读这篇论文最触动的一点,是它提醒我一个容易被忽略的道理:深度学习的胜利,从来不是靠网络本身有多深有多复杂,很多时候靠的是给网络喂什么样的输入。空间流和时间流的网络结构其实相当朴素,跟同期的图片分类网络没有本质差别,真正起作用的是有人想清楚了,光流这种前人已经验证过有效的信息,完全可以直接喂给神经网络,不需要逼着网络从零发明轮子。
这让我想到一个不那么学术的类比,很多所谓的突破,不是因为找到了更聪明的大脑,而是有人换了一种喂它吃的东西。这篇论文没有解决的问题是,当运动模式变得极其复杂,比如多人协作、长时间跨度的动作序列,单纯的光流表示还够不够用,这个追问后来催生了整整一个方向的研究,也算是它留给后人最有价值的一道题。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是2014年由Simonyan和Zisserman提出的视频动作识别架构,把视频理解拆成两条独立路径,一条处理静态画面的空间流,一条处理运动信息的时间流,最后融合两者的判断结果。
Q2:双流网络的效果比传统手工特征方法好吗?
A:在UCF-101数据集上,双流网络融合后准确率达到88.0%,首次超过了当时最强的手工特征方法密集轨迹的87.9%,是深度学习第一次在视频动作识别任务上打赢手工方法。
Q3:为什么要把视频分成空间流和时间流两条路径处理?
A:因为静态外观和运动模式是两种性质完全不同的信息,硬塞给一个网络同时学习会导致任务耦合过重难以训练,拆开后时间流网络可以专注学习光流场中的运动模式,效果明显更好。