文章链接:https://arxiv.org/abs/1504.06852?context=cs
文章源码:http://lmb.informatik.uni-freiburg.de/resources/software.php
卷积神经网络(CNN)在各种计算机视觉任务中非常成功,特别是与识别相关的任务。光流估计并不是CNN成功的任务之一。在本文中,我们构建了适当的CNN结构,能作为监督学习解决光流估计问题。我们提出并比较两种结构:通用结构和另一种包括在不同图像位置关联特征向量的层的结构。
由于现有的真实数据集不足以训练CNN,因此我们生成合成的Flying Chairs数据集。我们表明,在这些非真实的数据集上进行训练的网络仍能很好地推广到Sintel和KITTI等现有数据集,在保证准确率的情况下每帧能达到5-10fps。
卷积神经网络已成为许多计算机视觉领域的首选方法。它们通常应用于分类,但最近提出的体系结构也允许像素级语义分割(FCN)或单个图像深度估计。在本文中,我们建议训练端到端CNNs学习从一对图像预测光流场。
虽然光流估计需要精确的像素定位,它还需要找到两个输入图像之间的对应关系。这不仅涉及学习图像特征表示,还涉及学习在两个图像中的不同位置处匹配它们。在这方面,光流估计从根本上不同于先前的CNN应用。
由于尚不清楚这项任务是否可以通过标准CNN结构解决,我们还开发了一个具有明确提供匹配功能的相关层(correlation layer)的结构。这种结构是端到端训练的。这个想法是利用卷积网络的能力来学习多尺度和抽象的强大特征,并帮助相关层找到基于这些特征的实际对应关系。相关层顶部的层将学习如何预测这些匹配的光流。令人惊讶的是,以这种方式帮助网络是不必要的,甚至原始网络也可以学习来预测光流。
训练这样的网络去预测光流需要足够大的训练集。虽然数据增加确实有帮助,但现有的光流数据集仍然太小,无法训练与现有技术水平相当的网络。众所周知,获得真实视频素材的光流非常困难。我们生成一个合成的Flying Chairs数据集,其中包含来自Flickr的随机背景图像,我们在上面叠加来自[1]的分段图像。这些数据与现实世界几乎没有共同之处,但我们可以使用自定义属性生成任意数量的样本。即使没有微调,仅仅对这些数据进行过训练的CNN也可以很好预测真实数据集下的光流。
利用CNN的高效GPU实现,我们的方法比大多数方法更快。我们的网络在Sintel数据集的全分辨率上预测每秒多达10个图像对的光流,并且实现了实时方法中的最高精度。
略
最近已经证明,Krizhevsky等人已经展示了用反向传播训练的卷积神经网络在大规模图像分类中表现良好。这促使了将CNN应用于大量计算机视觉任务。
虽然没有关于用CNN估计光流的工作,但是已经有关于神经网络匹配的研究。 Fischer等从有监督或无监督方式训练的CNN中提取特征表示,并根据欧几里德距离匹配这些特征。 Zbontar和LeCun 采用Siamese结构训练CNN来预测图像块的相似性。这些方法与我们的方法的巨大差异在于它们是基于patch并且将空间聚合后处理,而本文中的网络直接预测完整的光流场。
CNN的最近应用包括语义分割,深度预测,关键点预测和边缘检测。这些任务类似于光流估计,因为它们涉及像素级预测。由于我们的结构很大程度上受到这些像素预测任务的启发,因此我们简要回顾一下不同的方法。
最简单的解决方案是以“滑动窗口”方式应用到传统CNN,因此为每个输入图像块(patch)计算单个预测(例如,类标签)。这在许多情况下都很有效,但是有缺点:高计算成本(即使是重用中间特征图的优化实现)和每个图像块性质,不考虑全局输出属性,例如锐边。另一种简单方法[17]是将所有特征图上采样到所需的全分辨率并将它们堆叠在一起,从而产生可用于预测连接在一起的像素级特征向量。
Eigen等通过训练额外的网络来细化比较粗糙深度图,该网络将粗略预测和输入图像作为输入。Dosovitskiy等人使用用'upconvolutional'层迭代地细化粗糙特征图。我们的方法整合了两个工作的想法。不同地是,我们不仅讨论了粗略预测,而且还讨论了整个粗略特征图,从而允许将更多高级信息传递给精细预测。我们将“upconvolutional”结果与网络中“contractive”部分的特征相结合。
已知卷积神经网络在给定足够的标记数据的情况下非常擅长学习输入 - 输出关系。因此,我们采用端到端的学习方法来预测光流:给定由图像对和真实光流组成的数据集,我们训练网络直接从图像中预测(x,y)光流场。但是,为达到此目的,什么是一个好的结构呢?
一个简单的选择是将两个输入图像堆叠在一起输入网络,允许网络自己决定如何处理图像对以提取运动信息。这在图2中说明。我们称这种仅包含卷积层的结构叫做'FlowNetSimple'。
原则上,如果该网络足够大,它可以学习预测光流。但是,我们永远无法确定像SGD这样的局部梯度优化可以使网络达到最优点。因此,手动设计不太通用的结构可能是有益的,但是使用给定的数据和优化技术能更好地执行。
一个简单的步骤是为两个图像创建两个独立但相同的处理流,并在稍后阶段将它们组合,如图2所示(底部)。利用这种结构,网络被限制为首先分别产生两个图像的有意义的表示,然后将它们组合在更高的层次上。当首先从两个图像的片段中提取特征然后比较这些特征向量时,这大致类似于标准匹配方法。但是,给定两幅图像的特征表示,网络如何找到对应关系?
为了在这个匹配过程中帮助网络,我们引入了一个“correlation layer”,它在两个特征图之间执行multiplicative patch(以第一个特征图上x1为中心的patch与第二个特征图上以x2为中心的patch,两个patch大小都规定为K,做对应位置特征值相乘的和,得出结果就是两patch之间的关系,其实就是特征在空间上做卷积)比较。包含该层的网络架构“FlowNetCorr”的图示如上图所示。给出两个多通道特征图f1,f2。其中w,h和c是它们的宽度,高度和通道数,我们的相关层让网络将f1中的每个patch块与来自f2的每个位置进行比较。
目前我们只考虑两个块的单一比较。将在第一个特征图中以x1为中心并且在第二个特征图以x2为中心的两个patch的“相关性”定义为:对于大小为K= 2k + 1的方形patch。
注意上式与神经网络中的卷积的一个步骤相同,但不是用滤波器卷积数据,而是将数据与其他数据卷积。因此,它没有可训练的权重。计算两个patch之间的复杂度是c*K*K。,由于x1可以与第二个特征图的patch计算互联系,所以计算所有patch组合的复杂度为c*K*K*(w*h)*(w*h),产生大的结果并使有效的前向和后向传递难以处理。因此,出于计算原因,我们限制了比较的最大位移,并在两个特征图中引入了步长stride。
给定最大位移d,对于每个位置x1,我们通过限制x2的范围仅在尺寸D= 2d + 1的邻域中计算相关性c。我们使用stride s1和s2来使计算量减少,即只在D的领域内跳着算相关性。
理论上,由相关产生的结果是四维的:对于两个2D位置的每个组合,我们获得相关值,即截取的patch的值的对应向量积的标量。在实践中,我们组织通道中的相对位移。这意味着我们获得了大小(w*h*D*D)的输出,例如,论文实验中的d=10,则D=21,若不计步长sride,经过相关层得到的特征图大小是w*h*(21*21=441),上图中又使用32个1*1卷积核做通道融合,最终特征图大小是w*h*473。
网络最后一部分的Refinement:CNN擅长通过卷积层和pooling交替来提取图像的高级抽象特征,即在空间上缩小特征图。池化对于使网络训练在计算上可行是必要的,并且更基本地,允许在输入图像的大区域上池化特征信息。但是,pooling会导致分辨率降低,因此为了提供密集的像素预测,我们需要一种方法来优化池化后的特征表示。
我们方法如图3所示。主要成分是“反卷积”层,包括uppooling(扩展特征图,而不是池化)和卷积。我们将“反卷积”应用于特征图上(绿色部分),并将其与来自网络的卷积部分的相应特征图(下图蓝色部分)和上采样得到的粗略光流预测(如果可用)连接。这样,我们既从粗略的特征图上保留了高级信息,又从更低层的特征图上保留了局部信息。每一步都会将分辨率提高两倍。我们重复这4次,产生预测光流,其分辨率仍然比输入小4倍。
我们发现,与计算量少的的双线性插值到全图分辨率相比,通过上述细化到全分辨率并不会显着改善结果。这种双线性插值的结果是网络预测的最终光流结果。
计算机视觉任务中的三种上采样方式:a、双线性插值 b、反卷积(转置卷积) c、反池化(unpooling)
在另一种方案中,我们使用[6]中的不使用匹配项的variational approach[:Large displacement optical flow: descriptor matching in variational motion estimation]替代双线性插值:我们从4倍下采样分辨率开始,然后使用粗略到精细的方案进行20次迭代,使光流达到全分辨率。最后,我们以完整的图像分辨率再运行5次迭代。我们另外用[26]的方法计算图像边界,并通过用代替平滑系数来考虑检测到的边界,其中表示在各自的比例和像素之间重新采样的边界强度。这种方法在计算上比简单的双线性插值计算量更大,但增加了variational approach的优点,以获得平滑和像素级更精确的光流场。在下文中,我们用“+ v”后缀表示通过这种方法获得的结果。
EPE(endpoint error):评价光流法的一种方法。指所有像素点的gound truth和预测出来的光流之间差别距离(欧氏距离)的平均值,越低越好。
上图展示了使用variational与不用的差距。对于第一行小运动,+v使边界更清晰,预测的光流更准确。对于第二行的大位移运动,明显的错误依然存在,但是边界更平滑,导致了EPE更小。上图中,颜色代表了方向,深浅代表了位移大小。
与传统方法不同,神经网络需要真实的数据,不仅用于优化多个参数,而且用于学习从零开始执行任务。通常,获得真实数据是困难的,因为用于真实场景的像素对应的光流值不能容易地确定。表1给出了可用数据集的概述。
Middlebury数据集仅包含8个用于训练的图像对,其中使用四种不同技术生成真实的光流。位移非常小,通常低于10像素。
KITTI数据集较大(194个训练图像对)并且包括大位移,但仅包含非常特殊的运动类型。通过使用相机和3D激光扫描仪同时记录场景,从现实世界获得ground truth。这假定场景是刚性的,并且运动源于移动的观察者。而且,不能捕获远处物体的运动,例如天空,导致产生稀疏的光流。
MPI Sintel 数据集从渲染的人工场景中获取ground truth,特别注意真实的图像属性。提供了两个版本:最终版本包含运动模糊和天气效果,例如雾,而Clean版本不包含这些效果。Sintel是可用的最大数据集(每个版本1,041个训练图像对),并为小型和大型位移都提供密集的ground truth。
Sintel数据集仍然太小,无法训练大型CNN。为了提供足够的训练数据,我们创建了一个简单的合成数据集,我们将它命名为Flying Chairs,将仿射变换应用于从Flickr收集的图像和公开可用的3D椅子模型。我们从Flickr中检索964个分辨率为1024×768图像,分别来自城市类别(321),风景(129)和山峰(514)。我们将图像切割成4个象限,并使用512×384的裁剪图像作为背景。作为前景,我们将多个椅子的图像添加到背景中。从原始数据集中我们删除了非常相似的椅子,产生了809种椅子类型,每种有62个视图。
为了生成运动,我们随机抽样背景和椅子的仿射变换参数。椅子的变换与背景变换有关,可以将其解释为相机和物体都在移动。使用变换参数,我们得出第二个图像、光流场和遮挡区域。
随机采样每个图像对的所有参数(椅子的数量,类型,尺寸和初始位置,变换参数)。我们调整这些参数的随机分布,使得得到的位移直方图类似于Sintel中的位移直方图(细节可以在补充材料中找到)。使用这种方法,我们生成一个包含22,872个图像对和光流场的数据集。注意,这个尺寸是任意选择的,原则上可以更大。
一种广泛使用的改进神经网络泛化性的方法是数据增强。即使Flying Chairs相当大,我们发现使用数据增强对于避免过度拟合仍然很重要。我们在网络训练期间进行在线增强。我们使用的增强包括几何变换:平移,旋转和缩放,以及加高斯噪声和改变亮度,对比度,gamma和颜色。所有这些操作都在GPU上处理。
我们不仅要增加图像多样性,还要增加光流场多样性,所以我们在图像对上应用相同强度几何变换,但是在两幅图像上还加了小的相对变换。我们通过图像对的一个图像上的增强方法应用到光流场上相应的调整光流场。
下表显示了我们网络的EPE以及在公共数据集(Sintel,KITTI,Middlebury)和Flying Chairs上的几种表现良好的方法。另外,我们显示了在Sintel上不同方法的运行时间。
仅在非现实Flying Chairs上训练的网络在真实光流数据集上表现非常好,例如击败了众所周知的LDOF方法。在Sintel上对网络进行微调之后,我们的网络在Sintel Final和KITTI上的表现优于实时方法EPPM,同时速度提高了两倍。
Sintel。从表2可以看出,FlowNetC在Sintel Clean上优于FlowNetS,而在Sintel Final上,FlowNetS更好。在这个复杂的数据集上,FlowNetS+ft+v甚至与DeepFlow相当。由于EPE通常有利于过度平滑的方法,因此有必要看到我们方法的定性结果。
KITTI。KITTI数据集包含强大的投影变换,这不同于在Flying Chairs训练的网络。尽管如此,原始网络输出已经相当不错,而且额外的微调和优化可以进一步提升。有趣的是,在Sintel上的微调改善了KITTI的结果,可能是因为Sintel中的图像和动作比Flying Chairs更自然。 FlowNetS在此数据集上优于FlowNetC。
Flying Chairs。我们的网络在Flying Chairs上训练的,因此预计在这个数据集上表现最佳。在训练时,我们留出了由640个图像组成的测试集。上表显示了在测试集的结果。可以看出FlowNetC优于FlowNetS,并且网络优于所有最先进的方法。另一个有趣的发现是,这是唯一一个variational refinement不能提高性能但会使结果变得更糟的数据集。
Timing。上表还显示了各种方法的运行时间。不幸的是,许多方法只提供了在CPU上的运行时间,而我们的方法是应用在GPU上的。可以看出,我们的FlowNetC和FlowNetS在结果保证的情况下,是很好的实时方法。
训练数据。为了检查我们是否从使用Flying Chairs数据集而不是Sintel中受益,我们仅在Sintel上训练了一个网络,留出验证集来考虑性能。由于积极的数据增强,即使是单独的Sintel也足以相当好地学习光流。在Sintel上进行测试时,仅在Sintel上接受过训练的网络的EPE比在Flying Chairs上训练、在Sintel上微调的网络大约高出1个像素值。
Flying Chairs数据集相当大,数据增强仍然是必要的吗?答案是肯定的:在Flying Chairs上训练没有数据增加的网络会导致在Sintel上测试时EPE增加大约2个像素。
比较网络。上表中的结果可以得出我们两种体系结构的优缺点。
首先,FlowNetS比FlowNetC在Sintel Final上的泛化性更好。另一方面,FlowNetC在Flying Chairs和Sintel Clean上的表现优于FlowNetS。请注意,Flying Chairs不包括运动模糊或雾,如Sintel Final。这些结果一起表明,即使两个网络的参数数量几乎相同,FlowNetC也会略微对训练数据过拟合。这并不意味着网络会记住训练样本,但它会适应训练期间呈现的数据类型。虽然在我们目前的设置中,这可以被视为一个弱点,如果有更好的可用训练数据,它可能会成为一个优势。
第二,FlowNetC似乎对大位移问题更大。一种解释是FlowNetC中的相关层固定了D的范围,不允许预测大位移。这个范围可以增加,但是会增大计算量。
基于卷积网络结构设计的最新进展,我们已经证明可以训练网络直接预测来自两个输入图像的光流场。有趣的是,训练数据不一定是真实的。人工Flying Chairs数据集仅包括合成的仿射运动,足以预测自然场景中的光流。这证明了所呈现的网络的泛化能力。在Flying Chairs的测试集上,CNN甚至超越了DeepFlow和EpicFlow等最先进的方法。随着更真实的训练数据变得可用,未来网络的表现将会很有趣。