跳过正文
  1. Notes/

从 DMD3C 入门深度补全

· loading · loading · ·
AI Embodied AI
目录
由 \(DMD^3C\) 入门深度补全与知识蒸馏

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 的主要创新点,具体可以参考这篇文章:

简单理解 MoGe 与 MoGe-2
loading · loading
AI Embodied AI

如图,文章中的解决办法是:一方面,获取图像的真实稀疏深度,利用稀疏的真实测量点来校正网络的真实深度尺度;另一方面,将图像输入到深度补全模型中,得到相对尺度的密集深度图,将这两个尺度通过 SSI Loss(Scale-and-Shift-Invariant)进行监督,从而使得模型能够朝着真实尺度进行微调。

简单来说,就是利用稀疏的真实测量点来找到缩放比例和位移尺度,再加上模型本身的相对结构和形状,从而得到具有真实尺度且形状正确的密集深度图。与 MoGe-2 的思想有相似之处。

除此之外,文章中还使用了梯度匹配损失,用于保留高频细节,保证在深度变化处的梯度与真值保持一致,从而保留边缘细节。

3. 知识蒸馏(Knowledge Distillation)
#

这里简单介绍一下知识蒸馏,它是一种基于迁移学习(Transfer Learning)的方法,可以看到在文章中有所体现。

迁移学习是指:将源域训练完的模型,通过某些方法将学习到的信息分布迁移到目标域模型中,目的就是节省重新训练模型的资源和时间,同时也能提高模型的效率(因为通常模型会变得更小,或者模型不变但参数更优)。例如模型微调、Deep CORAL、domain adaptation 等都属于迁移学习。

知识蒸馏的概念更加具体,指的是:两个模型具有相同任务,其中一个模型是训练好的、有知识的,要将这个模型的分布迁移到另一个待训练的模型。一般来说,训练好的模型称为教师模型(Teacher),待训练的模型称为学生模型(Student)。

无蒸馏的训练过程表示为:

  1. 保证S网络的权重是可训练的
  2. 样本x输入给S网络,得到对应的输出s_out=S(x)
  3. 样本x所对应的人工标签为y,使用损失函数计算S网络与人工分布之间的误差L_ce(s_out, y)=cross_entropy_loss(s_out, y)
  4. 总损失为L = L_ce
  5. L.backward()反向传播计算S网络梯度
  6. optimizer.step()梯度更新S网络的权重
  7. 返回步骤2

蒸馏训练的过程可以表示为:

  1. 保证T网络的权重固定不变,保证S网络的权重是可训练的
  2. 样本x同时输入给**T网络S网络,得到对应的输出t_out=T(x)**和s_out=S(x)
  3. 样本x所对应的人工标签为y,使用交叉熵损失计算S网络与人工分布之间的误差L_ce(s_out, y)=cross_entropy_loss(s_out, y)
  4. 使用KL散度计算T网络和S网络之间的误差 L_kd=kl_div(s_out, t_out)
  5. 总损失为L = aL_ce + (1-a)L_kd
  6. L.backward()反向传播计算S网络梯度
  7. optimizer.step()梯度更新S网络的权重
  8. 返回步骤2

上述步骤如图所示:

可以看出,学生网络一方面要参考真实标签,一方面要参考教师网络的输出,根据二者的共同监督训练。由于教师网络是一个相同任务的训练好的模型,因此学生网络可以直接学习教师网络中的分布、特征、隐藏层输出等,能够加速训练进程,也可能提高模型的性能(模型压缩或模型调优)。

可以这样理解:一个教授能将知识轻松的教给一个大学生,但未必能教一个小学生,但如果教授与大学生一起来教这个小学生,就可能教会他,因为大学生作为一个学生已经学会了,因此他可以将他的心得告诉这个小学生,从而小学生能更容易的学会知识。

回到文章中,第一阶段的单目大模型就类似教师模型,问题(原始 RGB 图像)得到后先自己解答(得到密集深度图),再用问题和答案去训练学生模型,并且给学生提示(稀疏深度图),这样学生就能很快的拥有教师模型的能力。

2. 参考文献
#

1.知识蒸馏の哲学 - 知乎