来源:市场资讯
(来源:科技行者)
2014 年之前,有一件事一直让搞视频识别的研究者们很尴尬。
深度学习那时候已经在图片识别上打得所有人满地找牙了。2012 年的 AlexNet 让整个计算机视觉圈子看到卷积神经网络的威力,图片分类的错误率一路往下砸。可是到了视频动作识别这个领域,情况完全不一样。
一个叫做"密集轨迹"的手工特征方法,硬是把神经网络挡在门外整整两年。你没看错,不是差一点点,是深度学习方法压根打不过手工设计的特征。这在当时的计算机视觉界,是一件相当反直觉的事:图片能赢,视频却不行,这背后到底卡在哪儿?
这篇论文,《用双流卷积网络做视频中的动作识别》,就是冲着这个问题去的。作者是 Karen Simonyan 和 Andrew Zisserman,两人来自牛津大学的 VGG 研究组。提一句题外话,这两位几个月之后又发表了 VGGNet,那篇后来几乎人尽皆知的图像分类网络。也就是说,他们几乎是同时在打两场仗,一场是图片,一场是视频,视频这场仗打得艰难得多。
核心问题:视频比图片难在哪
先说说当时的战况。
在这篇论文发表之前,最强的手工特征方法叫做改进版密集轨迹,英文缩写 iDT
**引用**
iDT(improved Dense Trajectories):一种通过追踪视频里密集分布的像素点运动轨迹,再统计轨迹周围颜色、梯度、光流等信息来描述动作的手工设计方法。
在标准测试集 UCF-101 上,iDT 能拿到接近 87% 的准确率。而在这之前尝试用深度学习做动作识别的工作,比如 Karpathy 等人在 2014 年提出的一些卷积网络方案,准确率只有 65% 左右,差了整整 20 个百分点。
20 个百分点的差距是什么概念?意味着每 5 个动作里,深度学习方法就要比手工特征多认错 1 个。这不是一个可以靠调参数抹平的差距,这是方法本身出了问题。
问题出在哪儿?图片识别网络看的是空间信息,一张照片里的形状、颜色、纹理。而视频除了空间信息,还多了一个维度,时间。一个人挥手和一个人挥拳,单看某一帧的画面可能长得差不多,真正的区别在于这个动作是怎么随时间展开的。之前的深度网络方案,大多是把视频的每一帧当成独立图片扔进网络,或者简单地把几帧叠起来卷积,这种做法完全没有专门去捕捉运动的规律,自然比不过专门为运动设计的手工特征。
这就好比你想通过照片认出一个人是在鼓掌还是在拍蚊子,如果只给你一张静止的照片,两个动作在那一瞬间的手部姿态可能几乎一样,你分不出来。但如果给你连续几张照片,能看到手掌合上又分开的轨迹,你立刻就知道答案。之前的深度网络,做的事情有点像只看一张照片就要下判断,自然力不从心。
方法一:把视频拆成两条流
Simonyan 和 Zisserman 的思路,说出来其实挺直接:既然图片识别网络擅长处理空间信息,那就专门用一个网络去处理空间信息;既然动作的关键在于运动,那就再专门造一个网络去处理运动信息。两个网络分头干活,最后把结果合起来。
这就是论文标题里"双流"的意思。
**引用**
双流卷积网络(Two-Stream Convolutional Network):由两个独立的卷积神经网络组成的架构,一个专门处理单帧图像(空间流),一个专门处理帧间运动信息(时间流),两者独立训练,最后融合各自的预测结果。
空间流很好理解,输入就是视频里随便抽出来的一帧画面,网络结构跟做图片分类的网络几乎一样,负责识别画面里有什么东西,比如球场、水面、乐器,这些场景和物体信息本身就能提供很强的线索。比如你看到一个人站在泳池边,穿着泳衣,大概就能猜到接下来的动作八成和游泳有关。
时间流是这篇论文真正的巧思所在。它的输入不是画面本身,而是光流场。
**引用**
光流(Optical Flow):描述视频中相邻两帧之间,画面上每一个像素点是往哪个方向、移动了多远的一种运动场,通常用水平位移和垂直位移两张图来表示。
光流场把"运动"这件事从画面内容里剥离了出来,变成了一种纯粹的位移信息。举个例子,一个人在原地做深蹲和在原地做拉伸,画面里的场景背景很可能一模一样,单看某一帧根本分不出区别,但光流场里记录的身体各部位移动方向和幅度是完全不同的模式,深蹲是上下方向的大幅度位移,拉伸可能是局部的小幅度伸展。把这种纯运动信号单独喂给一个网络,网络就能专心学习动作的动态特征,不会被场景内容干扰。
为什么一定要拆成两条独立的流,而不是把颜色信息和运动信息一起塞进同一个网络里训练?这里有个现实的矛盾。当时能用来训练视频动作识别的数据集非常小,UCF-101 只有 1 万多个视频片段,而图片分类的数据集 ImageNet 有上百万张图片。数据量差了两个量级。如果强行用一个网络同时学空间和时间特征,网络需要学的东西太复杂,而数据又太少,很容易学成一团糊。拆成两个网络之后,空间流可以直接借用在 ImageNet 上预训练好的模型参数做迁移,相当于蹭了图片识别领域已经积累多年的经验,时间流则专注在一个相对简单、明确的任务上,用相对少的数据也能学出规律。
这有点像一家小公司想同时打磨产品设计和市场推广,如果只招一个人既管设计又管市场,这个人分身乏术,两件事都做不精。如果不这样拆分开来,招两个各自专精的人,结果会怎样?大概率是两件事都做得马马虎虎。分成两条线各自专注,反而能把每一件事做到位,最后加起来的整体效果比一个人硬扛要好得多。
网络最后怎么把两条流的结果合并起来?论文里试了两种办法,一种是把两个网络最后输出的分类分数直接做加权平均,另一种是训练一个额外的支持向量机分类器把两条流的分数当作输入再做一次判断。实验发现后一种融合方式效果更好一点。
方法二:多帧光流堆叠,让时间流看得更远
只看相邻两帧的光流,能捕捉到的运动信息其实很短暂,可能就是眨眼之间的事。很多动作需要看稍微长一点的时间窗口才能判断清楚,比如区分"正在坐下"和"正在站起来",单看一瞬间的位移方向可能会搞混,得看一小段连续的过程。
于是论文里时间流的输入并不是单独一对帧的光流,而是把连续多帧,论文里用的是 10 帧,算出来的光流图堆叠在一起,当成一个多通道的输入喂给网络。
**引用**
光流堆叠(Stacking Optical Flow):把连续若干帧之间计算出的光流场,按时间顺序叠加成一个多通道的输入张量,让网络能同时看到一段时间窗口内的运动变化,而不只是相邻两帧的瞬时运动。
这么做的好处在于,网络能看到运动本身是怎么随时间演变的,是加速、减速,还是方向突然反转。这些信息对区分相似动作非常关键。想象你在看一段监控录像,想判断一个人是要开门还是要关门,如果只看两帧,门把手转动的方向其实差别很小,但如果连续看十几帧,门是往外开还是往里合,轨迹的走向一目了然。堆叠多帧光流,本质上就是给网络多看几眼,让它能看清运动的完整趋势,而不是靠一瞬间的画面赌概率。
如果不堆叠多帧,只用单帧光流会怎样?论文里做了对比实验,结果显示单帧光流的效果明显不如堆叠 10 帧的效果,准确率有明显下降。这说明运动信息的时间跨度确实重要,动作不是一个瞬间的事,是一个过程,网络需要看到过程才能判断准确。
论文里还提到一个细节,除了简单堆叠,他们还试验了把光流场做双向处理,也就是同时用往前的光流和往后的光流,发现进一步提升了效果。这也符合直觉,一个动作往前看和往后看包含的信息是互补的,就像看一段视频既想知道接下来会发生什么,也想知道之前发生了什么,两个方向的信息拼在一起,判断会更稳。
方法三:用图片数据集给光流网络"打底"
前面提到过,时间流面临一个数据不够的问题。UCF-101 这种视频数据集规模太小,而深度网络需要大量数据才能训练得好,不然很容易过拟合,也就是网络把训练集里的样本背下来了,换一批新的视频就不灵了。
**引用**
过拟合(Overfitting):模型在训练数据上表现很好,但在没见过的新数据上表现明显变差的现象,通常是因为训练数据量不够或模型太复杂,模型学到的是训练集的细节噪声而不是真正的规律。
空间流可以直接借用 ImageNet 上预训练的参数,因为空间流处理的是普通图片,天然能对接图片数据集的知识。但时间流处理的是光流场,这是一种很特殊的输入,ImageNet 里没有现成的光流数据可以借用。
论文的做法是,用另一个更大的视频数据集,叫做 Sports-1M,先把时间流网络在这个更大规模的数据上训练一遍,再迁移到目标任务的数据集上做微调。
**引用**
Sports-1M:一个包含 100 万段体育运动视频的大规模数据集,类别数量多达 487 种,常被用来给视频模型做预训练,弥补目标任务数据集规模太小的问题。
这个操作背后的逻辑跟健身很像。如果你想学一项很专精的运动,比如攀岩,但你从来没锻炼过,直接上手容易受伤,效果也差。比较聪明的做法是先做一段时间的基础体能训练,把核心力量、耐力先打好,再去专门练攀岩的技巧动作,进步会快很多,也更不容易受伤。用大规模的 Sports-1M 数据先训练,就是给网络打基础体能,让它先学会识别各种常见的运动模式,再拿到具体任务的小数据集上做针对性微调。
如果跳过这一步,直接在小数据集上从零训练时间流网络会发生什么?根据论文里的实验对比,直接在小数据集上训练的时间流网络效果明显更差,过拟合问题严重,这也印证了预训练这一步是必要的,不是可有可无的技巧。
数据说话:结果到底提升了多少
说了这么多设计思路,最终效果到底怎样?这是最关键的部分,数字不会说谎。
| 方法 | UCF-101 准确率 |
| 单独空间流网络 | 72.6% |
| 单独时间流网络 | 81.0% |
| 双流网络融合(平均法) | 86.9% |
| 双流网络融合(SVM 融合) | **88.0%** |
| iDT 手工特征方法(对照基准) | 87.9% |
从这张表能读出几个很有意思的信息。
第一,单独的空间流只有 72.6%,单独的时间流反而更高,达到 81.0%。这说明运动信息本身比静态画面信息更能反映动作类别,这也验证了论文一开始的判断,动作识别的核心确实在于"动",不在于"看到了什么场景"。
第二,把两条流融合起来之后,效果从最好的单流 81.0% 一下跳到 88.0%,提升了整整 7 个百分点。这说明两条流学到的信息是互补的,合在一起确实能弥补各自的短板,不是简单的重复劳动。
第三,也是整篇论文最重要的一个数字,双流网络的 88.0% 终于超过了此前统治这个领域两年的 iDT 手工特征方法的 87.9%。
这个超越只有 0.1 个百分点,看起来很微小,但意义完全不一样。这是深度学习第一次在视频动作识别这个任务上,正面打赢了手工特征方法。这句话放在 2014 年的分量,不亚于 2012 年 AlexNet 横空出世那一刻给图片识别领域带来的震动。之前深度学习在这个任务上被压制了两年,现在终于翻身了,而且翻身的方式不是靠更大的网络硬堆算力,是靠一个针对视频本质特点设计出来的巧妙架构。
这篇论文之后,故事怎么继续
双流网络这个思路提出之后,后续研究者们在这个框架上做了大量的延伸和改进。
2016 年,Feichtenhofer 等人发表了一篇论文,进一步研究了两条流应该在网络的哪个层次上融合更好,提出了更精细的空间时间融合策略,把准确率进一步往上推。
2017 年,Carreira 和 Zisserman(还是这位 Zisserman)发表了 I3D 网络,把双流的思路和三维卷积结合起来,直接用三维卷积同时对空间和时间维度建模,并且借助了一个新的更大规模数据集 Kinetics 做预训练,把动作识别的准确率推到了新的高度,在 UCF-101 上的表现超过 95%。
再往后,视频理解领域逐渐从双流架构过渡到更依赖三维卷积或者时序注意力机制的方案,但双流的核心思想,也就是把空间信息和运动信息分开处理再融合,一直影响着后来很多工作的设计逻辑,哪怕具体实现方式已经变了很多。
写在后面
读这篇论文时,一个细节让我停下来想了很久。研究者们没有去设计一个更大、更复杂的网络硬砸数据和算力,而是先想清楚了动作识别这个任务本身缺什么,时间信息,然后针对这个缺口专门设计了一条独立的通路去补。这种解决问题的方式,某种程度上比单纯堆模型规模更聪明,也更像是真正理解了问题本质之后的产物。
另一个让我意外的地方是光流这个选择。光流本身是计算机视觉里一个很老的技术,在深度学习火起来之前就存在了。这篇论文没有发明什么全新的运动表示方法,而是把一个老工具接进了新框架里,效果立刻就出来了。这提醒我一件事,有时候突破不在于造出全新的东西,在于找到旧工具和新架构之间恰好对上的那个缺口。
如果光流本身有计算误差,会不会一步步累积影响到最终判断?论文里没有细究这个问题,这大概也是后来三维卷积路线想绕开显式计算光流这一步的原因之一。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别方法,由两个独立的卷积网络组成,一个处理单帧画面捕捉空间信息,一个处理光流场捕捉运动信息,两者结果融合后做最终判断。
Q2:双流网络比之前的手工特征方法好在哪?
A:在 UCF-101 数据集上,双流网络融合后达到 88.0% 的准确率,首次超过了此前统治该领域两年的 iDT 手工特征方法的 87.9%,这是深度学习第一次在视频动作识别任务上正面赢过手工方法。
Q3:为什么要用光流而不是直接用画面做时间流的输入?
A:光流能把运动信息从画面内容中剥离出来,专注描述像素点的位移方向和幅度,避免场景内容干扰,让网络专心学习动作本身的动态特征,而不是被背景、颜色等无关信息带偏。
热门跟贴