NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包

测量相对于相机的距离仍然很困难,但绝对是解锁自动驾驶、3D 场景重建和 AR 等激动人心的应用的关键。 在机器人技术中,深度是执行感知、导航和规划等多项任务的关键先决条件。

创建 3D 地图将是另一个有趣的应用程序,计算深度使我们能够将从多个视图捕获的图像投影到 3D 中。 然后,对所有的点进行配准和匹配,就可以完美地重构场景。

需要解决的一些具有挑战性的问题包括对应匹配,由于纹理、遮挡、非朗伯表面等原因,这可能很困难,解决歧义解决方案,其中许多 3D 场景实际上可以在图像平面上给出相同的图片 即预测深度不是唯一的。

从相机中检索距离信息因其相对便宜的生产成本和密集的表示而非常诱人。 将这项技术带给大众就像拥有一台现成可用的相机一样容易。 目前,检索深度的最佳替代方法是使用激光雷达等主动测距传感器。 它们是天然的高保真传感器,提供高度精确的深度信息。

从事深度估计工作,特别是在自动驾驶汽车的应用中,由于遮挡、场景中的动态物体和不完善的立体对应等各种原因,这确实具有挑战性。 对于立体匹配算法来说,反光、透明、镜面是最大的敌人。 例如。 汽车的挡风玻璃通常会降低匹配度,从而降低估计度。 因此,大多数公司仍然依靠激光雷达来可靠地提取距离。 然而,自动驾驶汽车感知堆栈的当前趋势正在转向传感器融合,因为每个传感器在提取的特征方面都有其优势。 尽管如此,自深度学习诞生以来,该领域已经获得了很大的关注并取得了显着的成果。 许多研究一直致力于解决这些问题。

在计算机视觉中,深度是从 2 种流行的方法中提取的。 即,单目图像(静态或连续)的深度或立体图像的深度,利用对极几何。 这篇文章将重点介绍深度估计的背景知识以及与之相关的问题。 需要对相机投影几何有充分的了解才能完成。

通过阅读本文,我希望你对一般的深度知觉有一个直观的了解。 此外,概述了深度估计研究的趋势和方向。 然后我们将讨论一些(许多)相关问题。

各种深度估计算法将在后续帖子中详细说明,以免被太多细节淹没!

1、我们如何看世界

图 2. 投射到视网膜上(左)。 投影到图像平面上(右)

让我们从人类一般如何感知深度开始。 这将为我们提供一些关于深度估计的有价值的见解,因为许多这些方法都源自我们的人类视觉系统。 机器视觉和人类视觉在图像形成方式上有相似之处(图 2)。 从理论上讲,当来自光源的光线照射到表面时,它会反射并指向我们的视网膜后部,将它们投射并且我们的眼睛将它们处理为 2D [1] 就像图像在图像平面上的形成方式一样。

那么当投影场景为 2D 时,我们如何实际测量距离并了解 3D 环境? 例如,假设有人要给你一拳,你本能地知道什么时候会被打,当他/她的拳头太近时就躲开! 或者当你开车时,你可以通过某种方式判断何时踩油门或踩刹车,以与众多其他司机和行人保持安全距离。

这里的工作机制是我们的大脑开始通过识别场景的大小、纹理和运动等模式来推理传入的视觉信号,这些模式被称为深度线索。 没有关于图像的距离信息,但我们可以通过某种方式毫不费力地解释和恢复深度信息。 我们感知场景的哪个方面离我们较近和较远。 此外,这些线索使我们能够将平面图像上的物体和表面视为 3D [1]。

2、如何破坏深度

只是为了强调一个有趣的事实,解释这些深度线索从场景如何投射到人类和相机视觉的透视图开始。 另一方面,前视图或侧视图的正交投影会破坏所有深度信息。

考虑图 3,观察者可以判断房子的哪个方面离他/她更近,如左图所示。 然而,从右图完全不可能区分相对距离。 甚至背景也可能与房子位于同一平面上。

图 3. 透视投影(左)。 正射投影(右)

3、使用线索判断深度

基本上有 4 类深度线索:静态单眼、运动深度、双眼和生理线索 [2]。 我们下意识地利用这些信号来非常好地感知深度。

3.1 图形深度提示

我们从单个静止图像中感知深度的能力取决于场景中事物的空间排列。 下面,我总结了一些提示,使我们能够推断不同物体的距离。 从与地球母亲的日常互动中,你可能已经觉得很自然了。 希望不要花太多心思来弄清楚各种线索。

加州大学伯克利分校进行了一项有趣的研究,他们通过实验表明,当地平线可见时,我们有一种压倒性的趋势是利用这一特性来快速感知深度。 当查看上图时,这对你来说是正确的吗?

3.2 来自运动的深度线索(运动视差)

图 5. 运动视差


这也不应该让你感到惊讶。 当你作为一个观察者在运动时,你周围的事物比远处的事物通过得更快。 某物出现得越远,它似乎远离观察者的速度就越慢。

3.3 立体视觉的深度线索(双目视差)

视网膜视差:又一个有趣的事件使我们能够识别深度,这可以通过一个简单的实验直观地理解。

图6 实验

闭上一只眼睛,将食指放在你的面前,尽可能靠近脸。 现在,反复合上一只眼并张开另一只眼。 观察到你的手指在动! 左眼和右眼观察到的视野差异称为视网膜视差。 现在伸出你的手指,保持一臂的距离并执行相同的动作。 你应该注意到手指位置的变化变得不那么明显了。 这应该会给你一些关于立体视觉如何工作的线索。

这种现象被称为立体视觉。 由于世界的 2 个不同视角,感知深度的能力。 通过比较来自两只眼睛视网膜的图像,大脑计算出距离。 差距越大,事物离你越近。

4、计算机视觉中的深度估计

深度估计的目标是获得场景空间结构的表示,恢复图像中物体的三维形状和外观。 这也称为逆向问题 [3],在这种情况下,我们试图在没有足够信息来完全指定解决方案的情况下恢复一些未知数。 这意味着 2D 视图和 3D 视图之间的映射不是唯一的(图 12)我将在本节中介绍经典立体方法和深度学习方法。

那么机器实际上是如何感知深度的呢? 我们能否以某种方式转移上面讨论的一些想法? 最早取得令人印象深刻结果的算法始于 90 年代使用立体视觉进行的深度估计。 稠密立体对应算法 [4] [5] [6] 取得了很大进展。 研究人员能够利用几何学以数学方式约束和复制立体视觉的概念,同时实时运行。 本文 [7] 总结了所有这些想法。

至于单目深度估计,它最近开始流行起来,方法是使用神经网络来学习直接提取深度的表示 [8]。 其中深度线索是通过基于梯度的方法隐式学习的。 除此之外,自监督深度估计[9][10][11]也取得了很大进步。 这是特别令人兴奋和开创性的! 在这种方法中,模型被训练为通过优化代理信号来预测深度。 训练过程中不需要真值标签。 大多数研究要么利用多视图几何或对极几何等几何线索来学习深度。 我们稍后会谈到这一点。

5、立体视觉的深度估计

图 7. 对极几何(左)。 校正图像(右)

使用立体相机求解深度的主要思想涉及三角测量和立体匹配的概念。 形式依赖于良好的校准和校正来约束问题,以便它可以在称为对极平面的 2D 平面上建模,这大大减少了后者到沿对极线的线搜索(图 7)。 有关对极几何的更多技术细节将在以后的帖子中讨论。

类似于双眼视差,一旦我们能够匹配两个视图之间的像素对应关系,下一个任务就是获得对差异进行编码的表示。 这种表示被称为差异,d。 要从差异中获得深度,可以从相似三角形中得出公式(图 8)

图 8. 立体几何

步骤如下

  • 从特征描述符中识别相似点。
  • 使用匹配成本函数匹配特征对应关系。
  • 使用对极几何,找到并匹配一个相框与另一个相框的对应关系。 匹配成本函数 [6] 用于测量像素差异
  • 从已知对应关系计算差异 d = x1 — x2,如图 8 所示。
  • 从已知差异计算深度 z = (f*b)/d
图 9. Kitti 的视差表示

6、深度学习时代

深度学习擅长识别、检测和场景理解等高级感知和认知任务。 深度感知属于这一类,同样应该是一种自然的前进方式。 目前有 3 个广泛的深度学习框架:

监督学习:直接从单目图像估计深度的开创性工作始于 Saxena [8]。 他们通过监督学习,通过最小化回归损失,学会了直接从 2D 图像中的单眼线索回归深度。 从那时起,人们提出了多种方法来通过提出新的架构或损失函数来改进表示学习

使用 SFM 框架的自我监督深度估计:该方法将问题定义为学习从视频序列生成新视图。 神经网络的任务是通过在不同时间步长 I_t-1、I_t+1 拍摄图像并应用从姿势网络学习的变换来执行图像变形,从而从源视图生成目标视图 I_t。 通过使用空间变换器网络 [14] 以可微分的方式将扭曲视图合成视为监督,使训练成为可能。 在推理时,深度 CNN 将从单视图 RGB 图像预测深度(图 10)。 我建议您阅读这篇论文以了解更多信息。 请注意,此方法确实存在一些缺点,例如无法确定下一节中描述的比例和建模移动对象。

图 10. 无监督单目深度估计

使用 Stereo 自监督单眼深度估计:另一种有趣的方法。 这里(图 11),模型不是将图像序列作为输入,而是仅从左侧 RGB I_l 预测视差 d_l、d_r。 与上述方法类似,空间变换器网络使用视差对 RGB 图像对 I_l、I_r 进行变形。 回想一下 x2 = x1 - d。 因此,可以合成成对视图,重建视图 I_pred_l、I_pred_rand 和目标视图 I_l、I_r 之间的重建损失用于监督训练。

要使此方法起作用,假设基线必须是水平的且已知。 必须校正图像对,以便通过视差进行的转换是准确的。 因此计算 d = x1 — x2 成立,如图 8 所示。

图 11. 使用立体的自监督单目深度估计

7、CNN深度线索和有偏差学习

理解和破译黑匣子一直是可解释机器学习方面的研究。 在深度估计的背景下,一些工作已经开始研究神经网络依赖什么深度线索或从特定数据集学习的归纳偏差。

在 Tom 等人的开创性工作 ICCV 2019 中,他们进行了几个简单的测试,通过实验找到估计深度与场景结构之间的关系。 请注意,这是在 Kitti 数据集上完成的,该数据集是具有固定相机位置的室外道路场景,并且具有稍微可见的消失点和地平线。

物体相对于地面接触点的位置提供了强大的上下文信息:对于道路上的物体,通过增加汽车在垂直方向上的位置。 我们看到模型在离地面较远时无法很好地估计深度。

物体下方的阴影作为深度估计的强大特征

形状无关紧要,但阴影很重要:在另一个实验中,通过放置一个带有人工投射阴影的任意物体,即使在训练期间无法获得深度,模型也可以合理地估计深度。

Rene 等人在 TPAMI 2020 上完成了一项有趣的工作,他们在由室内和室外场景组成的相对大规模的数据集上训练深度模型。 从观察来看,有一个自然的偏差,即图像的下部总是靠近相机。 这可以看作是下图中右上角示例中的故障模式。 此外,深度模型倾向于预测内容,而不是在左下角的情况下将其识别为镜子中的反射。 在这篇论文中还可以找到许多其他有趣的发现。

进行的研究仍然相当有限。 要提供更有说服力的调查结果,需要做大量工作。

8、为什么测量深度如此困难?

最后,让我们试着理解深度估计的一些基本问题。 罪魁祸首在于将 3D 视图投影到深度信息丢失的 2D 图像。 当有运动和移动物体时,另一个问题就根深蒂固了。 我们将在本节中介绍它们。

8.1 深度估计不适定

很多作者在进行单目深度估计的研究时,经常会提到从单个RGB图像估计深度的问题是一个不适定的逆问题。 这意味着世界上观察到的许多 3D 场景确实可以对应到同一个 2D 平面(图 11 和 12)。

图12

8.2 不适定:单目深度估计的尺度模糊

回想一下,调整焦距将按比例缩放图像平面上的点。 现在,假设我们按某个因子 k 缩放整个场景 X,同时按 1/k 因子缩放相机矩阵 P,图像中场景点的投影保持完全相同,即 x = PX = (1/k)P * (kX) = x

也就是说,我们永远无法仅从图像中恢复出实际场景的准确比例!

请注意,单眼基础技术存在此问题,因为可以为具有已知基线的立体装备恢复比例。

8.3 不适定:投影模糊

假设我们对场景进行几何变换,有可能变换后这些点会映射到平面上的同一个位置。 又一次,留给我们同样的困难。 见下图

图 13. 变换后对象的投影映射到平面中的同一点

8.4 降低匹配的属性

对于需要三角测量的基于立体或多视图的深度估计,通常涉及检测-描述-匹配的流水线。 当场景是从截然不同的视点或图像之间的光照变化变化很大时,匹配变得非常困难。 下图给出了一个极端情况,描述符无法区分特征。 这些有问题的案例包括:

  • 无纹理区域:许多像素将具有相同的像素强度
  • 反光面
  • 重复模式
  • 遮挡:对象在一个视图中被遮挡,但在另一个视图中不被遮挡。
  • 违反 Lambertian 属性:Lambertian 表面是指无论从何处观察都具有相同亮度的表面。 当从两个不同视角显示同一场景的图像时,由于不理想的漫反射,相应的亮度强度可能不相等。
一个非常困难的场景,具有很大的视角差异和不同的人群。

8.5 移动物体违反了 SFM 方法的静态假设

场景中的动态对象进一步使估计过程复杂化。 通过运动结构进行的深度估计涉及移动相机和连续的静态场景。 该假设必须适用于匹配和对齐像素。 当场景中有移动物体时,这个假设就不成立了。 为此,许多研究人员研究了几种方法来模拟场景中的移动物体,方法是使用光流 [12] 结合速度信息,或使用实例分割掩码来模拟物体从一帧到另一帧的运动 [13]。

9、结束语

我希望你从这篇介绍性文章中获得了对一般深度估计的一些有价值的见解,为什么它是一项具有挑战性但极其重要的任务,以及该技术的当前状态。 我坚信深度可以用相机和视觉来解决。 并且对此持乐观态度。 因为我们自己仅依靠单眼或双眼视觉与我们的环境互动。


原文链接:Depth Estimation: Basics and Intuition

BimAnt翻译整理,转载请标明出处