最近卷积神经网络在计算机视觉领域取得了成功,但是光流估计没有在这些任务的CNN中取得成功,这篇文章主要是用CNN以一个有监督的方式来解决光流估计,我们提出了两个网络结构:一个是普通的CNN,另外一个是包括一个层,这一层是包括使不同图像位置的特征向量相关的层。由于现有ground truth的数据集不足以训练CNN,因此我们生成了一个大型的合成飞行椅数据集。我们表明,使用这种不真实的数据训练的网络仍然可以很好地推广到现有数据集(例如Sintel和KITTI),并在5到10 fps的帧率下获得具有竞争力的准确性。
1.深度学习在很多领域应用成功,所以我们使用利用一对图像来训练深度学习网络来预测光流,但是我们不知道光流能否预测成功,所以我们还使用了相关操作层,但是令人惊喜的是,即使没有使用相关操作层,网络也可以成功的预测光流。
2.由于数据的缺乏所以我们用flying chair数据集构造了给网络的数据
3.我们达到了时实方法的state-of-the-art的结果,每秒可以预测10个光流图,即10个图像对。
1.目前主流的计算光流的方法是变分的方法, 当然还有一些别的方法, 其中变分方法主要是用来优化我们网络的输出的(即做为一个后处理的方式)。
2.有一些机器学习的方法
3.有一些无监督的方法,尽管这些方法在受控的设置中效果很好,并且学习了可用于视频中活动识别的特征,但与现实视频中的经典方法相比,它们并不具有竞争力。
4.尽管还没有CNN方法用来估计光流,但是神经网络在其他的视觉任务中做了很多的工作,如特征匹配,图像相似度,但是我们的方法和他们不同的是我们可以直接输出完整的光流场。
5.最近的语义分割,深度预测,关键点预测,边缘检测在神经网络上的成就给了我的灵感。
6.与Long等人不同,我们不仅对粗略的预测进行“向上卷积”,而且对整个粗略的特征图进行“向上卷积”,从而可以将更多的高级信息传递给精细的预测。 与Dosovitskiy等人不同,我们将“向上卷积”结果与网络“可收缩”部分的特征连接在一起。【这里具体是怎么连接的?】
【什么叫对每个底部的块进行求导?】
Traing data:
训练数据的groud truth一般很难得到,下面介绍几种不同的数据集
Middlebury dataset:仅仅包含8个图像对用于训练,位移很小,不超过10个像素。
KITI dataset:包括194个图像对,是比较大的位移,包含了比较特殊的运动模式,这个ground truth是从真实世界获得的,用照相机和3D Slicer获得的,这假定场景是刚性的,并且运动源于移动的观察者。 而且,无法捕获远处物体(例如天空)的运动,从而导致稀疏的光流Ground truth。
MPI Sintel:数据集从渲染的人工场景中获取ground truth,并特别注意真实的图像属性。提供了两个版本:最终版本包含运动模糊和大气效果,例如雾,而“纯净”版本不包含这些效果。 Sintel是最大的数据集(每个版本有1,041个训练图像对),并提供了很多大位移和小位的密集的ground truth。
Flying chairs:
Sintel数据集仍然太小,无法训练大型CNN。 为了提供足够的训练数据,我们通过将仿射变换应用于从Flickr收集的图像以及一组公开可用的3D椅子模型的渲染[1],创建了一个简单的合成数据集,我们将其命名为Flying Chairs。我们从Flickr 2检索了964张图像 分辨率为“城市”(321),“风景”(129)和“山”(514)类别的1024×768。 我们将图像切成4个块,并使用生成的512×384图像裁剪作为背景。
为了产生运动,我们随机采样背景和椅子的2D仿射变换参数。 椅子的变换是相对于背景的变换而言的,可以将其解释为相机和物体的移动。 使用变换参数,我们生成第二个图像,ground truth光流和遮挡区域。
每个图像对的所有参数(椅子的数量,类型,大小和初始位置;转换参数)均被随机采样。 我们调整这些参数的随机分布,使所得的位移直方图类似于Sintel的直方图(详细信息可以在补充材料中找到)。 使用此过程,我们生成具有22,872个图像对和光流场的数据集(我们多次重复使用每个背景图像)。 注意,该大小是任意选择的,原则上可以更大【这个size指的是什么?,构造图像的具体操作为还不是特别清楚 答:指的是数据集的数量可以变得更多,具体操作当你需要实现这个方法的时候可以去找代码】。
在训练的时候做数据增强:translation, 旋转,缩放,高斯噪声,明亮度变化,对比度变化,gamma, color,
因为不仅仅想增加图像数据,我们还想增加光流数据,所以在图像对之间也应用了一些变换
我们在Sintel,KITTI和Middlebury数据集以及合成的Flying Chairs数据集上报告了网络的结果。 我们还对Sintel数据上的网络进行了微调【为什么在Sintel数据上微调?】,并对预测的光流场进行了变分方法的优化。 此外,与其他方法相比,我们报告了网络的运行时间。
我们所训练的网络的确切架构如图2所示。总的来说,我们试图保持不同网络的架构是一致的:它们有9个卷积层,其中6个步长是2(最简单的池形式),每一层斗都有都有一个非线性的ReLU。我们没有任何全连接层,这使得网络可以将任意大小的图像作为输入。在更深的网络层方向卷积滤波器的大小会减少:第一层的7x7,下面两层的5x5,从第4层开始的3x3。在更深层的层中,特征图的数量增加,每一个步长为2的层都增加了2倍。对于FlowNetC中的相关层,我们选择了参数k=0,d=20,s_1=1,s_2=2。作为训练损失,我们使用了endpoint error (EPE),这是光流估计的标准误差测量方法。它是预测的光流向量和ground truth之间的欧氏距离,在所有像素上平均超。
【这里的s1和s2在相关层中到底是怎么使用的?s1是第一个特征的像素点选择的步长,s2是第二个特征的像素点选择的步长,比如说选择s1中的每个像素与s2一定范围内的像素做相关操作,这个s2里的固定范围不是每个都取,所以有个步长的限制,步长为2即每两个像素取一个用来做相关操作。EPE损失到底是什么?】
为了训练CNNs,我们使用了一个修改版的caffe[20]框架。我们选择Adam [22]作为优化方法,因为对于我们的任务,它显示的收敛速度快于标准的带有动量的随机梯度下降。如[22]推荐的那样,我们固定Adam的参数: β_1 = 0.9 and β_2 = 0.999。因为,从某种意义上说,每个像素都是一个训练样本,我们使用相当小的小批量的8个图像对。我们从学习速率从 λ = 1e−4开始,然后在第一个300 k之后,每100 k次迭代除以2。使用FlowNetCorr,我们可以观察到λ = 1e−4梯度爆炸。为了解决这个问题,我们从一个非常低的学习率 λ = 1e−6开始,在10 k次迭代之后慢慢地将它增加到 λ = 1e−4,然后按照刚才描述的时间表进行。
为了在训练和微调过程中监测过度拟合,我们将 Flying Chairs的数据集分成了22,232个训练和640个测试样本,并将Sintel训练集分成908个训练和133个验证对。
我们发现在测试过程中增大输入图像可以提高性能。尽管最优的规模取决于具体的数据集,但是我们为每个网络所有任务固定了的规模。对于FlowNetS来说,我们并不上采样,对于FlowNetC我们选择了1.25的因数【这里1.25的指的是什么?指的是对输入图像增大一点】。
微调。所使用的数据集在对象类型和它们所包含的运动方面是非常不同的。标准的解决方案是在目标数据集上对网络进行微调。KITTI数据集很小,只有稀疏的流场ground truth。因此,我们选择在Sintel训练集上进行微调,我们使用来自Sintel的干净和最终版本的图像,并在使用低学习率λ = 1e−6迭代几千次进行微调。为了获得最佳性能,在定义了使用验证集的最佳迭代次数之后,我们将对整个训练进行微调,以获得相同数量的迭代。在表格中,我们表示带有“+ft”后缀的finetuned网络。【为什么在Sintel数据集上微调?在什么数据集上测试就在什么数据集上微调】
5.2. 结果
表2显示了我们的网络的endpoint error (EPE) 和公共数据集(Sintel、KITTI、Middlebury)的几个性能良好的方法,以及我们的Flying Chairs据集。另外,我们展示了在Sintel上不同方法的运行时间。
网络在不真实的Flying Chairs,在真实正的光学流数据集上表现得很好,例如打败了著名的LDOF [6]方法。在Sintel进行微调之后,我们的网络可以Sintel Final和KITTI数据集中优于实时的方法,并且速度是它的两倍。
Sintel。从表2中可以看出,FlowNetC比FlowNetS在Sintel Clean上好,而在Sintel Final,情况发生了变化。在这个困难的数据集上,FlowNetS+ft+v甚至与DeepFlow持平。由于平均end-point 错误通常倾向于过于平滑的解决方案,因此我们的方法的定性结果很有趣。图6显示了两个FlowNets(没有微调)所预测的原始光流的例子,与ground truth and EpicFlow对比。该图显示了网络通常如何产生视觉上吸引人的结果,但在endpoint错误方面仍然更差。仔细观察一下就会发现,其中一个原因可能是网络的非平滑输出,尤其是在大的光滑的背景区域。【这里的非平滑输出指的是什么?即指指标EPE更倾向于平滑的图像,而网络恰恰又容易输出不平滑的图像,所以作者想表达的是,网络其实效果很好,只是不平滑】我们可以用变分的方法改进来和部分补偿。
KITTI。KITTI数据集包含强大的映射转换,这与网络在训练Flying Chairs训练时遇到的非常不同。尽管如此,原始的网络输出已经相当不错了,额外的微调和变分的细化会带来进一步的提升。有趣的是,Sintel的微调改善了KITTI的结果,可能是因为Sintel中图像的动作比在 Flying Chairs上更自然。在这个数据集上,flownetS优于FlowNetC
Flying Chairs。我们的网络是在Flying Chairs上训练的,因此人们期望在这些椅子上表现最好。在训练时,我们不考虑由640张图片组成的测试集。表2显示了这个测试集中的各种方法的结果,一些示例预测显示在图7中。我们可以看到,FlowNetC的表现优于FlowNetS和于有最先进的方法。另一个有趣的发现是,这是唯一的数据集,在这种情况下,变分的细化不会提高性能,但会使事情变得更糟。显然,网络可以比其他改进做得更好。这表明,通过更实际的训练集,网络可能在其他数据上表现得更好。
时间。在表2中,我们显示每帧在几秒钟内不同方法的运行时间。不幸的是,许多方法只在单个CPU上提供运行时,而我们的FlowNet只使用GPU来实现。虽然网络的错误率低于先进的水平,但它是实时方法中最好的。对于网络的训练和测试,我们使用的是NVIDIA GTX Titan GPU。DeepFlow和EpicFlow的CPU时间是从 [30]获得的,而LDOF的计时是在一个2.66 GHz的内核上计算的。
训练数据。为了检查我们是否从使用Flying Chairs 数据集而不是Sintel中获益,我们在Sintel上训练了一个网络,留出了一个验证集来控制性能。多亏了积极的数据扩充,即使是Sintel也足以很好地学习光流。在Sintel进行测试时,专门在Sintel上进行训练的网络其EPE比在Flying Chairs上训练并对Sintel进行微调的网络要高1个像素。
Flying Chairs数据集相当大,所以数据扩充仍然是必要的吗?答案是肯定的:在不增加数据的情况下训练一个网络,在Sintel测试中会增加大约2个像素。
比较架构。表2中的结果允许我们对我们测试的两个架构的优势和劣势得出结论。
首先,FlowNetS在Sintel Final优于FlowNetC。另一方面,FlowNetC在Flying chairs and Sintel Clean上表现优于FlowNetS。请注意,Flying chairs不包括运动模糊或雾,就像在Sintel Final中一样。这些结果共同表明,尽管两个网络的参数数量几乎相同,但FlowNetC更容易过拟合于训练数据【这个过拟合的结论如何得到的?】。这并不意味着网络会记住训练样本,但它会适应训练过程中所呈现的数据类型。尽管在我们目前的设置中,这可能被视为一个弱点,如果有更好的训练数据可用,它将成为一个优势。
其次,FlowNetC在大位移问题上似乎有更多的问题。这可以从上面讨论的KITTI的结果中看到,也可以从Sintel Final的详细性能分析中看到(表中没有显示)。flownetS+ft实现了s40+错误(在像素上以至少40像素的位移)为43.3 px,而对于FlowNetC+ft来说,这个值是48 px。一种解释是,这种相关性的最大位移不允许预测非常大的运动。这个范围可以增加,但是以计算效率为代价【这个一定是计算效率吗所带来的影响吗?】
基于最近在卷积网络架构设计方面的进展,我们已经证明了可以训练一个网络来直接预测来自两个输入图像的光流。有趣的是,训练数据不一定是现实的。人工Flying Chairs数据集,包括合成刚性物体的仿射运动,足以预测自然场景中的光流,具有较强的准确性。这证明了所提供的网络的泛化能力。在Flying Chairs的测试中,CNNs甚至比DeepFlow和EpicFlow等最先进的方法更有优势。随着更加现实的培训数据的出现,我们将会看到未来的网络是如何运作的。
论文有部分为转载:过几天把地址贴上