论文阅读 (78):FlowNet: Learning Optical Flow with Convolutional Networks

1 概述

1.1 题目

2015:卷积网络学习光流 (FlowNet: Learning optical flow with convolutional networks)

1.2 摘要

卷积神经网络 (CNN) 在计算机视觉领域取得了巨大的成功,尤其是在关于识别的应用上,而其光流评估 (Optical flow estimation) 上还需探索。本文在有监督场景下构建CNN以处理光流评估问题,提出和对比了两种架构:

  1. 通用架构;
  2. 能够将不同图像位置的特征向量相关联的架构。

由于已有的真实数据集过小不足以训练CNN,本文生成了一个大的合成数据集Flying chairs。实验表明:

  1. 在该数据上训练的网络可以很好地推广到现有的数据集,如Sintel和KITTI;
  2. 算法在5到10fps的帧速率下获得了具有竞争力的准确性。

1.3 代码

Torchhttps://github.com/ClementPinard/FlowNetPytorch

1.4 引用

@inproceedings{Dosovitskiy:2015:27582766,
author      =   {Alexey Dosovitskiy and Philipp Fischer and Eddy Ilg and Philip Hausser and Caner Hazirbas and Vladimir Golkov and Patrick Van-Der-Smagt and Daniel Cremers and Thomas Brox},
title       =   {{FlowNet}: {L}earning optical flow with convolutional networks},
booktitle   =   {{CVPR}},
pages       =   {2758--2766},
year        =   {2015}
}

2 网络架构

在足量有标签数据下,CNN擅长学习输入与输出的相关性。因此本文采用端到端学习方法来预测光流:给定包含图像对和真实光流的数据集,训练神经网络从图像直接预测 x − y x-y xy光流。而什么才是能够达到这个目标的好架构呢?

CNN中的池化使网络训练在计算上更可行,更根本的是,允许在输入图像大面积内聚合信息。然而池化会降低分辨率,因此为了提供单像素预测,需要对粗池化表示进行细化。为此网络中包含一个扩展部分 (Expanding part) 以智能提升流的分辨率。收缩部分 (Contracting part) 和扩展部分将共同组成网络,如图2图3

图2:两个网络架构:FlowNetSimple和FlowNetCorr。绿色漏斗是 图3所示的扩展细化部分

图3:粗特征图到高分辨率预测的细化

2.1 收缩部分

一个简单的选择是将两个输入图像堆叠在一起,并传递给一个通用网络,允许网络自行决定如何处理图像对以提取运动信息,如图2顶部。本文将只包含卷积层的网络架构称为FlowNetSimple

另一个方法是两张图像创建分离的处理流,并在后继集合它们,如图2顶部。使用这种架构,网络被限制为首先分别生成两个图像的有意义表示,然后在更高级别上将它们组合起来。这大致类似于标准匹配方法,即首先从两个图像的块中提取特征,然后比较这些特征向量。然而,给定两张图像的特征表示,网络如何寻找一致性呢?

为了在匹配过程中协助网络,引入相关层 (Correlation layer) 以在两个特征图之间执行乘法区块比较 (Multiplicative patch comparisons)。FlowNetCorr架构包含了该层,如图2底部。给定两个多通道特征图 f 1 , f 2 : R 2 → R c \mathbf{f}_1,\mathbf{f}_2: \mathbb{R}^2\to\mathbb{R}^c f1,f2:R2Rc,其中 w , h , c w,h,c w,h,c是它们的宽、高,以及通道数。相关层则用于比较两个特征图中每个区块。

以只考虑两个区块之间的单次比较为例,第一个特征图中以 x 1 \mathbf{x}_1 x1为中心和第二个特征图中以 x 2 \mathbf{x}_2 x2为中心的两个区块的相关性定义为:
c ( x 1 , x 2 ) = ∑ o ∈ [ − k , k ] × [ − k , k ] ⟨ f 1 ( x 1 + o ) , f 2 ( x 2 + o ) ⟩ (1) \tag{1} c(\mathbf{x}_1,\mathbf{x}_2)=\sum_{\mathbf{o}\in[-k,k]\times[-k,k]}\left\langle \mathbf{f}_1(\mathbf{x}_1+\mathbf{o}), \mathbf{f}_2(\mathbf{x}_2+\mathbf{o}) \right\rangle c(x1,x2)=o[k,k]×[k,k]f1(x1+o),f2(x2+o)(1)其中方形区块的大小为 K : 2 k + 1 K:2k+1 K:2k+1公式1与卷积中的一个步骤类似,不同在于其将数据与其他数据进行卷积,而非数据与过滤器。因此,它没有可训练权重。

c ( x 1 , x 2 ) c(\mathbf{x}_1,\mathbf{x}_2) c(x1,x2)的计算涉及 c ⋅ K 2 c\cdot K^2 cK2次乘法操作。比较所有的区块需要计算 w 2 ⋅ h 2 w^2\cdot h^2 w2h2,这将导致很大的结果,在前向与反向时难以进行。因此,出于计算原因,我们限制了比较的最大位移 (Maximum displacement),并在两个特征图中引入了步幅

给定最大位移 d d d,对于每一个定位 x 1 \mathbf{x}_1 x1,通过限制 x 2 \mathbf{x}_2 x2的范围, c ( x 1 , x 2 ) c(\mathbf{x}_1,\mathbf{x}_2) c(x1,x2)计算只在大小 D : = 2 d + 1 D:=2d+1 D:=2d+1的领域内进行。步幅 s 1 s_1 s1 s 2 s_2 s2被用于量化 x 1 \mathbf{x}_1 x1,并在以 x 1 \mathbf{x}_1 x1为中心的邻域内量化 x 2 \mathbf{x}_2 x2

理论上,相关性的计算是四维的:对于两个2D位置的每一个组合获得一个相关性值,即两个向量的标量积,两个标量分别包含裁剪后区块的值。实际上,相对位移发生在通道上,意味着输出的大小为 ( w × h × D 2 ) (w\times h\times D^2) (w×h×D2)。对于反向传递,本文相应实现了关于每个底部blob的导数。

2.2 扩展部分

扩展部分的主要组成是上卷积层 (Upconvolutinal layers),其包括反池化 (Unpooling) (扩展特征图,而非池化) 和卷积。为了实现细化 (Refinement),上卷积被应用于特征图,并将其与来自收缩部分的相应特征图和上采样的较粗流预测 (如果可用) 连接起来。通过这种方式,我们既保留了从较粗特征图传递的高级信息,也保留了在较低层特征图中提供的精细局部信息。每一步都会将分辨率提高两次。我们重复 4 4 4次,得到一个预测流,其分辨率仍然比输入小 4 4 4倍。整体架构如图3所示。我们发现,与计算成本较低的双线性上采样到全图像分辨率相比,从该分辨率进一步细化并不会显着改善结果。

2.3 变分细化 (Variational refinement)

在替代方案的最后阶段,我们使用没有匹配项的变分方法代替双线性上采样:从四次下采样分辨率开始,然后使用粗到细方案进行20次迭代,从而使得流场 (Flow field) 达到全分辨率。最后,以完整的图像分辨率再运行五次迭代。还使用一些方法来计算图像边界,并通过将平滑系数替换为 α = exp ⁡ ( λ b ( x , y ) κ ) \alpha=\exp(\lambda b(x,y)^\kappa) α=exp(λb(x,y)κ)来检测边界,其中 b ( x , y ) b(x,y) b(x,y)表示在相应尺度和像素之间重新采样的细边界强度。这种放大方法比简单的双线性上采样在计算上更昂贵,但增加了变分方法,可以获得平滑和亚像素精度的流畅。后继通过"+v"后缀来表示该结果是变分细化的,其一个示意如图4

图4:变分细化的效用。第一行为小位移情况,预测流将剧烈变化。第二行为大位移情况,尽管大的错误不会被纠正,但是流更平滑,其EPE (*Endpoint error*) 也更低。

3 训练数据

与传统方法不同,神经网络不仅需要具有基本事实的数据来优化多个参数,还需要学习从头开始执行任务。一般而言,获取真是标签的困难的,因为与现实世界场景一致的正确像素并不能简单确定。一些可用数据集的基本信息如表1

表1:可用数据集的大小,以及Flying Chairs数据集的信息

3.1 已有数据集

  1. Middlebury
  • 训练集仅包含8个图像对;
  • 使用4种技术生成真实光流;
  • 位移非常小,通常低于10像素。
  1. KITTI
  • 194个图像对;
  • 包含大位移,但只有一种特殊的动作类型;
  • 通过使用相机和3D激光扫描仪同时记录场景,从现实世界场景中获得基本事实;
  • 假设场景刚性,动作流是因为观察者的移动;
  • 无法捕捉到天空等远处物体的运动,导致光流基础事实稀疏。
  1. MPI Sintel
  • 从渲染的人工场景中获取真实图像,格外注重图像属性的真实性;
  • 包含两个版本:a) 包含动作模糊和大气效应 (例如雾) 的最终版本;b) 不包含任何效应的清洁版本;
  • 每个版本均有1041图像对;
  • 为小和大位移提供了稠密真实标签。

3.2 Flying Chairs

Sintel数据集对于训练大型CNN来说太小了。为了提供充足的训练数据,通过对从Flickr收集的图像和一组公开可用的3D椅子模型渲染应用仿射变换创建了一个简单的合成数据集Flying Chairs:

  1. 从Flickr中的城市 (321)、景观 (129),以及山脉 (514) 类型中检索共964张分辨率为 1 , 024 × 768 1,024\times768 1,024×768的图像;
  2. 每张图像被裁剪为四个象限,裁剪后分别为 512 × 384 512\times384 512×384,并作为背景;
  3. 前景为多个椅子;
  4. 去除了相似的椅子后,椅子类型数为809,每个椅子有62个视图;
  5. 为了生成动作,对背景和椅子使用随机2D仿射变换参数;
  6. 椅子的变换与背景的变换相关,这可以被解释为相机和物体都在移动;
  7. 每个图像对、椅子的初始位置,以及变换参数都是随机的。这些参数的随机分布被调整,使生成的位移直方图类似于Sintel的直方图 (详细信息可在补充材料中找到);
  8. 生成22,872个图像对和流领域,每个背景被多次使用。

最终一些示意如图5

图5:Flying Chair示意。前三列:图像对和颜色编码流领域;后三列:扩充后的图像对和相应的流领域

3.3 数据增强

尽管Flying Chairs数据集很大,但是使用数据增强来避免过拟合是关键的。增强方式包括:

  1. 平移、旋转,以及缩放;
  2. 高斯噪声;
  3. 亮度、对比度、gamma,以及颜色。

一些增强结果如图5。由于不仅要增加图像的种类,还要增加流场的种类,我们对一对图像应用相同的强几何变换,但另外在两幅图像之间应用较小的相对变换。

具体地, x x x y y y的平移范围是图像宽的 [ − 20 % , 20 % ] [-20\%,20\%] [20%,20%];旋转角度为 [ − 17 ° , 17 ° ] [-17°,17°] [17°,17°];缩放比例为 [ 0.9 , 2.0 ] [0.9,2.0] [0.9,2.0];高斯噪声的sigma均匀采样自 [ 0 , 0.04 ] [0,0.04] [0,0.04];对比度为采样为 [ − 0.8 , 0.4 ] [-0.8,0.4] [0.8,0.4];每个图像的RGB通道的乘法颜色变化来自 [ 0.5 , 2 ] [0.5,2] [0.5,2];gamma值为 [ 0.7 , 1.5 ] [0.7,1.5] [0.7,1.5];亮度改变基于sigma为 0.2 0.2 0.2的高斯噪声。

4 实验

实验包括四个数据集上本文网络的结果,Sintel数据集微调和预测流领域上的变分细化的结果,以及和其他对比方法的时间对比。

4.1 网络和训练细节

总体上保持不同网络的架构一致:

  1. 9个卷积层,其中6个步长为2,每层后接ReLU;
  2. 不包含全连接,这允许任意大小输入的图像;
  3. 第1个卷积层过滤器大小为 7 × 7 7\times7 7×7,2和3设置为 5 × 5 5\times5 5×5,余下为 3 × 3 3\times3 3×3
  4. 特征图的数量在更深的层中增加,每层之后大约增加一倍,步幅为 2;
  5. FlowNetC中相关层中, k = 0 k=0 k=0 d = 20 d=20 d=20 s 1 = 1 s_1=1 s1=1,以及 s 2 = 2 s_2=2 s2=2
  6. 训练损失使用EPE,其是用于光流评估的标准误差度量,使用预测的流向量和基础事实之间的欧式距离,在所有像素上取平均值;
  7. 为了训练 CNN,使用caffe框架的修改版本;
  8. Adam作为优化方法,其中 β 1 = 0.9 \beta_1=0.9 β1=0.9 β 2 = 0.999 \beta_2=0.999 β2=0.999
  9. 训练批次为8,因为每个像素都是一个训练样本;
  10. 学习率 λ = 1 e − 4 \lambda=1e-4 λ=1e4,在300k轮后每100k减半;FlowNetCorr的学习率 λ = 1 e − 6 \lambda=1e-6 λ=1e6,10k后缓慢达到 1 e − 4 1e-4 1e4,随后按如前所述的规律降低;
  11. FLying Chairs训练样本22,232,测试640;
  12. Sintel训练908,验证133;
  13. 发现在测试期间放大输入图像可能会提高性能。尽管最佳规模取决于特定的数据集,但为所有任务的每个网络固定了一次规模。对于FlowNetS,输入不升级,对于FlowNetC,缩放因子为1.25。

微调:所使用的数据集在它们包含的对象类型和运动方面非常不同。一个标准的解决方案是在目标数据集上微调网络。KITTI数据集很小,只有稀疏流基础事实。因此,选择在Sintel训练集上进行微调。一起使用来自Sintel的Clean和Final版本的图像,并使用低学习率 λ = 1 e − 6 \lambda=1e-6 λ=1e6进行数千次迭代的微调。为了获得最佳性能,在使用验证集定义最佳迭代次数后,对整个训练集进行微调以获得相同的迭代次数。在表格中,“+ft”后缀表示的微调网络。

4.2 结果



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值