基于深度学习的单目图像深度估计算法:MonoDepth
题目描述
单目图像深度估计是计算机视觉中的一个经典问题,目标是仅从一张RGB图像中,预测出每个像素点到相机的距离(即深度值)。这具有很大挑战性,因为这是一个从2D到3D的、本质上不明确的“逆问题”——无限多的3D场景可以投影出同一张2D图片。然而,深度学习通过从大量数据中学习强大的先验知识,使得这项任务取得了显著进展。MonoDepth是一个开创性的、经典的自监督单目深度估计算法框架。它的核心创新在于,不需要在训练时使用任何真实的深度值(ground truth depth)作为监督信号,而是利用双目立体图像对(同一时刻、左右相机拍摄的图像)或者单目视频序列,通过视图合成(View Synthesis)的重建误差来训练网络,实现完全自监督学习。今天,我们将深入拆解MonoDepth的核心思想、网络结构、损失函数和训练过程。
解题过程循序渐进讲解
步骤一:问题定义与核心思想
-
问题输入与输出:
- 输入:一张RGB彩色图像
I,尺寸为H x W x 3。 - 输出:对应的深度图
D,尺寸为H x W。其中每个像素值代表该点到相机的距离(通常经过归一化处理)。深度值越小,表示物体离相机越近。
- 输入:一张RGB彩色图像
-
核心思想——自监督学习:
- 传统监督方法需要大量“图像-真实深度”配对数据,获取成本极高。MonoDepth另辟蹊径,利用几何约束作为监督信号。
- 基本观察:如果我们有一对经过校准的双目图像(左图
I_l和右图I_r),并且知道它们之间的相对位姿(通常是固定的、已知的基线平移),那么,只要我们能为左图预测出深度图D_l,我们就可以通过一个称为“可微分双线性采样”的机制,将右图I_r“扭曲”(warp)到左图的视角,从而生成一个合成的左图I_l'。 - 核心监督信号:这个合成的左图
I_l'应该和真实的左图I_l在像素颜色上尽可能一致。这个“一致程度”的误差(即图像重建损失),就可以作为训练深度预测网络的监督信号。整个过程无需真实深度标签。
步骤二:算法流程与网络架构
MonoDepth的整体流程是一个编码器-解码器(Encoder-Decoder)架构,通常以U-Net或类似结构为基础。
-
深度估计网络:
- 编码器:通常使用一个预训练的卷积神经网络(如ResNet)作为主干,提取输入图像的多尺度特征。这些特征从浅到深,语义信息越来越强,空间分辨率越来越低。
- 解码器:由一系列上采样层和卷积层组成。它将编码器提取的深层特征逐渐上采样,并与编码器中对应分辨率的浅层特征(通过跳跃连接)融合,以恢复空间细节并预测出与输入同分辨率的深度图。解码器的最后一层使用
Sigmoid激活函数,输出归一化的逆深度(1 / depth),因为逆深度在场景中的分布更符合高斯分布,易于网络学习。
-
可微分的视图合成:这是算法的关键模块。
- 已知条件:假设我们使用双目立体对训练。已知左相机和右相机之间的变换关系,主要由一个基线平移向量
t(通常是[基线长度, 0, 0])和一个单位旋转矩阵R(对于水平双目,通常是单位矩阵)描述。相机的内参矩阵K也已知。 - 坐标变换:对于左图中的任意一个像素点
p_l = (u, v),其对应的3D空间点P可以根据预测的深度D_l(p_l)和相机模型反投影得到:P = D_l(p_l) * K^{-1} * p_l_homo,其中p_l_homo是p_l的齐次坐标。 - 投影到右图:将3D点
P利用右相机的位姿投影到右图像平面:p_r_homo = K * (R * P + t)。得到该点在右图上的理论坐标p_r。 - 双线性采样:由于计算得到的
p_r通常是浮点数坐标,我们需要从右图I_r上获取该位置的像素值。这里使用可微分的双线性采样。它根据p_r周围四个整数坐标像素的值,按其距离进行加权平均,得到一个连续、可微的采样值。这个采样值就是合成左图I_l'在p_l位置的像素值。通过遍历左图所有像素,就合成了整张I_l'。
- 已知条件:假设我们使用双目立体对训练。已知左相机和右相机之间的变换关系,主要由一个基线平移向量
步骤三:损失函数设计
损失函数是引导网络学习正确深度的指挥棒。MonoDepth的损失函数是多任务损失的加权和。
-
光度重建损失:这是最主要的监督信号。它衡量合成图像
I_l'与真实图像I_l之间的差异。为了应对光照变化和遮挡,通常采用更鲁棒的结构相似性指标(SSIM)与L1损失的结合:
L_p = α * (1 - SSIM(I_l, I_l')) / 2 + (1 - α) * ||I_l - I_l'||_1
其中α是平衡权重(如0.85)。这个损失会对所有像素计算,但会通过后续的掩码进行处理。 -
深度图平滑损失:仅凭重建损失,预测的深度图可能在纹理缺失或均匀区域产生噪声或不连续。因此,需要引入一个先验:深度在局部区域内(除了物体边界)应该是平滑的。损失定义为深度梯度的L1范数,并用图像梯度的指数进行加权,以在图像边缘处允许深度不连续:
L_s = |∂_x D| * e^{-|∂_x I|} + |∂_y D| * e^{-|∂_y I|}
这称为边缘感知平滑损失。 -
左右一致性损失:为了进一步提高深度预测的一致性,MonoDepth利用双目图像对的对称性。我们不仅可以用右图合成左图,也可以用左图预测的深度来将左图扭曲到右图视角,得到合成的右图
I_r',并计算相应的重建损失。同时,还可以强制要求从左图预测的深度D_l,与从右图预测的深度D_r在同一个3D空间点上的深度值是一致的(经过坐标变换后)。这构成了一个更强的几何约束。 -
自动掩码:在训练过程中,场景中可能存在移动物体、遮挡区域,或者由于相机平移导致某些区域在另一视角中不可见(遮挡)。这些区域的重建损失是无意义的,会误导网络。MonoDepth采用一个简单的启发式方法生成一个二值掩码
M:对于那些左图与合成左图之间的误差,小于左图与右图(直接作为合成图,即认为深度为零/无穷远)之间误差的像素,我们认为该像素是有效的(即从另一视角可见),掩码值为1,否则为0。这个掩码会应用到重建损失上,过滤掉无效像素。
步骤四:训练与推断
-
训练阶段:
- 输入是双目图像对
(I_l, I_r)。 - 深度网络分别对
I_l和I_r进行前向传播,得到D_l和D_r。 - 利用可微分扭曲模块,分别计算
I_l'(用D_l扭曲I_r得到)和I_r'(用D_r扭曲I_l得到)。 - 计算各项损失:
L_p(I_l, I_l'),L_p(I_r, I_r'),L_s(D_l, I_l),L_s(D_r, I_r),以及左右一致性损失。 - 总损失是这些损失的加权和。通过反向传播优化深度估计网络的参数。
- 输入是双目图像对
-
推断阶段:
- 只需要输入单张图像(例如左图
I_l)。 - 将其输入训练好的深度网络,网络直接输出预测的深度图
D_l。整个过程是端到端、一次前向传播,非常高效。
- 只需要输入单张图像(例如左图
总结与意义
MonoDepth成功地将几何先验(多视角一致性)与深度学习相结合,通过可微分的图像渲染技术,实现了无需真实深度标签的自监督训练。它不仅大幅降低了数据标注成本,其预测的深度图也具有很好的精度和细节。这个框架是单目深度估计领域的基石,后续许多工作(如MonoDepth2, PackNet等)都在此基础上,通过引入更复杂的位姿估计网络(用于单目视频)、多尺度训练、改进的损失函数等方式进行了扩展和优化,持续推动着自监督深度估计技术的发展。理解MonoDepth,就掌握了自监督单目深度估计的核心脉络。