炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会!
(来源:科技行者)
2014年,如果你问一个计算机视觉研究者"深度学习能识别视频里的动作吗",大概率会得到一个尴尬的沉默。
不是因为没人尝试过。恰恰是因为已经有不少人尝试过,结果都不太理想。当时最强的手工特征方法叫密集轨迹
> 密集轨迹*:一种传统计算机视觉方法,通过追踪视频里密集分布的点随时间的运动路径,再统计这些路径周围的图像特征来判断动作类别。
在标准测试集UCF-101上能做到接近87%的准确率,而深度学习方法呢,最好的尝试也只能徘徊在65%左右,足足差了20多个百分点。
20个百分点的差距,意味着什么?意味着每5个动作里,深度学习就要比手工方法多认错1个。这不是一点点的落后,这是一个方向可能走错了的信号。
图像识别领域,深度学习早就靠AlexNet在2012年一战封神,把传统方法按在地上摩擦。可视频动作识别这个领域,深度学习就是打不过老方法,整整打了两年不到。
问题出在哪?牛津大学的Karen Simonyan和Andrew Zisserman两个人琢磨出了一个答案,写成了一篇论文,叫《用于视频动作识别的双流卷积网络》。这篇论文后来成了整个视频理解领域绕不开的起点。
为什么图像识别的思路搬到视频上就失灵了
先说说这事儿难在哪。
图像识别,你给网络一张照片,网络学的是"这张照片里的物体长什么样"。猫有猫的轮廓,狗有狗的毛发纹理,这些都是静态的视觉信息,一帧就能看全。
但动作是什么?动作是"随时间变化的东西"。一个人挥手和一个人举手,单看某一帧图像,姿势可能几乎一样。你必须看到手在动,看到运动的轨迹,才能分辨这是"挥手"还是"举起来不动"。
这就像你去看一张照片猜运动员在做什么动作,和你看一段视频猜运动员在做什么动作,难度完全不是一个量级。照片里可能是起跳瞬间的定格,你可能猜成"跳起来庆祝",但视频里连续播放,你立刻就知道这是"跳投投篮"。
当时的研究者们试过一个很直接的思路:把视频的每一帧都当成图片喂给卷积神经网络,然后把结果做个平均或者简单叠加。
这个思路听起来没毛病,但实际效果很差。原因也不难猜,单帧图像里根本没有运动信息,你让网络看一堆静止的照片,它顶多能认出这是"一个人在草地上",但认不出"这个人正在做什么动作"。网络学到的更多是背景和场景线索,而不是动作本身。
这就好比你想判断一个人是在走路还是在跑步,却只给他一张照片看,而不让他看连续的画面。他可能靠猜测背景,比如看到跑道就猜跑步,看到人行道就猜走路,但这种判断毫无可靠性,换个场景就全错。
Simonyan和Zisserman意识到,问题的核心是:网络缺一条专门处理"运动"这件事的通路。
双流网络:把"看形状"和"看运动"拆成两条路
他们的解决方案,说出来其实挺朴素的:既然一条网络同时学空间信息和时间信息学不好,那就干脆拆成两条网络,一条专门学空间信息,一条专门学时间信息,最后把两边的判断结果合并起来。
这就是论文标题里"双流"的意思。
> 双流卷积网络*:由两个独立的卷积神经网络组成的架构,一个处理静态图像信息(空间流),一个处理运动信息(时间流),两者的预测结果最后融合得到最终判断。
空间流很好理解,输入就是视频里挑出来的一帧图像,网络结构基本沿用了当时图像识别领域已经验证过的卷积网络设计,专门负责识别"这个场景里有什么,人长什么样,背景是什么"。
时间流才是真正的创新点。它的输入不是图像,而是光流场。
> 光流场*:描述视频中相邻两帧之间,画面上每一个点是往哪个方向、以多快速度移动的一种数据表示,本质上是把"运动"这个抽象概念转换成了一组可以计算的数值。
举个例子,如果视频里一个人的手从左边移动到右边,光流场就会在手的位置标出一个指向右边的箭头,箭头的长度代表移动的速度。把连续多帧的光流场叠在一起输入给网络,网络看到的就不再是"长什么样",而是"哪里在动,怎么动的"。
这个设计的巧妙之处在于,它把一个原本很难被神经网络直接学到的东西,运动的方向和速度,提前用光流算法计算好,转换成了网络容易处理的数值形式。网络不需要自己去猜"这两帧之间发生了什么变化",这个苦活已经被光流算法干完了,网络只需要在这个基础上做分类判断。
这就像你要教一个孩子判断车速快慢,如果直接给他两张车的照片,他很难判断,因为照片是静止的。但如果你先帮他把车在两张照片之间移动的距离和方向标出来,箭头长短就代表速度,他一下子就能看懂了。你把最难的那一步先做好,剩下的判断就变得简单了。如果不这样做,让网络自己从原始像素里学出运动模式,网络需要更深的层次、更多的数据、更长的训练时间才可能学到类似的东西,而且效果未必更好。
那如果只用空间流会怎样?实验数据给出了答案:单独用空间流,准确率是72.6%。而加上时间流之后,整个系统的准确率跳到了88%左右。中间这15个多百分点的差距,几乎全部来自"运动信息"这一项。这说明动作识别这件事,光看长什么样是远远不够的,动作本身就藏在"如何变化"里。
论文里还展示了一张第一层卷积核的可视化图,你会看到这些卷积核大多呈现出方向性的条纹状结构,像是在专门捕捉某个特定方向的运动模式。这不是巧合,这是网络自己在训练过程中学出来的,它发现光流场里最重要的信息就是运动的方向,于是自发地长出了一堆"方向探测器"。
数据太少怎么办:用图像识别的数据来"补课"
双流网络刚提出来的时候还面临一个现实问题,当时能用来训练视频动作识别模型的数据集非常小。UCF-101大概只有13000个视频片段,而图像识别领域早就用上了拥有上百万张图片的ImageNet。
数据不够,深层神经网络很容易过拟合,也就是死记硬背训练集里的样本,换一个新场景就翻车。
Simonyan和Zisserman的解决办法是,让空间流网络先在ImageNet这个庞大的图像数据集上做预训练,学会识别各种物体和场景的基本视觉特征,然后再拿到视频动作数据集上做微调。
> 预训练与微调*:预训练指先在一个数据量巨大的任务上训练模型,让它学到通用的特征表示;微调指把预训练好的模型参数作为起点,再用目标任务的小数据集继续训练,调整到适应新任务。
这个思路现在在深度学习里已经是家常便饭了,但在2014年,把图像识别学到的知识"迁移"到一个看起来完全不同的任务上,还是一个相对新鲜的操作。
这就像一个已经学会认识各种蔬菜水果长相的厨师,你不需要从头教他"什么是圆的""什么是红的",他already具备这些基础的视觉判断能力,你只需要在这个基础上教他"看到这些食材要做成什么菜"就行了,不用从认字开始教。如果不做预训练,直接拿一万多个视频从零开始训练一个深层网络,模型很可能学不出稳定的特征,最后的效果会大打折扣。
时间流那边情况稍微复杂一点,因为光流数据没法直接从ImageNet那种图像数据集里获得。研究者们采用了另一套办法,通过对已有训练样本做各种变换,比如裁剪、镜像翻转等方式,人工制造出更多训练样本,来缓解数据不足的问题。
融合两条流的判断:简单相加,效果惊人
两条网络分别训练好之后,怎么把它们的判断结果结合起来?
论文里用的方法其实相当直接,把空间流和时间流各自输出的分类概率做加权平均,或者训练一个简单的分类器把两边的特征拼起来再判断。没有什么特别复杂的融合机制。
这种简单粗暴的融合方式反而效果很好,这也从另一个角度说明了,两条流学到的信息确实是互补的,不是重复的。空间流关注"这是什么场景,这里有什么东西",时间流关注"这里发生了什么变化",两者叠加起来,信息量比单独一条流丰富得多。
最终在UCF-101数据集上,双流网络达到了88.0%的准确率,而在另一个动作识别数据集HMDB-51上,达到了59.4%。这两个数字在当时都创下了新纪录,第一次让深度学习方法在视频动作识别上超过了手工设计的密集轨迹特征。
下面这张表格能更直观地看出双流网络相对于此前方法的提升:
| 方法 | UCF-101准确率 |
| 单帧图像卷积网络 | 约73% |
| 密集轨迹(手工特征) | 约87% |
| 空间流单独 | 72.6% |
| 时间流单独 | 约83% |
| **双流网络融合** | **约88.0%** |
这是深度学习在视频动作识别上第一次真正意义上打败手工特征。在2014年,这句话的分量不亚于两年前AlexNet在图像识别上的横空出世。
有意思的是,Simonyan和Zisserman几个月后又发表了另一篇论文,提出了后来大名鼎鼎的VGGNet网络结构,这个结构如今几乎是每个深度学习入门教程都会讲到的经典模型。这两篇论文其实是同一时期的工作,同一批人,同一个思路的延伸,只是应用场景不同。这也说明当时牛津那个视觉几何组,在探索卷积网络的各种可能性上,是相当高产而且思路超前的。
双流网络之后:这条路子被怎样接着走下去
双流网络提出之后,这个思路很快被后续研究者拿去做各种改进和延伸。
2015年,一篇叫做《C3D:学习时空特征的通用视频表示》的论文尝试了另一种思路,不再拆成两条流,而是直接用三维卷积同时处理时间和空间维度,让一个网络自己学出时空特征,而不是依赖光流这种预先计算好的运动信息。这种方法后来演化出了后续更强的I3D网络。
2016年,Feichtenhofer等人发表了《卷积双流网络融合用于视频动作识别》,专门研究了两条流之间应该在网络的哪个层次进行融合效果最好,发现比起论文里最初那种简单的最后一层融合,在网络中间层就开始融合空间和时间信息,效果会更好,这进一步把双流的框架往前推进了一步。
再往后,长时序建模的问题也被提出来,因为双流网络本身只看很短的一小段视频片段,没法处理跨越较长时间的动作模式,这个问题后来被时序分段网络等工作专门解决。
从这些后续工作能看出,双流网络提出的"空间和时间要分开建模"这个核心思路,虽然后来的具体实现方式各有不同,但它揭示的这个根本矛盾,静态外观信息和动态运动信息本质上是两种不同性质的数据,需要不同的处理方式,这个洞察一直影响着后来的研究者。
写在后面
读这篇论文最触动我的地方,是它解决问题的方式特别朴素。没有发明什么全新的网络结构,光流算法也是现成的传统技术,两条网络的融合方式也简单到近乎粗暴。
但正是这种朴素,让它的洞察力显得更加珍贵:不是网络不够深、不够复杂,而是任务本身的信息结构决定了应该用两条路径去处理。
这让我想到一件事,很多时候技术卡壳并不是因为算法不够先进,而是因为对问题本身的理解方式出了偏差。双流网络提醒我们的,其实是先想清楚问题里到底藏着几种不同性质的信息,再决定网络结构怎么设计,而不是反过来先堆一个复杂网络再指望它自己悟出问题的结构。
这篇论文没解决的问题也很明显,光流计算本身很耗时,而且只能看很短的时间窗口,长时间跨度的动作理解,比如一整段剧情里角色情绪的变化,双流网络这套框架完全够不到。这个问题留给了后来整整十年的研究者。
Q&A
Q1:双流卷积网络是用来做什么的?
A:双流卷积网络是一种视频动作识别方法,通过把网络拆成空间流和时间流两条独立通路分别处理静态图像信息和运动信息,最后融合判断结果,从而识别视频里人物正在做什么动作。
Q2:双流网络和普通的图像识别卷积网络有什么区别?
A:普通图像识别网络只处理单张静态图片,学的是物体长什么样。双流网络多了一条时间流,专门输入光流场数据来捕捉画面里物体的运动方向和速度,从而能识别出动作本身,而不只是场景和物体。
Q3:双流网络的效果比传统手工特征方法好吗?
A:好。在UCF-101数据集上,双流网络达到了约88%的准确率,超过了当时最强的手工特征方法密集轨迹的约87%,这是深度学习方法第一次在视频动作识别任务上超越传统手工方法。
上一篇:视频里的动作,AI 曾经看不懂
下一篇:立讯花旗七四沽A(16467)债券及结构性产品 - [补充上市文件 - 衍生权证]Citigroup Global Markets Europe AG 发行的无抵押认股权证代号16467之补充上市文件