文章目录
1 概述
1.1 题目
2015:卷积网络学习光流 (FlowNet: Learning optical flow with convolutional networks)
1.2 摘要
卷积神经网络 (CNN) 在计算机视觉领域取得了巨大的成功,尤其是在关于识别的应用上,而其光流评估 (Optical flow estimation) 上还需探索。本文在有监督场景下构建CNN以处理光流评估问题,提出和对比了两种架构:
- 通用架构;
- 能够将不同图像位置的特征向量相关联的架构。
由于已有的真实数据集过小不足以训练CNN,本文生成了一个大的合成数据集Flying chairs。实验表明:
- 在该数据上训练的网络可以很好地推广到现有的数据集,如Sintel和KITTI;
- 算法在5到10fps的帧速率下获得了具有竞争力的准确性。
1.3 代码
Torch:https://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 x−y光流。而什么才是能够达到这个目标的好架构呢?
CNN中的池化使网络训练在计算上更可行,更根本的是,允许在输入图像大面积内聚合信息。然而池化会降低分辨率,因此为了提供单像素预测,需要对粗池化表示进行细化。为此网络中包含一个扩展部分 (Expanding part) 以智能提升流的分辨率。收缩部分 (Contracting part) 和扩展部分将共同组成网络,如图2和图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:R2→Rc,其中 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 c⋅K2次乘法操作。比较所有的区块需要计算 w 2 ⋅ h 2 w^2\cdot h^2 w2⋅h2,这将导致很大的结果,在前向与反向时难以进行。因此,出于计算原因,我们限制了比较的最大位移 (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。
3 训练数据
与传统方法不同,神经网络不仅需要具有基本事实的数据来优化多个参数,还需要学习从头开始执行任务。一般而言,获取真是标签的困难的,因为与现实世界场景一致的正确像素并不能简单确定。一些可用数据集的基本信息如表1。
3.1 已有数据集
- Middlebury:
- 训练集仅包含8个图像对;
- 使用4种技术生成真实光流;
- 位移非常小,通常低于10像素。
- KITTI:
- 194个图像对;
- 包含大位移,但只有一种特殊的动作类型;
- 通过使用相机和3D激光扫描仪同时记录场景,从现实世界场景中获得基本事实;
- 假设场景刚性,动作流是因为观察者的移动;
- 无法捕捉到天空等远处物体的运动,导致光流基础事实稀疏。
- MPI Sintel:
- 从渲染的人工场景中获取真实图像,格外注重图像属性的真实性;
- 包含两个版本:a) 包含动作模糊和大气效应 (例如雾) 的最终版本;b) 不包含任何效应的清洁版本;
- 每个版本均有1041图像对;
- 为小和大位移提供了稠密真实标签。
3.2 Flying Chairs
Sintel数据集对于训练大型CNN来说太小了。为了提供充足的训练数据,通过对从Flickr收集的图像和一组公开可用的3D椅子模型渲染应用仿射变换创建了一个简单的合成数据集Flying Chairs:
- 从Flickr中的城市 (321)、景观 (129),以及山脉 (514) 类型中检索共964张分辨率为 1 , 024 × 768 1,024\times768 1,024×768的图像;
- 每张图像被裁剪为四个象限,裁剪后分别为 512 × 384 512\times384 512×384,并作为背景;
- 前景为多个椅子;
- 去除了相似的椅子后,椅子类型数为809,每个椅子有62个视图;
- 为了生成动作,对背景和椅子使用随机2D仿射变换参数;
- 椅子的变换与背景的变换相关,这可以被解释为相机和物体都在移动;
- 每个图像对、椅子的初始位置,以及变换参数都是随机的。这些参数的随机分布被调整,使生成的位移直方图类似于Sintel的直方图 (详细信息可在补充材料中找到);
- 生成22,872个图像对和流领域,每个背景被多次使用。
最终一些示意如图5。
3.3 数据增强
尽管Flying Chairs数据集很大,但是使用数据增强来避免过拟合是关键的。增强方式包括:
- 平移、旋转,以及缩放;
- 高斯噪声;
- 亮度、对比度、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 网络和训练细节
总体上保持不同网络的架构一致:
- 9个卷积层,其中6个步长为2,每层后接ReLU;
- 不包含全连接,这允许任意大小输入的图像;
- 第1个卷积层过滤器大小为 7 × 7 7\times7 7×7,2和3设置为 5 × 5 5\times5 5×5,余下为 3 × 3 3\times3 3×3;
- 特征图的数量在更深的层中增加,每层之后大约增加一倍,步幅为 2;
- 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;
- 训练损失使用EPE,其是用于光流评估的标准误差度量,使用预测的流向量和基础事实之间的欧式距离,在所有像素上取平均值;
- 为了训练 CNN,使用caffe框架的修改版本;
- Adam作为优化方法,其中 β 1 = 0.9 \beta_1=0.9 β1=0.9, β 2 = 0.999 \beta_2=0.999 β2=0.999;
- 训练批次为8,因为每个像素都是一个训练样本;
- 学习率 λ = 1 e − 4 \lambda=1e-4 λ=1e−4,在300k轮后每100k减半;FlowNetCorr的学习率 λ = 1 e − 6 \lambda=1e-6 λ=1e−6,10k后缓慢达到 1 e − 4 1e-4 1e−4,随后按如前所述的规律降低;
- FLying Chairs训练样本22,232,测试640;
- Sintel训练908,验证133;
- 发现在测试期间放大输入图像可能会提高性能。尽管最佳规模取决于特定的数据集,但为所有任务的每个网络固定了一次规模。对于FlowNetS,输入不升级,对于FlowNetC,缩放因子为1.25。
微调:所使用的数据集在它们包含的对象类型和运动方面非常不同。一个标准的解决方案是在目标数据集上微调网络。KITTI数据集很小,只有稀疏流基础事实。因此,选择在Sintel训练集上进行微调。一起使用来自Sintel的Clean和Final版本的图像,并使用低学习率 λ = 1 e − 6 \lambda=1e-6 λ=1e−6进行数千次迭代的微调。为了获得最佳性能,在使用验证集定义最佳迭代次数后,对整个训练集进行微调以获得相同的迭代次数。在表格中,“+ft”后缀表示的微调网络。
4.2 结果