0. 前言#
深度补全(Depth Completion)是把稀疏的深度图(Sparse depth map)补全成密集的深度图(Dense depth map)。输入通常是稀疏深度(LiDAR、深度相机等获取),有时还会加以 RGB 图像辅助;输出是完整的密集深度图。稀疏深度图指的是图像的部分像素由深度值,而密集深度图是每个像素都有深度值。
为什么要深度补全?就是因为传感器获取到的数据(Ground-truth)通常是稀疏的,而下游任务(三维重建、目标检测等)通常需要密集深度图。需要将稀疏深度转化成密集深度。
为什么不直接训练一个从 RGB 图像直接得到密集深度图的网络?其实这样的网络是有的,但这样的模型通常是计算量大、消耗高的大模型,需要多模态数据的融合:
- 真实密集深度(小规模) → 提供绝对尺度
- 传感器稀疏深度(LiDAR) → 提供稀疏真实约束
- 自监督视频数据(SfM,海量) → 学到丰富场景结构
- 合成数据(仿真环境或 3D 引擎生成) → 扩充多样性
这导致了训练这样的网络是不合算的,也是无法在下游任务中方便应用的。
1. \(DMD^3C\)#
\(DMD^3C\) 是较新的一个深度补全的方法,原论文为:《Distilling Monocular Foundation Model for Fine-grained Depth Completion》
该方法分为两个阶段:第一个阶段是利用单目深度大模型生成训练数据,并通过知识蒸馏的方式训练出一个深度补全小模型;第二个阶段是引入尺度和平移不变损失(SSI),让模型保持细粒度细节的同时,学习尺度信息。如图:

图中左侧是传统方法,对于细节部分的深度补全依然不理想,图中右侧则是文章的方法。第一阶段是通过知识蒸馏和迁移学习训练一个深度补全网络,第二阶段是通过尺度和平移不变损失来微调学习尺度信息。
该方法的目标和传统的深度补全别无二致,输入为 RGB 图像和稀疏深度图,目标是经过模型后输出密集深度图。
1. 第一阶段:数据生成和预训练#
由于密集深度图难以获取,文章中选择采用一个单目大模型自制训练数据。这个单目大模型能够做到输入 RGB 图像,直接输出密集深度图。因此,文章中采集大量 RGB 图像输入到大模型中,得到大量密集深度图。
之后将得到的密集深度图配合原始的 RGB 图像进行三维重建,随机采样不同的相机参数和射线,从而模仿 LiDAR 扫描方式得到一个稀疏深度图。
然后将密集深度图作为标签,稀疏深度图和原始 RGB 图像作为输入,训练该深度补全网络。如图:

值得注意的是,单目大模型生成的密集深度图是合成数据,在公制尺度上并不准确,但它捕获了场景中的相对深度关系和结构细节,在预训练过程中提供了有价值的监督信号。
2. 第二阶段:微调#
第二阶段其实是对第一阶段模型的修正,文章中采用的单目大模型具有尺度模糊和噪声偏差等问题,因此深度补全模型也会继承这些问题,而第二阶段就是对这些问题的改进。
尺度模糊(Scale Ambiguity)指的是深度估计只能推测相对尺度,而无法保证真实尺度,这对于下游真实任务会有影响。尺度问题在 MoGe 中也存在,而在 MoGe-2 中得到解决,也是 MoGe-2 的主要创新点,具体可以参考这篇文章:

如图,文章中的解决办法是:一方面,获取图像的真实稀疏深度,利用稀疏的真实测量点来校正网络的真实深度尺度;另一方面,将图像输入到深度补全模型中,得到相对尺度的密集深度图,将这两个尺度通过 SSI Loss(Scale-and-Shift-Invariant)进行监督,从而使得模型能够朝着真实尺度进行微调。
简单来说,就是利用稀疏的真实测量点来找到缩放比例和位移尺度,再加上模型本身的相对结构和形状,从而得到具有真实尺度且形状正确的密集深度图。与 MoGe-2 的思想有相似之处。
除此之外,文章中还使用了梯度匹配损失,用于保留高频细节,保证在深度变化处的梯度与真值保持一致,从而保留边缘细节。
3. 知识蒸馏(Knowledge Distillation)#
这里简单介绍一下知识蒸馏,它是一种基于迁移学习(Transfer Learning)的方法,可以看到在文章中有所体现。
迁移学习是指:将源域训练完的模型,通过某些方法将学习到的信息分布迁移到目标域模型中,目的就是节省重新训练模型的资源和时间,同时也能提高模型的效率(因为通常模型会变得更小,或者模型不变但参数更优)。例如模型微调、Deep CORAL、domain adaptation 等都属于迁移学习。
知识蒸馏的概念更加具体,指的是:两个模型具有相同任务,其中一个模型是训练好的、有知识的,要将这个模型的分布迁移到另一个待训练的模型。一般来说,训练好的模型称为教师模型(Teacher),待训练的模型称为学生模型(Student)。
无蒸馏的训练过程表示为:
- 保证
S
网络的权重是可训练的 - 样本
x
输入给S
网络,得到对应的输出s_out=S(x)
- 样本
x
所对应的人工标签为y
,使用损失函数计算S
网络与人工分布之间的误差L_ce(s_out, y)=cross_entropy_loss(s_out, y)
- 总损失为
L = L_ce
L.backward()
反向传播计算S
网络梯度optimizer.step()
梯度更新S
网络的权重- 返回步骤2
蒸馏训练的过程可以表示为:
- 保证
T
网络的权重固定不变,保证S
网络的权重是可训练的 - 样本
x
同时输入给**T
网络和S
网络,得到对应的输出t_out=T(x)
**和s_out=S(x)
- 样本
x
所对应的人工标签为y
,使用交叉熵损失计算S
网络与人工分布之间的误差L_ce(s_out, y)=cross_entropy_loss(s_out, y)
- 使用KL散度计算
T
网络和S
网络之间的误差L_kd=kl_div(s_out, t_out)
- 总损失为
L = aL_ce + (1-a)L_kd
L.backward()
反向传播计算S
网络梯度optimizer.step()
梯度更新S
网络的权重- 返回步骤2
上述步骤如图所示:

可以看出,学生网络一方面要参考真实标签,一方面要参考教师网络的输出,根据二者的共同监督训练。由于教师网络是一个相同任务的训练好的模型,因此学生网络可以直接学习教师网络中的分布、特征、隐藏层输出等,能够加速训练进程,也可能提高模型的性能(模型压缩或模型调优)。
可以这样理解:一个教授能将知识轻松的教给一个大学生,但未必能教一个小学生,但如果教授与大学生一起来教这个小学生,就可能教会他,因为大学生作为一个学生已经学会了,因此他可以将他的心得告诉这个小学生,从而小学生能更容易的学会知识。
回到文章中,第一阶段的单目大模型就类似教师模型,问题(原始 RGB 图像)得到后先自己解答(得到密集深度图),再用问题和答案去训练学生模型,并且给学生提示(稀疏深度图),这样学生就能很快的拥有教师模型的能力。