深度提示(Cues for depth)
-
2D图像包含了多种深度感知的信息:
- 即使是静态的平面图片,我们也能从中感知到深度和三维空间,这得益于我们大脑的解读和一系列的视觉线索。
-
在单一视角中可用的线索包括透视、纹理和物体线索:
- 透视(Perspective) :平行线在视觉上似乎在远处汇聚,这种现象可以帮助我们判断深度和距离。
- 纹理(Texture) :物体的纹理在靠近观察者时看起来更为清晰,而在远离观察者时则显得更加模糊或压缩。这种纹理梯度为我们提供了深度感。
- 物体线索(Object Cues) :当一个物体遮挡另一个物体时,我们会认为前一个物体离我们更近。
-
通过组合多个视角可以获得更准确的深度信息(立体、运动) :
- 立体(Stereo) :通过两个分开的摄像机(或我们的双眼)捕获的不同视角的图像,我们可以获得更加真实的深度感。这种差异帮助我们的大脑解析三维空间。
- 运动(Motion) :当我们或物体在空间中移动时,近处的物体在视觉上会移动得更快,而远处的物体则移动得较慢。这种运动产生的视差为我们提供了关于深度的信息。
立体(stereo)
从立体中获取深度(Depth from stereo)
立体对(Stereo pair):来自两个摄像机的图像,摄像机位置在水平方向上有所偏移。
假设以下情况:
- 摄像机的图像平面彼此平行且与基线B平行
- 摄像机的中心在相同的高度z
- 焦距f相同
目标: 找到z

一个用于从立体对(stereo pair)计算物体的深度 z
<math xmlns="http://www.w3.org/1998/Math/MathML"> z = f B x − x ′ z = \frac{fB}{x - x'} </math>z=x−x′fB
- z 是物体的深度。
- f 是摄像机的焦距。
- B 是两个摄像机之间的基线距离。
- x 和 x′ 是物体在两个相机图像上的位置,它们之间的差异 x−x′ 被称为视差(disparity)。
物体的深度 z 与视差 x−x′ 成反比。这意味着,如果视差很大,物体距离摄像机很近;如果视差很小,则物体离摄像机远。
基本的立体匹配(Basic stereo matching)
SSD

对于每一个对应的像素,计算它们的差,然后将这个差的平方求和。得到的总和值表示这两个图像块的差异程度。值越小,两个图像或图像块越相似。
norm. corr.

它是对原始互相关值进行标准化处理,使得其值落在-1和1之间。这使得比较不同的图像或图像块时能够得到一个更稳定和可靠的相似度度量。值接近1表示图像或图像块非常相似,而值接近-1表示它们是相反的或不相似。
基本的立体匹配算法(Basic stereo matching algorithm)
- 对于一张图片中的每一个像素 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x,
- 在另一张图片中扫描一条水平线,找到最佳匹配的像素 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ′ x' </math>x′
- 计算视差 <math xmlns="http://www.w3.org/1998/Math/MathML"> x − x ′ x-x' </math>x−x′,然后计算深度为: <math xmlns="http://www.w3.org/1998/Math/MathML"> d e p t h = f B x − x ′ depth = \frac{fB}{x - x'} </math>depth=x−x′fB
窗口大小的影响(Effect of window size)

较小的窗口:能够捕捉到更细致的细节,但会带来更多的噪声。
较大的窗口:可以得到更平滑的深度图像,但可能缺乏细节。
额外的约束条件
单独的匹配往往是模糊的:这意味着在尝试从一个图像中找到另一个图像中的对应点时,可能存在多个潜在的匹配点,导致匹配不明确或不精确。
- 唯一性 (Uniqueness) :在一个视图中的点在另一个视图中最多只有一个匹配点。这意味着每个点只能与另一张图像中的一个点匹配,不能与多个点匹配。
- 排序 (Ordering) :对应的点在两个视图中应该按照相同的顺序出现。这确保了两个图像中的物体或特征保持了相对的位置关系,没有被颠倒或错乱。
- 平滑性 (Smoothness) :视差值应该平滑地变化(在大多数情况下)。这意味着在一个连续的物体或表面上,我们预期视差值会以一个相对均匀的方式变化,而不是突然地跳跃或改变。
排序约束(Ordering constraint)

尽管在立体匹配中排序约束可以帮助我们进行像素或区域之间的匹配,但在某些情况下,这个约束可能不适用或者不准确。例如,在图像中有遮挡或某些复杂的场景结构时,对应的点的相对顺序可能在两个视图中不一致,导致排序约束不成立。
应用限制
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> E ( D ) = ∑ i W 1 ( i ) ( W ( i ) − W ( i + D ( i ) ) ) 2 + λ ∑ i ∼ j ρ ( D ( i ) − D ( j ) ) E(D) = \sum_{i} W_1(i) (W(i) - W(i + D(i)))^2 + \lambda \sum_{i \sim j} \rho(D(i) - D(j)) </math>E(D)=i∑W1(i)(W(i)−W(i+D(i)))2+λi∼j∑ρ(D(i)−D(j))
其中:
- <math xmlns="http://www.w3.org/1998/Math/MathML"> E ( D ) E(D) </math>E(D) 是能量函数,目标是最小化它。
- <math xmlns="http://www.w3.org/1998/Math/MathML"> W 1 ( i ) W_1(i) </math>W1(i) 和 W(i) 是窗口或像素权重。
- <math xmlns="http://www.w3.org/1998/Math/MathML"> D ( i ) D(i) </math>D(i) 是在位置 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 的视差。
- 第一部分(匹配质量)计算了当前像素与其匹配像素之间的差异。
- 第二部分(平滑度)确保了相邻像素之间的视差变化平滑。
- λ 是一个正则化参数,用于权衡匹配质量与平滑度之间的重要性。
- ρ 是一个惩罚函数,它惩罚大的视差变化。
校正(Rectification)
校正是找到一个投影变换,使得每个图像映射到同一个平面。

小结
- 立体深度是根据视差计算的(即在场景的两个视图中点的位置差异)
- 在实践中,这是难以解决的,因为单个点的匹配往往是模糊不清的
- 通常的解决方案涉及额外的约束条件(例如,平滑性约束)
单视图深度(Single-view depth)
有监督的深度分类(Supervised depth classification)
- 将深度估计视为一个分类任务:对图像中的每个像素,预测它与摄像头的距离。
- 在带有标注深度图的图像上进行训练。


损失函数(Loss function)
图像可能有一个非常大的深度范围------基于log(深度)的损失可能比绝对深度的损失效果更好。
场景的平均深度可以有很大的不同(例如,衣橱与体育场)。 为了防止模型仅仅学习到平均深度,可以考虑调整损失函数,使其在不同的场景中保持相似。
从视差中得到深度(Depth from disparity)
不在标注的深度图上进行训练,可以在立体图像对上进行训练。
优势:立体图像对可以使用标准摄像机生成,而深度图需要特殊设备(例如,激光雷达 LiDAR)。
- 输入:立体对中的一张图像
- 学习预测会产生另一张图像的视差图
- 可以从视差图计算摄像机到表面的距离
- 在立体对上进行训练
损失是以下几部分的总和
- Appearance loss - 外观损失(原始图像与预测图像之间的差异)
- Disparity smoothness loss - 视差平滑性损失
- Left-right consistency loss - 左右一致性损失(视差图之间的差异)
小结
机器学习方法可以被训练来从单个图像估计深度。
-
优势:
- 不需要多个视角/立体摄像头。
-
劣势:
- 在物体边缘的深度可能会"模糊"(但可以与边缘图结合得到更好的结果)。
- 模型可能不会很好地泛化到新的环境。