![]()
2014年,如果你去问一个做计算机视觉的研究者,深度学习能不能识别视频里的人在做什么动作,大概率会得到一个谨慎的摇头。
那一年,图像识别领域已经被深度学习搅得天翻地覆。AlexNet 在 2012 年横空出世,用卷积神经网络把图像分类的错误率打到了传统方法望尘莫及的地步。但视频识别是另一个战场,而且是一个深度学习一直打不赢的战场。
当时最强的视频动作识别方法,叫做密集轨迹
密集轨迹*:一种手工设计的特征提取方法,通过追踪视频画面里密集分布的点,沿着它们的运动轨迹提取特征,再用传统机器学习方法分类。
密集轨迹在标准数据集上能做到85%以上的准确率,而所有尝试用深度学习硬刚这个任务的团队,成绩都不太好看,普遍要落后好几个百分点。这在当时是一件很打脸的事情,深度学习明明在图像上已经证明了自己,怎么一到视频就水土不服了。
这篇论文的两位作者,Karen Simonyan 和 Andrew Zisserman,决定要打破这个局面。有意思的是,这两人几个月后又发了另一篇论文,叫 VGGNet,后来成为图像识别领域的经典模型之一。也就是说,他们在同一个时间段里,一边琢磨怎么让深度学习看懂视频里的动作,一边琢磨怎么把图像分类网络做得更深更准。这两条线后来都成了各自领域绕不开的参考点。
视频识别难在哪
要理解这篇论文的巧妙之处,得先搞清楚视频识别到底比图像识别难在哪里。
一张图片,你可以直接把它喂给卷积神经网络,让网络自己去学习哪些像素组合代表猫,哪些代表狗。但一段视频,是一连串图片的叠加,而动作识别真正要抓住的东西,恰恰是图片之间的变化,而不是某一帧长什么样。
举个例子,一张"人站着"的照片和一张"人刚跳起来"的照片,单看某一帧,可能长得几乎一样,你根本看不出这个人是在原地不动还是正在做一个大动作。真正暴露动作信息的,是这些帧连起来之后,身体各部位是怎么移动的。
这就好比你要判断一个人是不是在跑步,只给你看他某一个瞬间的定格照片,你可能连他是在跑步还是被绊了一下摔倒都分不清。但如果给你连续几张照片,看到他的腿一直在交替前后摆动,你立刻就明白了。静态画面藏不住动作的秘密,动作的秘密藏在变化里。
问题是,当时的卷积神经网络天生就是为处理静态图片设计的,它擅长找空间中的图案,却没有专门的机制去捕捉时间维度上的变化。直接把一堆视频帧堆起来扔进网络,网络确实能学到一点时序信息,但效果并不理想,这也是深度学习在视频任务上迟迟打不过密集轨迹的重要原因。
两条流,一明一暗
这篇论文的核心思路,叫做双流网络
双流网络*:同时用两个独立的卷积神经网络处理视频,一个专门看画面的空间内容,一个专门看运动信息,最后把两者的判断结果融合起来。
具体来说,第一条网络叫空间流,它的输入就是普通的视频帧,一张一张的RGB图片,负责识别画面里有什么物体,什么场景,比如网球场、游泳池、乐器,这些信息能帮助判断这是什么类型的动作。
第二条网络叫时间流,它的输入不是原始画面,而是光流场
光流场*:一种表示画面中每个像素点在相邻两帧之间移动方向和速度的图像,本质上是把"运动"这件事直接可视化成一张图。
光流场长什么样?你可以理解成,原本一张彩色照片记录的是"这里有什么颜色",而光流场记录的是"这一点在下一瞬间往哪个方向动,动了多快"。如果一个人在挥手,光流场上手臂那块区域就会显示出明显的方向性色块,而背景静止的部分几乎不会有任何信号。
这两条网络各自训练,各自打分,最后把两个网络给出的分类概率加权平均,或者用一个支持向量机把两路结果融合起来,得出最终判断。
这个设计的巧妙之处在于,它把一个复杂的问题拆成了两个相对简单的问题。空间流只管认物体认场景,时间流只管认动作方向,两者互不干扰,各自把自己的活干到极致,最后再合作。
这就像一支球队里,你不会指望一个人同时踢好前锋和守好后卫,而是让专门的前锋去抓机会,专门的后卫去防守,教练最后统筹全局定战术。如果硬要塞一个全能选手去干两份工作,大概率两头都做不精。双流网络就是把"认场景"和"认动作"这两份工作分给了两个专才,而不是让一个网络又要处理静态外观又要处理动态变化。
如果不这样拆分会发生什么?论文里做了对照实验,只用空间流单独跑,在 UCF-101 数据集上的准确率是72.6%,离密集轨迹的85%还有十几个点的差距。这说明单靠画面内容识别动作,天花板明显偏低,因为很多动作的关键信息根本不在"画面里有什么",而在"东西怎么动"。
UCF-101*:一个包含101类人体动作的视频数据集,是当时评估动作识别算法的标准测试集之一。
光流怎么喂给网络
时间流网络具体怎么处理光流场,这里有一个值得展开的细节。
光流场本身是逐帧计算的,也就是说相邻两帧之间会产生一张光流图,分别记录水平方向和垂直方向的运动信息。研究者没有只用单独一对帧的光流,而是把连续多帧,比如10帧,的光流图叠在一起,作为时间流网络的输入。
为什么要叠这么多帧?因为单独一对帧的运动信息太单薄,可能只是瞬间的抖动或者噪声,而多帧叠加能捕捉到一个更完整的运动模式,比如挥拍这个动作,可能横跨十几帧才能看出完整的挥动轨迹。
这就好比你要判断一个人写字是不是写得工整,只看他笔尖某一毫秒的位置根本看不出什么,你得看他这一笔从起笔到收笔的完整轨迹,才能判断这个字写得怎么样。光流叠加的道理是一样的,单帧看不出动作的形态,得把时间窗口拉长一点,动作的模式才会显现出来。
论文还专门比较了两种光流表示方式,一种是常规的光流,一种是去掉了摄像机自身移动影响的光流,后者被称为去均值光流。因为很多视频是手持拍摄或者镜头本身在移动,如果不做处理,整个画面看起来都在"动",这会淹没掉真正有意义的人体动作信号。实验证明,做了摄像机运动补偿之后,识别准确率确实有提升。
融合之后,数字说话
单独看空间流或者时间流,都打不过密集轝迹,但把两者融合起来会发生什么?
论文在两个标准数据集上做了测试,UCF-101 和 HMDB-51
HMDB-51*:另一个动作识别标准数据集,包含51类人体动作,规模比 UCF-101 小,但因为视频质量参差不齐,难度更高。
结果是,双流网络融合之后,在 UCF-101 上达到了88.0%的准确率,超过了密集轨迹的85.9%。在 HMDB-51 上也拿到了59.4%,同样超过了此前的手工特征方法。
| 方法 | UCF-101 准确率 | HMDB-51 准确率 |
| 密集轨迹(手工特征) | 85.9% | 57.2% |
| 仅空间流 | 72.6% | 40.5% |
| 仅时间流 | 81.0% | 46.6% |
| **双流网络融合** | **88.0%** | **59.4%** |
这张表格里最值得琢磨的是,时间流单独跑就已经能到81%,比空间流的72.6%高出将近9个点。这说明在动作识别这件事上,运动信息本身比画面内容更关键。你去猜一个人在做什么动作,光看背景和物体给你的线索,远不如直接看他身体怎么动来得准。
而两者融合之后又比单独的时间流高出7个点,说明画面内容不是没用,而是提供了运动信息之外的补充信息,比如场景和道具能帮你排除一些不可能的动作类别。两条流各有各的价值,合在一起才是最优解。
这是深度学习第一次在视频动作识别这个任务上,实打实地超过了统治多年的手工特征方法。放在2014年的背景下看,这句话的分量不轻,图像识别领域深度学习证明自己用了两年,视频识别领域这场翻身仗打得同样不容易。
这个思路后来走向了哪里
双流网络提出之后,这个框架被后续大量工作继续打磨。
2016年,Wang 等人提出了时序分段网络
时序分段网络*:一种改进的双流网络结构,把整段视频切成若干片段,分别提取特征再汇总,解决了原始双流网络只能看短时间片段、抓不住长时间动作模式的问题。
原始双流网络处理的时间窗口比较短,大概只能看几帧到十几帧的信息,对于一些持续时间较长、前后关联性强的复杂动作,捕捉能力有限。时序分段网络把整段视频拆成几段,每段单独跑一次双流网络,再把结果汇总,这样就能兼顾长时间跨度的动作模式,准确率进一步提升到了94%以上的水平。
2017年,Carreira 和 Zisserman,是的,还是 Zisserman,提出了 I3D 网络
I3D网络*:把双流网络里的二维卷积换成三维卷积,让网络直接从原始视频里学习时空特征,不再需要单独计算光流,同时借助大规模视频数据集 Kinetics 进行预训练。
I3D 的思路是,既然光流本身就是为了让网络感知运动而人工设计的一种输入,那能不能让网络直接从原始视频学会捕捉运动,而不需要预先计算光流这一步。三维卷积可以同时在空间和时间两个维度上滑动卷积核,理论上能够端到端地学到时空特征。加上 Kinetics 这个规模远超之前数据集的视频数据集加持,I3D 把准确率又往上推了一大截。
这两个后续工作说明,双流网络提出的"空间信息和运动信息要分开处理或者至少要被网络充分感知"这个核心洞察,一直被后来者继承和改造,只是具体的实现方式在不断进化,从两条独立网络,到分段处理,再到三维卷积一体化建模。
写在后面
读这篇论文时,最让我意外的一点是,时间流单独跑的成绩比空间流高出接近9个百分点。直觉上你可能会觉得,画面里的场景、物体、人物外观这些信息应该是识别动作的主力,毕竟一提到"打网球"你脑子里浮现的先是网球场和球拍。但数据摆在那里,运动本身的信息量远远超过了静态画面能提供的线索。这提醒我一个更普遍的道理,有时候我们直觉上认为重要的信息,未必是解决问题真正的关键,得靠拆解实验去验证,而不是靠拍脑袋。
另一个让我反复想的细节是,光流场这个中间表示本身就是一种"手工设计"的信息压缩方式,双流网络虽然用了深度学习去处理光流,但光流的计算过程本身依然是传统算法。这其实是一个挺微妙的混合方案,深度学习负责"理解",传统算法负责"预处理"。后来 I3D 想要把这一步也交给网络自己学,某种程度上是深度学习进一步"吞并"传统流程的又一个例子,这个趋势在其他领域也反复出现,从语音识别到自然语言处理,都是深度学习一步步把人工设计的特征提取环节替换成端到端学习。
如果双流网络提出的时候就有现在这样规模的视频数据集和算力,这个思路会不会一步跳到 I3D 那种端到端建模,而不需要中间先经过光流这一站?这个问题留给历史,也留给继续琢磨这个方向的人。
Q&A
Q1:双流网络是什么?
A:双流网络是2014年提出的一种视频动作识别方法,用两个独立的卷积神经网络分别处理画面内容和运动信息,再把两者的判断结果融合,是深度学习首次在视频动作识别任务上超过手工特征方法的方案。
Q2:双流网络为什么要分成空间流和时间流两条网络?
A:因为动作识别既需要认出画面里的场景物体,也需要捕捉身体运动的方向和轨迹,这两类信息性质不同,分开处理让每个网络专注做好一件事,融合后效果比单一网络要好很多。
Q3:双流网络之后有哪些改进方法?
A:2016年的时序分段网络解决了双流网络只能看短时间片段的问题,2017年的I3D网络用三维卷积直接从原始视频学习时空特征,不再依赖预先计算的光流,两者都在双流网络的基础上进一步提升了准确率。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
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.