2014 年秋天,如果你去问计算机视觉领域的研究者一个问题:深度学习能不能识别视频里的动作,大概会得到一个略显尴尬的答案。
不是不能,是打不过。
(相关资料图)
那一年深度学习已经在图片识别上创造了奇迹。AlexNet 在 2012 年横空出世,把图像分类的错误率direct砍掉一大截,整个计算机视觉圈子都在往神经网络转向。可是一旦把静止的图片换成会动的视频,神经网络就开始水土不服。当时最好的深度学习方法,在权威的动作识别数据集 UCF-101 上,准确率只能做到 44% 左右。
而同期最好的手工特征方法,一个叫做**密集轨迹**
密集轨迹*:一种不用神经网络的传统方法,通过跟踪视频里密集分布的点随时间的运动轨迹,手工设计特征来描述动作
的技术,能做到 87.9%。
差了 40 多个百分点。这不是接近,这是碾压。要知道图片分类上深度学习已经把传统方法甩出几条街了,视频动作识别这边却完全反过来,老办法把新方法按在地上摩擦。这事儿在当时相当反常,因为按理说,深度学习号称"自动学特征,不需要人工设计",视频应该是它的主场才对,毕竟视频信息更丰富。可结果恰恰相反。
这篇论文,就是要回答这个让人挠头的问题:深度学习到底哪里出了问题,能不能把它掰回来,追上甚至超过手工特征。
核心问题:视频比图片难在哪
先说清楚一件事,视频识别到底比图片识别多了什么麻烦。
一张图片,你能看到的是空间信息,颜色、形状、纹理、物体之间的相对位置。一段视频,除了这些,还多了一个维度,时间。一个人张开双臂不动是什么姿势,你分不出是要拥抱还是要跳舞,可如果你看到手臂随着时间在挥动,这个动作的意义立刻就清楚了。
问题是,神经网络原本是为静态图片设计的,它擅长学"这张图里有什么",却不擅长学"这段时间里发生了什么变化"。
当时研究者尝试过一些办法,比如把视频的每一帧单独扔进卷积网络,再把结果做个平均。这种做法基本等于把视频拆成一堆照片,分别识别,再"投票"决定是什么动作。听起来合理,但实际效果很差,因为它完全丢掉了运动信息,一个人挥手和一个人举手不动,如果只看单帧,画面可能长得几乎一样。
这就好比你想知道一个人是在走路还是站着不动,却只被允许看一张他的照片。哪怕给你十张不同瞬间的照片,你分别看,也很难判断这十张照片串起来到底是走路还是原地踏步的十个瞬间。如果不把这些照片按时间顺序串起来分析,运动这个核心信息就丢了。
密集轨迹为什么能赢,恰恰是因为它是专门设计来捕捉运动轨迹的,它跟踪画面里的点如何随时间移动,这是它的看家本领。深度学习的卷积网络,原本的设计初衷压根不是干这个的。
论文的作者,Karen Simonyan 和 Andrew Zisserman,两人来自牛津大学,同一个研究组几个月后发表了大名鼎鼎的 VGGNet,那是图片分类领域另一个里程碑。这个背景值得一提,因为说明他们对卷积网络的图片识别能力有非常深的理解,这次他们要解决的是,怎么让卷积网络也理解"动"这件事。
方法一:把网络拆成两条腿走路
他们的核心想法说出来其实很朴素:既然一个网络同时学空间信息和时间信息有困难,那就别让它一个人扛,拆成两个网络,一个专门看空间,一个专门看时间,最后把两边的判断结果加权合并。
这就是这篇论文最核心的贡献,叫做**双流网络**
双流网络*:Two-Stream Network,把视频识别任务拆成两个独立的卷积神经网络分别处理,一个处理空间信息,一个处理时间运动信息,最后融合两者的预测结果
第一条流叫**空间流**
空间流*:Spatial stream,输入是视频里单独的一帧图像,负责识别画面中的物体、场景、人物姿态等静态外观信息
它的输入很简单,就是视频里随便抽出来的一张静止画面。这一路负责回答"画面里有什么",比如识别出这是个游泳池,画面里有个人,这个人正处在某个姿势。这一部分其实和普通的图片分类网络没什么本质区别,可以直接借用在 ImageNet 上训练好的经验。
第二条流叫**时间流**
时间流*:Temporal stream,输入不是原始图像,而是光流场,负责专门捕捉画面中物体运动的方向和速度信息
这条流的输入不是图片,而是**光流**
光流*:Optical flow,描述画面中每个像素点从上一帧到下一帧移动方向和速度的向量场,本质上是一张记录"运动"而非"外观"的图
光流场这个东西说白了,就是把"什么在动、往哪动、动多快"这件事用一张图表示出来。原始视频帧里有颜色、纹理这些空间信息,而光流场故意把这些都剔除了,只留下运动的痕迹。这样一来,时间流这个网络就不用再费劲去区分"哪些是背景的颜色变化,哪些是真正的运动",它拿到的输入已经是纯粹的运动信息了。
这个设计思路其实很像医院里做检查会分科室。你去医院,不会指望一个全科医生同时精通验血和拍 CT,医院会把你的血样送到检验科,把你的片子送到放射科,两边的专家分别给出诊断,最后主治医生综合两边的报告下判断。如果硬要一个医生同时兼顾抽血化验和读片子,大概率两头都做不精。双流网络就是把"看外观"和"看运动"这两件事,分给两个专精的网络分别处理,而不是逼一个网络既要认物体又要辨运动。
如果不这么拆会怎样呢,前面已经提到了答案,准确率会掉到 40% 多。这不是理论推测,是实际测出来的数字。
方法二:光流怎么喂给网络吃
光流这个东西不是一张普通的图片,它每个像素点存的是运动的水平方向和垂直方向的数值,相当于两张图叠在一起,一张记录左右移动的速度,一张记录上下移动的速度。
论文里做了个很关键的设计决定,不是只用两帧之间算出来的一次光流,而是把连续多帧的光流场堆叠起来,一起喂给网络。
具体来说,他们把连续 L 帧(论文里测试了不同的 L,最终发现 10 帧左右效果比较好)计算出来的光流场堆叠成一个多通道的输入,相当于把一个短时间窗口内的运动轨迹信息都塞进去,而不是只看某一个瞬间的运动快照。
这个道理其实和你看一个人跳舞类似。如果只给你一帧的运动信息,你可能只知道这一瞬间他的手往左边挥,但你不知道这是挥舞的开始、中间还是结尾,更不知道这是不是一个完整的舞蹈动作的一部分。可如果给你连续十帧的运动轨迹叠在一起,你就能看出这是一个完整的挥手弧线,还是仅仅是抬手准备做别的动作。单独一帧的光流信息太单薄,判断不出动作的完整走势,堆叠多帧才能让网络看到一段"运动的历史"。
论文里还专门比较了两种堆叠光流的方式,一种叫光流堆叠,直接把每帧的位移向量场叠起来,另一种叫轨迹堆叠,沿着某个点的运动轨迹去采样光流,而不是固定在同一个像素位置采样。实验证明简单的光流堆叠效果已经足够好,轨迹堆叠没有带来明显提升,这也算是给后续研究省了一道弯路,不用非得走更复杂的轨迹计算这条路。
方法三:数据不够怎么办
这里遇到一个很现实的麻烦。训练一个深度神经网络需要大量数据,而当时的视频动作识别数据集,比如 UCF-101,只有 13000 多个视频片段,这个规模跟动辄上百万张图片的 ImageNet 相比小得可怜。
数据不够,网络很容易死记硬背训练集里的样本,一到没见过的新视频就翻车,这就是**过拟合**
过拟合*:模型在训练数据上表现很好,但在没见过的新数据上表现很差,说明模型只是记住了训练样本,而没有学到真正通用的规律
作者用了两招来对付这个问题。
第一招是**多任务学习**
多任务学习*:Multi-task learning,让同一个网络同时在多个不同的数据集上训练,共享底层特征,只在最后的分类层区分不同任务
他们把两个不同的数据集,UCF-101 和 HMDB-51,放在一起训练同一个网络,网络的大部分层是共享的,只有最后做分类判断的那一层是分开的,分别针对两个数据集的类别标签。这样一来,原本各自数据量都不大的两个数据集,相当于合并成了一个更大的训练资源池,网络能学到更通用、更不容易过拟合的特征。
第二招是直接借用在 ImageNet 上预训练好的模型参数来初始化空间流网络。这一步其实是站在了图片识别领域已经趟出来的路上,ImageNet 上已经有海量标注数据训练出的通用视觉特征,拿过来做个迁移,能省掉大量从零开始学习的成本。
这两招放在一起,有点像你学一门新语言时的两种策略。一种是同时报几个语言班,虽然学的是不同语言,但语法逻辑、语言学习方法这些底层能力是共通的,多个班一起学反而互相促进。另一种是如果你已经会一门语言,学第二门相近的语言时明显会更快,因为你不是从零开始建立"语言"这个概念,而是在已有的语言直觉上做迁移。如果没有这两招,单靠 UCF-101 一万多个视频从零训练一个深度网络,大概率会因为数据太少而学得很差。
结果:深度学习第一次赢了
说了这么多设计,最后看结果。
在 UCF-101 数据集上,双流网络最终做到了 88% 的准确率,超过了此前最好的手工特征方法密集轨迹的 87.9%。
|方法|UCF-101 准确率|
|单帧空间流网络(仅图像)|72.6%|
|单独时间流网络(仅光流)|83.7%|
|**双流网络融合**|**88.0%**|
|密集轨迹(手工特征,此前最优)|87.9%|
这张表格里最值得琢磨的,是单独用空间流的效果,只有 72.6%,而加上时间流之后跳到 88%,涨了 15 个百分点。这说明运动信息对动作识别是决定性的,单看外观是远远不够的,一个人做深蹲和站立不动,画面里的静态姿势可能有相似的瞬间,但运动轨迹一目了然地不同。
这里也能理解一开始那 20 个百分点的差距是什么概念。20 个百分点,意味着每 5 个动作里,原来的深度学习方法就要比手工特征多认错 1 个。而双流网络把这个差距不仅补上,还反超了将近半个百分点。
这一年是 2014 年,深度学习第一次在视频动作识别上打赢了手工特征。这句话放在当时的分量,不亚于两年前 AlexNet 在图片分类上的横空出世。区别是这次深度学习没有靠碾压式的优势获胜,而是勉强追平又反超,过程也更曲折,说明视频理解这个问题确实比图片分类更难啃。
后来发生了什么
双流网络这个思路一开姑就被后续研究广泛采纳和扩展。
2015 年,Wang 等人发表了 **TDD**
TDD*:Trajectory-pooled Deep-convolutional Descriptor,把深度学习提取的特征和传统轨迹方法结合起来的方法
把深度网络提取的特征和传统的轨迹跟踪结合起来,进一步提升了准确率,证明手工方法和深度方法并非完全对立,可以互相借力。
2016 年,Feichtenhofer 等人在 CVPR 上发表了改进版,专门研究了空间流和时间流应该在网络的哪一层进行融合最合适,而不是像原始双流网络那样只在最后的分类阶段简单相加,这个改动让特征融合更充分,进一步提升了识别准确率。
再往后,2017 年 Carreira 和 Zisserman(注意,还是同一个 Zisserman)发表了 **I3D**
I3D*:Inflated 3D ConvNet,把双流网络里的二维卷积核直接"膨胀"成三维卷积核,让网络能直接从原始视频片段里学习时空特征,不再需要单独计算光流
这个方法把双流网络里的二维卷积操作直接扩展成三维,让网络能够直接处理视频帧的堆叠,不用再依赖单独计算好的光流场作为中间步骤,这也成为后续很长一段时间视频理解领域的标准做法之一。
从这个演变过程能看出一条清晰的脉络,双流网络提出了"空间和时间要分开处理再融合"这个核心思想,后续工作不断在这个骨架上做优化,是提前融合还是延后融合,是用光流还是直接学三维时空特征,但核心的两条腿走路的框架思路一直被沿用和致敬。
写在后面
这篇论文里最让我意外的一点,是空间流单独跑出来只有 72.6%,这个数字比很多人的直觉预期低。你会本能觉得,一张图片里信息那么丰富,识别个动作应该不难,但事实是静态画面对动作这件事的解释力真的有限,运动信息补上之后一下涨了 15 个点,这个反差比论文摘要里的最终成绩更有说服力。
另一个值得琢磨的细节是,论文测试过更复杂的轨迹堆叠方式,结果发现效果和简单堆叠光流差不多,复杂方案没赢。这提醒我一件事,很多时候研究者会本能地觉得更复杂的方法应该更好,但现实经常打脸,简单粗暴的方案跑赢精巧设计的情况一点都不少见。
光流这个中间表示后来被 I3D 这类方法绕过去了,直接让网络自己从像素学时空特征。这算不算是说光流这个"人工设计的中间步骤"终究只是个过渡方案?如果算,那双流网络的历史位置就更清晰了,它是深度学习完全吃透视频理解之前的一个关键垫脚石。

















































































营业执照公示信息