2014年深度学习已经在图像识别上打得风生水起了。AlexNet横空出世才两年卷积神经网络在ImageNet上把传统方法按在地上摩擦准确率一路飙升。按理说这套打法拿到视频上应该也能横扫一切才对毕竟视频不就是一张张图片叠起来的吗。但事实很打脸。在动作识别这个领域深度学习整整两年没能打过一个叫密集轨迹的老派手工特征方法。不是差一点点是实打实地落后。当时最好的深度学习方法在UCF-101数据集上准确率大概是65%左右而手工特征方法能做到87%左右差了20多个百分点。20个百分点是什么概念。意味着每5个动作视频里深度学习就要比手工方法多认错1个。这在图像识别领域是不可想象的差距AlexNet当年横扫ImageNet靠的就是碾压级的优势怎么到了视频这里反而成了弟弟。这篇发表于2014年NeurIPS的论文题目叫《Two-Stream Convolutional Networks for Action Recognition in Videos》,作者是Karen Simonyan和Andrew Zisserman,来自牛津大学。这两个名字你可能觉得眼熟,没错,他们几个月后就发表了VGGNet,同一个实验室,同一个时间段的工作。这篇论文就是要回答一个问题深度学习到底能不能在视频动作识别上翻身。答案是能,而且翻身的方式很巧妙。视频到底难在哪先说说这件事为什么难。图片识别很直观一张猫的照片,网络学会识别耳朵、胡须、毛发纹理这些视觉特征就够了。但视频不一样,视频的核心信息是动作,动作是随时间展开的,一个人挥手和一个人举手不动,单看某一帧图像可能长得几乎一样,区别只在于接下来发生了什么。如果直接把视频的每一帧当成独立图片扔给卷积神经网络,网络确实能学到一些东西,比如场景、物体、颜色这些静态信息。但动作本身的动态特征,网络学不到,因为网络看到的永远是孤立的静态画面,不知道这些画面之间发生了什么变化。之前也有人尝试用3D卷积直接在时间和空间两个维度上做卷积,想让网络自己从原始像素里学出动态特征。但这个思路当时效果并不好,一个关键原因是数据量不够,网络很难从有限的视频数据里自己学出复杂的运动模式。这就像让一个从没学过物理的人,光看几张连续照片就总结出牛顿运动定律,太难了。光流把运动本身画出来这篇论文的核心思路,是不让网络自己去猜运动信息,而是先把运动信息计算出来,直接喂给网络。这个计算出来的运动信息叫光流。 光流:描述视频中每个像素点在相邻两帧之间移动方向和速度的一种表示方法,本质上是一张张记录了运动矢量的图。光流图长什么样,你可以想象成给每个像素点画一个箭头,箭头指向它在下一帧里移动到的方向,箭头的长短代表移动的速度。把这些箭头拆成水平方向和垂直方向两个分量,就得到了两张图,分别记录了每个像素的横向运动和纵向运动。这样一来,视频里的动作信息就被提前翻译成了一种网络更容易学习的形式。网络不需要自己去对比前后两帧图像找差异,这些差异已经被计算好摆在面前了。这就好比你想教一个刚学英语的孩子理解一篇很难的古文,直接把古文甩给他,他大概率一头雾水。但如果你先把古文翻译成白话文再给他看,理解难度立刻降了一大截。光流做的就是这个翻译工作,把动作这种网络不擅长直接理解的原始信号,翻译成运动矢量这种网络更擅长处理的结构化信号。如果不做这个翻译,直接让网络硬啃原始像素序列,网络就得同时兼顾学习什么是运动和这是什么运动两件事,任务难度直接翻倍,这也是为什么之前3D卷积的路子走得比较艰难。两条流,一条看空间一条看时间有了光流这个工具,论文提出的架构就顺理成章了,这也是这篇论文最核心的贡献,叫双流网络。 双流网络:一种把视频信息拆成两路分别处理再融合结果的卷积神经网络架构,一路处理单帧静态图像,另一路处理光流运动图。具体来说,网络分成两个完全独立的卷积神经网络分支。第一条叫空间流,输入是视频里的单独一帧RGB图像,负责识别画面里的场景、物体、人物外观这些静态信息。比如你要判断视频里的动作是打篮球还是踢足球,光看一帧图像,能不能看到篮球场、篮筐这些场景元素,就是很强的线索。第二条叫时间流,输入是连续多帧计算出来的光流图,堆叠在一起形成一个多通道的输入,负责捕捉动作本身的运动模式。比如挥手和鼓掌这两个动作,画面场景可能长得差不多,但手部运动的轨迹完全不同,这就得靠时间流来分辨。两条流各自训练各自的卷积网络,最后把两边的预测结果融合起来,可以简单加权平均,也可以再训练一个支持向量机来组合两边的输出特征。 SVM(支持向量机):一种经典的机器学习分类算法,这里用来把两条流各自输出的特征分数组合成最终的判断结果。为什么要分成两条独立的网络而不是揉在一起训练一个大网络?这背后是研究者的一个判断,静态外观信息和动态运动信息,它们的统计规律差别很大,一个是关于像素颜色纹理怎么分布,一个是关于像素怎么随时间移动,硬塞进一个网络里让它自己去分辨这两种截然不同的模式,不如干脆分开,各自用最适合的网络结构和数据去学。这个设计思路你可以类比成一个团队解决案子。侦探需要同时观察现场留下的物证(相当于空间流看到的场景线索)和监控录像里的行动轨迹(相当于时间流看到的运动线索),这两种线索的性质完全不同,一个是静态的物理证据,一个是动态的行为模式。如果强迫一个侦探同时用同一套思维方式去处理这两类完全不同的信息,效果往往打折扣,更好的做法是让擅长看物证的专家和擅长看录像的专家分别分析,最后再碰头汇总结论。双流网络的两个分支就是这两位专家,分别专精,最后融合。如果只用空间流会发生什么?论文里做了对比实验,只用空间流,在UCF-101上的准确率是72.6%。加上时间流融合之后,准确率提升到88.0%,整整多了15个百分点。这说明动作识别里光看画面长什么样是远远不够的,运动信息本身携带的判别力非常强,甚至比静态外观更关键。论文里的架构图画得很清楚,视频输入之后被拆成两路,上面一路是单帧图像进空间流卷积网络,下面一路是多帧光流叠加进时间流卷积网络,两边独立跑完各自的卷积层和全连接层,输出的分类分数在最后做融合,给出最终的动作类别判断。多帧光流叠加:给时间流更长的记忆时间流具体怎么处理光流数据,这里还有一个值得展开的细节设计。单独一帧的光流信息其实很有限,只能反映相邻两帧之间瞬间的运动。但一个完整的动作往往需要更长的时间窗口才能看清楚,比如起跳这个动作,如果你只看某个瞬间的运动矢量,可能看起来只是往上移动一点,很难和别的动作区分开。论文的解法是把连续多帧(论文里用的是10帧)的光流图堆叠在一起,作为时间流网络的输入,让网络能看到一个更长的运动轨迹片段,而不是孤立的一瞬间。这就好比看一段慢动作回放来判断裁判该不该判罚,如果只给你一张截图,你很难判断球员是不是真的犯规了,但给你连续十几张连拍照片拼在一起看整个过程,动作轨迹就清楚多了。堆叠多帧光流,本质上就是给网络多看几张连拍照片,让它能捕捉到一个动作从开始到结束的完整运动模式,而不是被单一瞬间的信息误导。论文还比较了两种光流的表示方式,一种是常规的光流,另一种叫轨迹叠加光流,是把光流沿着物体运动轨迹重新采样对齐后再叠加,理论上能更好地消除相机自身晃动带来的干扰。实验发现两种方式效果相差不大,常规光流已经够用,这也说明了论文方法的鲁棒性,不需要过分复杂的预处理就能拿到不错的效果。数据不够怎么办:多任务训练深度学习一个老生常谈的问题是数据饥渴,越复杂的网络越需要海量数据才能训好,而当时能用的视频动作识别数据集规模都不大,比如UCF-101只有101类动作,几千段视频,跟ImageNet动辄百万级的图片量比起来差得远。论文用了一个技巧来缓解这个问题,叫多任务学习。 多任务学习:让同一个网络同时在多个相关但不完全相同的数据集或任务上训练,共享底层特征,分别输出对应任务的结果。具体做法是把网络最后的分类层拆成两个分支,一个对应UCF-101的101个类别,一个对应另一个数据集HMDB-51的51个类别,底层的卷积特征是共享的,两个数据集的样本混在一起训练,反向传播的时候各自只更新自己对应的输出分支和共享的底层参数。这么做的好处是相当于把两个小数据集拼成了一个更大的训练资源,底层的通用运动特征可以从两份数据里一起学,虽然两个数据集的类别定义不完全一样,但都是关于人体动作的视频,共享的底层规律是相通的。这有点像一个学生同时准备两门相关的考试,比如物理和数学,虽然考试内容不完全重叠,但很多基础的逻辑推理能力、计算能力是通用的,同时准备反而能让这些通用能力练得更扎实,不会因为单科题量太少而练不出手感。多任务训练之后,论文报告在HMDB-51上准确率从54.6%左右提升到59.4%,提升幅度相当可观,证明了这个资源拼凑的思路确实管用。最终成绩单那么这套双流网络最后打得怎么样。在UCF-101数据集上,双流网络融合后的准确率达到88.0%,这个数字终于追平甚至超过了当时最好的手工特征方法(比如密集轨迹特征约87.9%)。在HMDB-51上,准确率是59.4%,也是当时具有竞争力的水平。| 方法 | UCF-101准确率 | HMDB-51准确率 ||---|---|---|| 仅空间流 | 72.6% | 40.5% || 仅时间流 | 81.0% | 54.6% || **双流融合(SVM融合)** | **88.0%** | **59.4%** || 当时最好的手工特征方法 | 约87.9% | 约57%左右 |这是深度学习第一次在视频动作识别这个具体任务上,打平甚至反超手工特征方法。在2014年,这句话的分量不亚于两年前AlexNet在图像识别上的横空出世。区别是AlexNet那次赢得干脆漂亮,双流网络这次赢得来之不易,足足晚了两年,而且靠的不是纯粹的端到端学习,是巧妙地把光流这个手工设计的运动表示嵌进了深度学习的框架里。这个不完全端到端的特点后来也成了争议点和改进方向。后来发生的事这篇论文之后,双流网络成了视频动作识别领域接下来好几年的标准范式,大量后续工作都是在这个骨架上做改进。2016年,Feichtenhofer等人发表了论文,提出了更好的双流融合方式,让空间流和时间流在网络中间层就开始交互融合,而不是等到最后才融合分类分数,这个改进让准确率进一步提升。2017年,Carreira和Zisserman(没错,还是Zisserman)发表了I3D(Inflated 3D ConvNets)论文,把双流的思路和3D卷积结合起来,同时提出了大规模视频数据集Kinetics,用海量数据直接训练3D卷积网络,某种程度上验证了双流网络当年绕过的那个数据不足问题,只要数据量真的上去了,3D卷积也能学出很好的时空特征,不一定非要依赖手工计算的光流。这也从另一个角度说明了双流网络当年的设计选择,是那个数据稀缺时代下的一个聪明妥协。这两篇后续工作都在用不同方式,尝试解决双流网络本身的一个软肋,光流的计算本身很耗时,而且是独立于分类任务之外单独算出来的,没有真正做到端到端优化。这条改进的线一直延续到后来的SlowFast网络等更新的架构设计里。写在后面读这篇论文最触动我的地方,是它没有执着于深度学习必须端到端这个信念。2014年那会儿,端到端学习正是深度学习最引以为傲的招牌,不需要手工设计特征,让网络自己从原始数据里学一切。但Simonyan和Zisserman很务实地承认,在数据不够的情况下,硬要端到端反而学不好,不如把光流这个前人已经研究得很成熟的手工工具直接嵌进网络里用。这种该妥协就妥协的态度,反而换来了当时最好的结果。这让我想起很多工程问题里的一个共同规律,理论上最优雅的方案,不一定是当下条件最可行的方案。双流网络能被后来的I3D等纯数据驱动方法部分取代,恰恰印证了这一点,方法本身没有绝对的对错,只有匹配不匹配当下的资源约束。如果现在的数据和算力放到2014年,双流网络这个中间方案还会被提出来吗?这个问题留给你想。QAQ1双流网络是什么A双流网络是2014年Simonyan和Zisserman提出的一种视频动作识别方法,把视频信息拆成空间流和时间流两条独立的卷积神经网络分支分别处理,空间流处理单帧静态图像识别场景外观,时间流处理多帧堆叠的光流图捕捉运动模式,最后融合两边的预测结果。Q2双流网络里的光流有什么用A光流是描述视频中每个像素点在相邻帧之间运动方向和速度的表示方法,相当于提前把动作信息翻译成网络更容易学习的运动矢量形式,让时间流网络不需要自己从原始像素里摸索运动规律,直接学习已经计算好的运动信息,大大降低了学习难度。Q3双流网络和后来的I3D网络有什么关系AI3D是2017年Carreira和Zisserman提出的后续工作,把双流思路和3D卷积结合,并配合大规模Kinetics数据集直接训练,某种程度上验证了双流网络当年靠光流绕开数据不足问题的判断,一旦数据量足够大,3D卷积也能自己学出好的时空特征。