来源:市场资讯

(来源:科技行者)

打开网易新闻 查看精彩图片

2014年,一个叫Karen Simonyan的研究者和他的同事Andrew Zisserman,在整理实验数据的时候发现了一件让人挠头的事。

深度学习那两年已经把图像识别的世界搅得天翻地覆了。AlexNet横空出世,卷积神经网络在ImageNet上把传统方法打得毫无还手之力。可轮到视频动作识别的时候,事情却反过来了。用深度学习去认视频里的人在做什么动作,效果一直不如二十年前发展出来的手工特征方法。

这不是小差距。当时最好的深度学习方法,准确率停留在65%左右,而一种叫做"密集轨迹"的手工特征方法,能做到87%左右。

密集轨迹*:一种传统计算机视觉方法,通过追踪视频画面里密集分布的像素点在时间上的运动轨迹,再统计这些轨迹周围的纹理和运动特征,来判断视频里发生了什么动作。

二十多个百分点的差距,意味着什么。意味着每认5个动作,深度学习就要比手工方法多认错1个还不止。这在当时是个相当尴尬的事实:图像识别领域深度学习已经全面碾压,视频识别领域却迟迟攻不下来。

问题出在哪里。这篇论文的作者们意识到,大家一直在用错误的方式喂数据给神经网络

核心问题:网络到底该看什么

视频和图片最大的不同,是视频有时间维度,画面在动。

要让神经网络理解"动作",最直接的想法是把一段视频的很多帧,一帧一帧堆起来,直接扔给一个三维卷积网络,让它自己去学习哪些像素在动、怎么动。听起来很合理,神经网络不是最擅长自己发现规律的吗。

但实验结果很打脸。这种直接堆帧的方法,效果并不比手工方法好,甚至更差。原因慢慢浮现:直接学习原始像素的时序变化,对网络来说太难了。

这就好比让一个从没学过物理的人,盯着一段视频里晃动的树枝,猜风向和风速。树枝本身的形状、颜色、纹理全部混在画面里,风带来的运动信息被完全淹没在这些无关信息中。如果不先把"运动"这个信号单独提取出来,直接丢给一个新手去从头分析,他大概率会被树枝的颜色和形状带偏,而不是抓住真正重要的运动线索。

那有没有一种办法,能把"运动"这件事,提前用一种更直白的方式表达出来,让网络不用再费劲从像素堆里挖信息。

答案是光流。

光流*:描述视频中每个像素点从上一帧到下一帧移动方向和速度的一种表示方法,本质上是一张标注了运动方向和快慢的图。

光流场看起来就像一张箭头图,每个像素都有一个箭头,指向它在下一帧要移动的方向,箭头长短代表移动速度快慢。人挥手的时候,手臂区域的箭头会朝挥动方向密集排列;背景不动的地方,箭头几乎为零。

这篇论文的核心贡献,就是把这种运动信息,单独做成一路输入,喂给一个专门的神经网络。

双流结构:两个网络各管一半

论文提出的方法叫做双流卷积网络。

双流卷积网络*:由两个独立的卷积神经网络组成的识别系统,一个专门处理静态画面(空间流),一个专门处理运动信息(时间流),最后把两者的判断结果融合起来。

空间流那一路,输入是视频里的单张RGB图片,和普通的图像分类网络没什么区别,它负责识别画面里有什么物体、什么场景、什么人。比如画面里有一个游泳池,这一路网络大概就能猜到,这段视频很可能和"游泳"有关。

时间流那一路,输入不再是原始画面,而是提前算好的光流场,连续多帧的光流叠在一起,变成一个多通道的输入,专门喂给另一个结构类似的卷积网络。这一路网络看不到人长什么样、背景是什么颜色,它只看得到"什么东西在往哪个方向动、动得多快"。它负责专门捕捉动作本身的模式。

两路网络分别独立训练,最后在预测阶段把两个网络给出的分类概率做加权平均,谁的判断更有把握,权重就稍微偏向谁一点。

这个设计乍一听有点笨拙,为什么不干脆把光流和原始画面拼在一起,做成一个网络的输入,让它一次性学完。论文里其实也做过类似尝试,效果反而不如分开训练。原因大概是,画面信息和运动信息的统计规律差别很大,揉在一起会互相干扰,网络反而学得更糟。

这就像让一个人同时用左眼看颜色、右眼看形状,试图一步到位综合判断。听起来效率更高,但人脑处理颜色和形状本身走的是不同的神经通路,强行融合反而会造成信息混淆。倒不如让两个专门的模块各自把自己的活干好,最后再把结论汇总,分工反而比合并更清楚。

值得一提的是,这种"分开处理、最后融合"的设计思路,其实呼应了神经科学里一个经典的发现:人类和很多动物的视觉皮层里,确实存在两条相对独立的通路,一条处理物体是什么(what通路),一条处理物体在哪儿、怎么动(where/how通路)。论文作者在文中提到了这个灵感来源,这不是巧合,而是他们刻意向生物视觉系统借的一个思路。

光流怎么算,这也有讲究

光流场不是拍出来的,是算出来的。给定连续两帧画面,要计算出每个像素的运动方向和速度,这本身是计算机视觉里一个很成熟的老问题,有专门的经典算法。

论文里用的是一种叫做TVL1的光流估计算法,在把光流输入给网络之前,提前用这个算法把每一对相邻帧转换成光流图,再喂给时间流网络。

TVL1算法*:一种通过优化图像亮度一致性和运动平滑性来估计光流的经典算法,能在保持边缘清晰的同时给出较为稠密和准确的运动估计。

作者们还试验了几种不同的光流输入方式。有一种是直接用连续多帧的光流叠加,让网络看到一段时间内的运动趋势,而不只是相邻两帧那么短暂的一瞬。实验证明,叠加更多帧的光流,确实能提升识别效果,因为动作本身是有持续性的,挥手、跑步这些动作,光看一瞬间的运动是不够的,得看一小段时间内运动的走向。

另外还有个细节挺有意思。作者尝试了两种光流表示方式,一种是保留运动方向的正负信息(往左还是往右),另一种是去掉方向只保留运动幅度。实验发现保留方向信息效果更好。这说明网络确实是在利用方向这个维度做判断,而不只是简单地感知"这里有没有动"。

数据不够,借用图像识别的经验来凑

深度网络最缺的是数据。当时能用来做动作识别训练的视频数据集,规模都不算大,几千段视频,分不出几十个类别,这个规模对于训练一个从零开始的深度网络,远远不够。

如果直接拿这么小的数据集去训练一个参数量巨大的卷积网络,大概率会过拟合,网络记住了训练集里的细节,却在没见过的视频上表现很差。

论文借用了图像识别领域已经验证过的思路,用在ImageNet这种大规模图片数据集上预训练过的网络权重,拿来做空间流网络的初始化,再用相对较小的视频数据集去微调。

预训练*:先在一个大规模、任务相近的数据集上训练模型,让模型学到一些通用的特征表达能力,再迁移到目标任务上进行针对性训练的方法。

时间流网络因为输入是光流图,不是常规的RGB图片,不能直接套用ImageNet预训练的权重,但作者依然想办法借用了一部分初始化技巧,并结合数据增强手段,比如对训练样本做裁剪、翻转、抖动色彩,人为制造更多样化的训练样本,缓解数据不足的问题。

这套组合拳打下来,双流网络在两个当时主流的动作识别数据集UCF-101和HMDB-51上,都取得了当时最好的结果。

UCF-101*:一个包含101类人体动作的视频数据集,是当时评估动作识别算法的主流基准之一。

HMDB-51*:一个包含51类动作的视频数据集,视频来源更多样,难度普遍被认为高于UCF-101。

实验结果说了什么

论文里给出的核心对比数据大致如下:

| 方法 | UCF-101准确率 | HMDB-51准确率 |

| 仅空间流网络 | 约73.0% | 约40.5% |

| 仅时间流网络 | 约83.7% | 约54.6% |

| **双流融合网络** | **约88.0%** | **约59.4%** |

| 密集轨迹(手工特征) | 约87.9% | 约57.2% |

这张表格里最值得琢磨的,是仅空间流网络和仅时间流网络之间的差距。只看画面不看运动的网络,在UCF-101上只有73%左右,而专门看运动的时间流网络能到83.7%。这中间差了十个百分点,说明单纯识别画面里有什么物体,对判断动作类别帮助有限,真正决定性的信息藏在运动本身里面。

如果只用空间流会发生什么。答案已经写在数据里了,准确率从88%掉到73%左右,足足少了15个百分点。这个差距足够说明,把运动信息单独拎出来喂给网络这件事,不是锦上添花,而是决定成败的关键一步。

另一个值得注意的地方是,双流网络的最终结果,和当时最好的手工特征方法密集轨迹几乎打平,甚至略微超出。

这是深度学习在视频动作识别上第一次真正追平并小幅超越手工特征方法。放在2014年这个时间点上看,这个分量不比AlexNet当年横扫ImageNet小多少,只是知名度上没有那么出圈,因为视频识别这个子领域相对小众。但对于这个领域内部的研究者来说,这是一个信号:深度学习终于摸到了正确的输入方式,接下来该轮到它反超了。

后来的故事:这条路是怎么被继续走下去的

双流网络这个思路,后来被无数论文接着往前推。

2016年,林天翼等人提出的Temporal Segment Networks,简称TSN,在双流网络的基础上做了一个关键改动:不再只是从视频里随机抓一小段帧来训练,而是把整段视频均匀切成几段,从每一段里各抽一小部分,综合起来做判断。这样网络能看到整段视频的全局信息,而不只是某个局部片段,UCF-101上的准确率被进一步推高到94%以上。

TSN(时序分段网络)*:在双流网络基础上,通过对整段视频均匀分段采样,让网络综合利用视频全局时序信息的改进方法。

2017年,Carreira和Zisserman(没错,还是同一个Zisserman)提出了I3D网络,把双流网络里原本处理单张图片的二维卷积,直接扩展成三维卷积,让空间流网络本身也能直接处理一小段连续帧,而不是单张静止画面。这个改动配合当时新出的Kinetics大规模视频数据集,把整体识别性能又往上推了一大截。

I3D(膨胀三维卷积网络)*:将二维卷积网络的卷积核直接扩展为三维形式,使其能够同时处理空间和时间信息的动作识别网络结构。

这两个后续工作,都没有抛弃双流网络的核心思想,光流和画面信息分开处理、各自建模,只是在具体的网络结构和数据利用方式上做了升级。某种程度上,双流网络定义了这个领域接下来几年的研究范式,后来者是在这个框架里做加法,而不是推翻重来。

写在后面

读这篇论文最触动我的地方,是那个仅空间流和仅时间流之间十个百分点的差距。这个数字背后藏着一个挺反常识的结论:识别一个动作,画面里有什么东西反而不是最重要的,东西怎么动才是。这和人类直觉里"看图识别"的思路是相反的,我们平时形容一个动作,往往会先说场景,说人在哪、周围有什么,但对机器来说,场景信息带来的帮助远不如运动本身。

另外一个让我反复想的细节是,作者用了两种视觉皮层通路的类比来解释双流结构的设计,这不是纯粹的工程直觉,而是从生物视觉系统里借来的思路。深度学习这些年很多重要的结构设计,回头看都能在生物神经系统里找到某种原型,这件事本身挺值得琢磨。

这篇论文没有解决的问题是,光流本身是提前用传统算法算出来的,不是网络自己端到端学出来的。这意味着整个系统的运动感知能力,上限被光流算法的精度锁死了。后来的研究者一直在想办法让网络自己学会提取运动信息,不再依赖外部算好的光流,这条路走了很多年才慢慢趋近于成熟。

Q&A

Q1:双流卷积网络是什么?

A:一种视频动作识别方法,由两个独立的卷积神经网络组成,一个处理单张画面(空间流),一个处理光流运动信息(时间流),最后融合两者的判断结果,在2014年首次让深度学习在动作识别上追平并超越手工特征方法。

Q2:为什么不直接把视频帧堆起来喂给网络,而要专门算光流?

A:因为直接学习原始像素的时序变化对网络来说太难,运动信息会被画面里的颜色、纹理等无关信息淹没。实验证明,只用画面信息的空间流网络准确率比加入光流的时间流网络低了十个百分点以上,说明运动信息才是判断动作的关键。

Q3:双流网络之后有哪些改进工作?

A:2016年的TSN通过对整段视频分段采样提升了全局信息利用率,把准确率推高到94%以上;2017年的I3D把二维卷积扩展成三维卷积,让网络能直接处理连续帧,配合大规模数据集进一步提升了性能,两者都延续了双流网络运动与画面分开建模的核心思路。