0. 前言#
深度修复(Depth inpainting)就是重建图像中缺失或被遮挡的深度信息,与深度补全(Depth Completion)类似但不完全相同。深度补全是已知稀疏深度点,目的是推断处整个场景的密集深度图;而深度修复是已知深度图中只有部分区域缺失(Masked),目的是填补这些缺失区域的深度信息。然而,DepthLab 虽是以深度修复的框架实现,但任务范围覆盖了深度补全,深度修复更加灵活。
在 DepthLab 论文之前的深度补全方法通常有两种:一种是基于稀疏 LiDAR 深度增强到密集深度,这种通常依赖固定数据集,泛化能力有限;另一种是单目深度估计,基于 RGB 图像信息预测密集深度,这种容易在已知和预测区域的边界引发几何不一致。
而 DepthLab 就是为了解决这两个问题,并提高下游任务的效果,引入双分支扩散框架。原论文在此:《DepthLab: From Partial to Complete》
1. 下游任务#

如图所示,DepthLab 能提升多种下游任务的指标:
- 3D 场景修复(3D scene inpainting)
- LiDAR 深度补全(LiDAR depth completion)
- 使用 DUST3R 进行稀疏视图重建(Sparse-View Reconstruction with DUST3R)
- 文本到场景生成(Text-to-scene generation)
2. 深度修复#
深度修复(Depth inpainting)任务可以表示为:给定原始(不完整或扭曲的)深度图 d′ 、一个二进制掩码 m 指示需要修复的目标区域、一个条件 RGB 图像 I ,我们的目标是使用 RGB 图像来预测完整的深度图 d 。
这涉及保留未屏蔽区域中的深度值,同时准确估计屏蔽区域的深度。这个过程也自然地将估计深度与现有几何形状对齐,从而消除已知修复区域和目标修复区域之间的不一致。
3. 理论方法#

DepthLab 引入的是一种基于双分支扩散的框架(dual-branch diffusion-based framework),融合了 RGB 图像特征与深度信息,用于高质量的深度填充。双分支指的是具有两个输入头、两个 U-Net,两个 U-Net 间的特征还可以逐层融合,扩散模型体现在 Estimation U-Net 的深度生成过程中。
1. 数据预处理#
在 Encoder 前,RGB 图像(RGB image)无需做多余处理,而对应的真值深度图(GT depth)需要进行处理。
首先对 GT depth 采用随机 Mask,创建一个 Masked depth,之后经过插值(Interpolation),能得到一个插值后的深度图(Interpolated depth)。将 GT depth 和 Interpolated depth 都进行随机的尺度归一化(Random scale norm)。
插值的作用是:在进入扩散模型前,对缺失区域有一个合理的初始深度分布,而不是让模型在完全空白的地方凭空猜测。如果不进行插值,Mask 部分与其他部分的差异太大,可能会被当做噪声值,也不容易收敛到最优值。插值结果可以理解为真值与预测值间的一个中间值,让扩散模型不是从白纸还原图像,而是从一副草稿还原图像。
随机尺度归一化是先对原始完整深度图和插值后的 masked 深度图分别进行线性归一化,使所有的深度值落到一个固定范围;再随机乘一个缩放因子,使之不会过拟合到单一的尺度范围。目的是增强模型对不同尺度场景的鲁棒性,并缓解归一化过程中可能的溢出问题。推理时会进行反归一化,能够完全还原到原始尺度。
2. 双分支网络#
文中的双分支结构(dual-branch)指的就是两个平行的 U-Net:Reference U-Net 和 Estimation U-Net。
Reference U-Net 的作用比较简单,输入 RGB 图像,提取视觉上下文特征,输出多层次的 RGB 特征(在编码和解码的各个阶段),这些特征作为条件输入会融合到 Estimation U-Net 中。
而 Estimation U-Net 的作用是执行扩散去噪过程(diffusion),从带有噪声的潜变量逐步生成完整的深度潜变量。它的输入是:带噪声的深度潜变量(noisy depth latent)、掩码后的深度潜变量(masked depth latent)、二值掩码的特征表示(encoded mask)。融合来自 Reference U-Net 的多层特征的目的,就是保证补全的深度与视觉几何一致。
潜变量(latent)是 VAE 编码器把图像(RGB 或深度)压缩到的低维特征表示,通常在 latent diffusion 中使用。
值得注意的是,文中两个 U-Net 网络是用 Marigold 作为基础模型,从 Stable Diffusion V2 进行微调。Stable Diffusion V2 原本的训练目标是:
- 输入:随机噪声 latent
- 条件:文本(text embedding)
- 输出:预测噪声 → 生成 RGB 图像 latent
Marigold 把它改成:
- 输入:噪声化的深度 latent
- 条件:RGB 图像 latent
- 输出:预测噪声 → 生成深度 latent
而 DepthLab 就是在 Marigold 的基础上进行了双分支改造,并且又进行了微调,使其支持 Mask 条件和缺失区域的补全。
Marigold 的原论文在此:《Marigold: Affordable Adaptation of Diffusion-Based Image Generators for Image Analysis》
Marigold 的微调框架如图:

3. 深度 Encoder 和 Decoder#
文章中使用固定的变分自动编码器(VAE)将 RGB 图像及其相应的深度图编码到潜在空间(latent space)中。
在 Encoder 中,VAE 是三通道的,对于 RGB 图像是适配的,对于深度图(单通道)必须复制三份进行适配;并且 VAE 是不支持稀疏输入的,因此需要将稀疏的深度图补成密集深度图。
在 Decoder 中,VAE 的三通道数据取均值才得到深度图。与 Marigold 估计相对深度并使用最小二乘优化来获得公制深度不同,文中是根据已知深度区域的值和比例直接估计公制深度图。
4. Estimation U-Net#
估计去噪 U-Net(Estimation Denoising U-Net)的输入是:带噪声的深度潜变量(noisy depth latent)、掩码后的深度潜变量(masked depth latent)、二值掩码的特征表示(encoded mask),三者连接在一起。
带噪声的深度潜变量是 VAE 将原始深度图(训练是 GT depth,推理时则是待修复深度)编码后加噪得到的;掩码后的深度潜变量是 VAE 将插值后的深度图编码后得到的;二值掩码的特征表示是把随机生成的那个 mask 经过 VAE 编码后得到的。
由于 Stable Diffusion 的 VAE 擅长重建密集信息,因此这种方法可以更好地保留稀疏点和复杂边缘边界的已知深度值。
在数据预处理中应用了随机尺度归一化,这避免了 VAE 解码溢出,推理后再做一次反归一化恢复到绝对深度。
5. Reference U-Net#
参考 U-Net(Reference U-Net)的输入是 VAE 编码后的 RGB 图像,提取各层特征输入到 Estimation U-Net 中进行融合。每一层的具体融合过程为:分别从 Reference U-Net 和 Estimation U-Net 中获得两个特征图 f1、f2,然后沿宽度维度连接两个特征图。接下来对串联的特征图应用自注意力机制,并提取生成的特征图的前半部分作为输出。
由于每一层都是这样做的,前一层融合后的输出特征可以作为这一层的输入。这样不仅能利用基础模型每一层的细粒度语义特征,又因为两个 U-Net 共享相同的架构和初始权重,Estimation U-Net 还可以选择性地从同一特征空间内的 Reference U-Net 学习相关特征。
4. 训练策略#
1. 深度归一化#
由于不同场景深度不同,待修复的未知深度更是不可预测,因此模型若直接训练,很容易溢出。
文中选择训练相对尺度下的深度修复模型,这样数据进行随机尺度归一化后,就能控制深度的范围,训练效果能够提升。在修复结束后,再进行反归一化就能还原回真实尺度。这是相对与绝对尺度的训练策略。
2. Masking 策略#
mask 策略是针对下游任务和实际情况来制定的:对单独模型训练的 mask 方案是随机选择各类形状并组合作为 mask 蒙版;为了增强深度补全任务(传感器得到的稀疏深度图还原密集深度图),设置随机点的 mask;为了改进对象级修复(消除某物体后补全场景),利用 Grounded-SAM 对训练数据进行注释,然后根据 mask 的置信度分数过滤 mask。
多种 masking 策略的组合应用进一步增强了方法的鲁棒性。
5. 参考文献#
1.【论文笔记】DepthLab: From Partial to Complete-CSDN博客
2.DepthLab: From Partial to Complete 论文解读-CSDN博客
3.ChatGPT