MegaDepth: Learning Single-View Depth Prediction from Internet Photos
Abstract
单视图深度预测是计算机视觉中的一个基本问题。近年来,深度学习方法取得了长足的进步,但这种方法受到现有训练数据的限制。目前基于3D传感器的数据集有一些关键的限制,包括仅含室内图像(NYU)、少量训练示例(Make3D)和稀疏采样(KITTI)。我们提议使用多视点互联网照片集合,一个几乎无限的数据源,通过现代的结构-从运动和多视点立体(MVS)方法生成训练数据,并提出一个大的深度数据集称为MegaDepth基于这个想法。来自MVS的数据也有其自身的挑战,包括噪音和不可重建的对象。我们使用新的数据清理方法来解决这些挑战,并使用使用语义分割生成的顺序深度关系来自动增强数据。我们验证了大量的互联网数据的使用,通过显示训练过的模型不仅对新场景有很强的泛化能力,而且对Make3D、KITTI和DIW等不同的数据集也有很强的泛化能力,即使在训练过程中没有看到来自这些数据集的图像。
(一)介绍
从单个图像中预测3D形状是视觉推理的一个重要功能,在机器人、图形和其他视觉任务(如内在图像)中都有应用。虽然单视图深度估计是一个具有挑战性的、受限的问题,但深度学习方法最近已经推动了重大进展。这样的方法在接受大量数据训练时非常流行。遗憾的是,以(RGB图像、深度图)对的形式进行的完全一般训练数据很难收集。像Kinect这样的商用RGB-D传感器已经被广泛用于这种目的,但仅限于室内使用。激光扫描仪已经启用了一些重要的数据集,如Make3D[29]和KITTI[25],但是这些设备操作起来很麻烦(在工业扫描仪的情况下),或者制作稀疏深度地图(在激光雷达的情况下)。此外,Make3D和KITTI都是在特定场景中收集的(分别在大学校园和汽车顶部)。训练数据也可以通过众包生成,但这种方法目前仅限于收集稀疏序数关系或表面法线[12,4,5]。
在本文中,我们将探讨如何使用几乎无限的数据来源来解决这个问题:从重叠视点的互联网图像,从结构-运动(SfM)和多视点立体(MVS)方法可以自动产生密集深度。此类图像已广泛应用于大规模三维重建的研究[35,14,2,8]。我们建议将这些系统的输出作为机器学习方法的输入,用于单视图深度预测。通过使用来自世界各地拍摄的照片的大量不同的训练数据,我们寻求学习预测深度的准确性和概括性。基于这个想法,我们介绍了 MegaDepth (MD),这是一个从互联网照片集合中生成的大型深度数据集,我们将其完全提供给社区。
据我们所知,我们首次使用互联网SfM+MVS数据进行单视图深度预测。我们的主要贡献是MD数据集本身。此外,在创建MD时,我们发现从有噪声的MVS数据准备数据集时必须小心谨慎,因此我们还提出了处理原始MVS输出的新方法,并针对这些数据为训练模型提供了相应的新的损失函数。值得注意的是,由于MVS不倾向于重构动态对象(人、车等),我们使用从语义分割中自动导出的顺序深度关系来增强数据集,并使用包含序数项的联合损失进行训练。在我们的实验中,我们展示了通过在MD上的训练,我们可以学习一个模型,这个模型不仅可以很好地工作在新的场景的图像上,而且可以很好地推广到完全不同的数据集,包括Make3D, KITTI和DIW,实现了比以前的数据集更好的泛化。图1显示了从仅在MD数据集上训练的网络跨越不同测试集的示例结果。
(二)相关工作
单一视图深度预测。对于单视图深度预测,已有多种方法被提出,最近的方法是利用机器学习[15,28]。一种标准的方法是收集具有地面真深度的RGB图像,然后训练一个模型(例如,CNN)从RGB预测深度[7,22,23,27,3,19]。大多数这样的方法都是在一些标准数据集中进行训练的,如NYU [33, 34], Make3D[29],和KITTI[11],这些数据都是通过RGB-D传感器(如Kinect)或激光扫描捕捉到的。这种扫描方法有重要的局限性,正如在介绍中所讨论的。最近,**Novotny et al.[26]用SfM+MVS导出的3D模型对网络进行视频训练,学习单个物体的3D形状。**然而,他们的方法仅限于物体的图像,而不是场景。
场景的多视图也可以作为训练数据的隐式来源,用于单视图深度预测,利用视图合成作为监控信号[38,10,13,43]。然而,视图合成只是深度的一个代理,可能并不总是产生高质量的学习深度。Ummenhofer等人使用单台相机拍摄的重叠图像对进行训练,学习预测图像匹配、相机姿态和深度。但是,在测试时需要两个输入图像。
序列深度预测。另一种为训练收集深度数据的方法是让人们在图像中手动标注深度。虽然标记绝对深度很有挑战性,但人们擅长指定相对(顺序)深度关系(例如,close -than, further-than)[12]。Zoran等人[44]利用这种相对深度判断,利用CNNs预测点之间的序数关系。Chen等人利用有序深度标签的众包,在[4]中创建了一个名为“Depth in the Wild”的大型数据集。虽然这对于预测深度排序很有用(因此我们将从图像中自动生成的序数数据合并到一起),但是仅从序数数据学习的深度欧氏精度是有限的。
从互联网图片中预测深度。10年来,从互联网照片集合中估算几何形状一直是一个活跃的研究领域,在运动结构[35,2,37,30]和多视点立体结构[14,9,32]两方面都取得了进展。这些技术通常在10s到1000s的图像上运行。使用这种方法,过去的工作已经使用检索和SfM从单个图像[31]构建一个3D模型,或者将照片注册到现有的3D模型以转移深度[40]。然而,这项工作需要预先拥有每个位置的详细3D模型,或者在运行时构建一个。相反,我们使用SfM+MVS来训练一个网络,以推广到新的地点和场景。
(三)The MegaDepth Dataset
在本节中,我们将描述如何构造数据集。我们首先从Flickr下载网络照片,从Landmarks10K数据集[21]中获取一组拍摄良好的地标。然后我们用最先进的SfM和MVS方法在3D中重建每个地标。这就产生了一个SfM模型以及每个重建图像的稠密深度图。然而,这些深度图有明显的噪声和异常值,在这些原始深度数据上训练一个深度网络不会产生有用的预测。因此,我们提出了一系列的处理步骤,准备这些深度映射用于学习,并另外使用语义分割来自动生成序数深度数据。
3.1. 相片校正及重建
我们使用COLMAP,一个最先进的SfM系统30和MVS系统32,从每个照片集合中构建一个3D模型。我们使用COLMAP是因为我们发现它通过谨慎的增量式SfM过程生成高质量的3D模型,但也可以使用其他类似的系统。COLMAP为每个重建照片I生成深度映射D(如果COLMAP无法恢复深度,那么D的一些像素可能为空),以及其他输出,比如相机参数和稀疏SfM点,以及相机可见性。
3.2. 深度图改进
COLMAP的原始深度图包含了许多来自不同来源的异常值,包括:(1)在单个图像中出现的瞬态对象(人、车等),但是它们被分配了(不正确的)深度;(2)噪声深度不连续;(3)背景深度渗入前景对象。由于立体匹配中固有的模糊性,其他MVS方法也存在类似的问题。图2(b)显示了COLMAP生成的两个演示这些问题的深度地图示例。这些离群值对我们要训练的深度预测网络有很大的负面影响。为了解决这个问题,我们提出了两种新的深度细化方法来生成高质量的训练数据:
首先,我们设计了一种基于COLMAP的改进的MVS算法,但是在深度估计上更加保守,因为我们更倾向于减少训练数据而不是糟糕的训练数据。COLMAP迭代地计算深度映射,在每个阶段都试图确保附近深度映射之间的几何一致性。这种策略的一个不利影响是,背景深度可能会侵蚀前景对象,因为增加深度映射一致性的一种方法是一致地预测背景深度(参见图2(顶部))。为了应对这种影响,在COLMAP的每个深度推断迭代中,我们比较更新前后每个像素的深度值,并保持两者之间的较小(更接近)。然后我们应用中值滤波器来移除不稳定的深度值。我们在补充资料中详细描述了我们改进的MVS算法。
其次,我们利用语义分割来增强和过滤深度地图,并产生大量的顺序深度比较作为额外的训练数据。图2的第二行显示了使用对象感知过滤计算的深度映射示例。我们现在详细描述语义分割的使用。
3.3. 通过语义分割的深度增强
多视点立体视觉方法在很多物体类型上都存在问题,包括像人和汽车这样的瞬态物体,很难重建像极点和交通信号这样的物体,以及天空区域。然而,如果我们能够理解图像的语义布局,那么我们就可以尝试减轻这些问题,或者至少识别有问题的像素。我们发现,语义分割的深度学习方法开始变得足够可靠,可以使用[41]。
我们提出了语义分割在数据集创建中的三个新用途。首先,我们使用这样的分割去除假的MVS深度在前景区域。其次,我们使用分割作为一个标准来分类每一张照片提供欧几里德深度或序数深度数据。最后,我们将语义信息和MVS深度结合起来,自动标注序数深度关系,可以帮助MVS无法重建的区域进行训练。
语义过滤。为了处理给定的照片I,我们首先使用PSPNet[41]进行语义分割,这是一种最新的分割方法,训练于MIT场景解析数据集(包含150个语义类别)[42]。然后,根据预测的语义类别将像素划分为三个子集:
(1)前景对象,表示为F,对应于场景前景中经常出现的对象,包括静态前景对象(如雕像、喷泉)和动态对象(如人、车)。
(2)背景对象,表示B,包括建筑物、塔、山等(有关前景/背景类的详细信息,请参阅补充资料)。
(3)顶点,表示为S,在下面描述的深度滤波中作为一个特例。
我们用几种方式对像素进行语义分类。如图2(底部)所示,像人这样的瞬态物体会导致虚假的深度。从每张图片我删除这些,我们认为前景掩模的每个连通分支C F .如果< 50%的像素在C重建深度,我们抛弃所有深度从C,我们使用一个阈值为50%,而不是简单地去除所有前景深度,因为像素对某些对象在F(如雕塑)确实可以准确地重建(我们发现PSPNet有时错误雕塑和另一个人)。这种对前景深度的简单过滤可以大大提高深度地图的质量。
欧氏深度和顺序深度。对于每个3D模型,我们都有成千上万的网络重构照片,理想情况下,我们会尽可能多地使用这些深度数据进行训练。然而,一些深度地图比其他的更可靠,因为一些因素,如估计的相机姿势的准确性或存在大的遮挡物。因此,我们发现将训练限制在高度可靠的深度地图的一个子集是有益的。我们设计了一种简单而有效的方法来计算高质量深度贴图的子集,方法是通过阈值化的部分重建像素。特别地,如果大于30%的图像I(忽略天空区域S)由有效深度值组成,然后我们把这个图像作为训练数据来学习欧氏深度。这个标准更倾向于没有大的瞬态前景对象的图像(例如,没有自拍)。与此同时,这种重前景的图像对于另一个目的非常有用:自动生成训练数据以学习顺序深度关系。
自动顺序深度标注。如上所述,临时的或难以重建的物体,如人,汽车,和街道标志,经常在MVS重建中丢失。因此,仅使用互联网衍生的数据,我们将缺乏对这些对象的地面真值深度,并且很可能在学习重建它们方面做得很差。为了解决这个问题,我们提出了一种新的方法,根据训练图像的三维几何和语义分割,自动提取序列深度标签。
3.4. 创建数据集
我们使用上面的方法从世界各地的地标密集地重建了200个3D模型,代表了大约150K的重建图像。经过我们提出的过滤,我们得到了130K的有效图像。在这130K的照片中,欧几里德深度数据使用了大约100K的图像,剩下的30K图像用于派生序数深度数据。我们还将来自[18]的图像包含在我们的训练集中。这些数据一起组成了MegaDepth (MD)数据集,地址:http://www.cs.cornell.edu/projects/megadepth/。
(四)深度估计网络
本节介绍从单个照片预测深度的端到端深度学习算法。
4.1. 网络体系结构
我们评估了之前在单视图深度预测工作中使用的三个网络:VGG[6]、沙漏网络[4]和ResNet体系结构[19]。如第5节所述,沙漏网络表现最好。
4.2. 损失函数
暂略……
(五)估计
在本节中,我们将在大量数据集上评估我们的网络,并与在各种训练数据上训练的几种最先进的深度预测算法进行比较。在我们的评估中,我们试图回答几个问题,包括:
- 我们的模型在MD上训练的效果如何呢?
- 深度地图处理有多重要? 损失函数中这些项的作用是什么?
- 我们在MD上训练的模型对来自其他数据集的其他类型的图像的推广效果如何?
第三个问题可能是最有趣的,因为对大量不同数据的培训是很好的概括。因此,我们对一个数据集进行了一组实验训练,并对另一个数据集进行了测试,结果表明我们的MD数据集具有最佳的泛化性能。
我们还证明了我们的深度细化策略对于实现良好的泛化是必不可少的,并表明我们提出的将标度不变数据项与有序深度损失相结合的损失函数在数量和质量上都提高了预测性能。
实验设置。在我们的MD数据集中的200个重建模型中,我们随机选择了46个以形成一个测试集(在训练期间从未见过的位置)。对于剩下的154个模型,我们将每个模型的图像随机分为训练集和验证集,分别占96%和4%。我们使用交叉验证设置α=0.5和β=0.1。我们在PyTorch[1]中实现我们的网络,并使用Adam[17]对30个批次大小为32的epoch进行培训。