两个人靠看视频里的动作,居然能比机器学得更准
2014年的深度学习圈子里有一件事让不少研究者感到很不是滋味。图像识别领域卷积神经网络已经把手工设计的特征方法打得节节败退。AlexNet 在 2012 年横空出世之后整个计算机视觉界都在往深度学习转向。可是当研究者们把同样的思路搬到视频动作识别上事情却不太顺利。当时视频动作识别领域最强的方法是一种叫做密集轨迹的手工特征方法在标准测试集 UCF-101 上能达到 87.9% 的准确率。而深度学习方法呢最好的成绩只有 65.4%差了整整 22 个百分点。这个差距意味着什么。意味着每 5 个动作里深度学习方法就要比手工方法多认错超过 1 个。要知道图像识别上深度学习已经是碾压级的优势怎么到了视频上反而掉链子了。这就是牛津大学的 Karen Simonyan 和 Andrew Zisserman 在他们那篇论文里要解决的问题。这两位后来几个月又发表了另一篇更出名的论文提出了 VGGNet这是同一个实验室同一时期的工作说明他们那会儿正在系统性地琢磨卷积网络到底该怎么设计才好用。视频比图片难在哪一张图片是静止的空间信息一个卷积网络看一眼就能抓住物体的形状、纹理、边缘。但视频不一样视频的核心是运动是画面随时间的变化。如果你只把视频的每一帧单独喂给一个图像分类网络让它一帧一帧地看会发生什么。答案是网络会完全丢失动作的信息。一个人挥手和一个人把手举着不动单看某一帧图片可能长得几乎一样只有连续看几帧看到手的位置在变化才能分辨出这是挥手还是举手不动。这就像你看一本连环画如果只给你看其中一页你可能猜不出这是打拳还是伸懒腰你需要翻看连续的几页才能读懂这个动作的意思。如果只看一页就下判断你大概率会理解错整个故事。所以问题的关键在于怎么让卷积网络也能看懂时间维度上的变化而不仅仅是空间维度上的形状。两条流一起看效果立刻不一样Simonyan 和 Zisserman 给出的方案叫做双流卷积网络。双流网络*同时用两个独立的卷积网络分别处理视频的两种不同信息一个处理静止画面一个处理运动信息最后把两边的判断结果融合起来。具体来说第一条流叫空间流输入是视频里的单张 RGB 图片专门负责识别画面里有什么物体、什么场景比如识别出画面里有个人、有个球、有片草地。这条流本质上跟普通的图像分类网络没什么区别。第二条流叫时间流这条流不看原始画面而是看光流场。光流场*描述画面中每个像素点在连续两帧之间移动方向和速度的一种表示本质上是把运动这件事变成了一张可以输入给卷积网络的图片。光流场把每个像素的运动方向拆成水平方向和垂直方向两张图叠加连续几帧的光流图就得到了一个专门描述运动模式的输入把这个输入喂给另一个卷积网络这个网络就专门学习动作本身长什么样而完全不管画面里到底是谁在动。这个设计背后的逻辑其实挺直白的。人类大脑处理视觉信息的时候本来就存在两条相对独立的通路一条负责识别这是什么另一条负责感知这在怎么动。神经科学上这个理论已经有些年头了Simonyan 和 Zisserman 借用了这个思路把它翻译成了两个并行的卷积网络。如果不这样拆开会怎样。论文里做了对比实验只用空间流单独跑UCF-101 上的准确率是 72.6%。这个数字甚至比不过一些手工特征方法。但是把两条流的结果融合起来之后准确率跳到了 88%直接反超了当时最强的手工特征方法 87.9%。这是深度学习第一次在视频动作识别这个任务上赢过手工特征在 2014 年这句话的分量不亚于两年前 AlexNet 在图像识别上的那次胜利。这个差距背后揭示的东西挺有意思。空间流之所以效果一般是因为很多动作类别其实光靠画面里的场景和物体就能蒙对一部分比如看到游泳池大概率是在游泳看到篮球场大概率是在打球。但真正区分挥手和招手这种细粒度动作的时候光看静态画面是不够的必须依赖运动轨迹。这也解释了为什么加上时间流之后提升这么明显。数据不够用怎么办深度学习一直有个软肋就是需要海量标注数据才能训练出好效果。而 2014 年那会儿视频动作识别的数据集规模远远比不上图像分类。UCF-101 一共才 13320 段视频跟图像分类动辄百万级的 ImageNet 完全不是一个量级。数据不够网络很容易过拟合。过拟合*模型在训练数据上表现很好但换到没见过的新数据上表现很差相当于死记硬背了考试题却没学会解题方法。Simonyan 和 Zisserman 用了两个办法应对这个问题。第一个办法是多任务学习让同一个网络同时在两个不同的数据集上训练UCF-101 和另一个叫 HMDB-51 的数据集共享网络的大部分参数只在最后分类的那一层分开。这样网络能从两份数据里都学到东西相当于把两个小数据集拼成了一个更大的训练资源。第二个办法是大量的数据增强对训练图片做随机裁剪、水平翻转、颜色抖动这些操作人工制造出更多样化的训练样本。这里的思路其实很朴素。你只有 100 张照片来教一个从没见过猫的人认猫直接给他看这 100 张他很容易记住这张照片左上角有个黑点就是猫这种毫无意义的规律。但如果你把这 100 张照片裁剪、翻转、调色调出上千种变体他就被迫去关注猫真正的特征比如耳朵形状、身体轮廓而不是背景里的某个偶然细节。如果不做这一步网络记住的很可能是背景噪声而不是动作本身。融合方式也有讲究两条流各自算出一个分类结果之后怎么把它们合并成一个最终答案这里也有讲究。论文里试了几种融合方式比较简单的一种是取两条流预测概率的平均值另一种是训练一个额外的分类器把两条流的输出当作特征喂进去让这个分类器自己学怎么加权。实验结果显示用额外分类器融合的效果稍微好一点但差距不算特别大两条流各自的贡献才是效果提升的主要来源融合方式本身的选择是锦上添花而不是决定性因素。这个发现其实提醒了后来的研究者一件事比起纠结怎么融合更重要的是先把每一路的信息提取做扎实。方法 UCF-101准确率密集轨迹手工特征 87.9%单独空间流 72.6%单独时间流 83.7%双流融合 **88.0%**从这个表格能看出一个挺关键的细节时间流单独拿出来跑效果已经逼近手工特征方法了达到 83.7%比空间流单独跑的 72.6% 高出 11 个百分点。这说明光流场这种运动表示本身就已经抓住了动作识别最核心的信息空间流更多是提供辅助性的场景信息。这篇论文之后视频动作识别领域走上了一条很明显的延续路线。2016 年Feichtenhofer 等人发表的论文进一步研究了双流网络里两条流应该在网络的哪个层次上融合而不是等到最后输出层才融合提出了更早期的特征级融合方案进一步把准确率往上推了一截。2017 年DeepMind 团队发表了 I3D 网络把双流网络里的二维卷积换成了三维卷积直接让卷积核在时间维度上也能滑动不再需要单独计算光流这个方法在 Kinetics 数据集上把准确率进一步推高成为后续几年视频理解领域的重要基线模型。这两个后续工作说明双流网络提出的分别处理空间和时间信息这个核心思路是站得住的后来的改进大多是在这个框架内部做优化而不是推翻重来。写在后面读到光流场这个设计的时候我脑子里冒出的第一个念头是这其实是一种很聪明的作弊。网络本身处理时间序列信息很吃力那不如干脆在输入网络之前先用传统的图像处理算法把运动这件事算出来变成一张静态图片再喂给网络。这相当于绕过了让网络自己学习时间建模这个更难的问题用一个巧妙的预处理把难题拆解成了网络擅长的静态图像分类。这个思路让我联想到工程里经常出现的一种取舍。不是所有的问题都值得用最纯粹的端到端方案解决有时候先用已有的成熟工具把问题转化一下反而比硬train一个通用模型更划算。三年后的 I3D 网络选择放弃光流场直接用三维卷积某种程度上说明当数据和算力都跟上之后端到端方案才会重新变得更有优势。这也提醒我一个方法在特定历史阶段是不是最优解很大程度上取决于当时手头的资源够不够。论文里还有个细节我觉得值得单独说一下光流场需要提前用传统算法计算好再存起来这个预处理步骤在当时其实相当耗时耗资源几乎跟训练网络本身一样费劲。这个笨拙的中间步骤后来正是被 I3D 网络这类方法优化掉的地方。一个方法解决了问题同时也留下了它自己的负担这大概是技术演进里挺常见的一个规律。QAQ1双流卷积网络是什么A双流卷积网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别方法用两个独立的卷积网络分别处理静止画面和运动信息再把两者的判断结果融合起来最终准确率超过了当时最强的手工特征方法。Q2双流网络里的时间流为什么要用光流场而不是原始视频帧A因为光流场直接描述了像素在连续帧之间的运动方向和速度等于把动作本身变成了一张图片让网络专注学习运动模式而不必费力从原始画面里自己摸索出运动信息。Q3双流网络之后有哪些重要的后续研究A2016年Feichtenhofer等人研究了更早期的特征级融合方案2017年DeepMind提出的I3D网络用三维卷积直接建模时间维度不再需要单独计算光流都是在双流网络框架基础上的重要延伸。