Depth Anything
- 引言
- Depth Anything V1
- 标注方法
- 学习标注图像
- 发挥未标注图像的潜力
- 语义辅助感知
- Depth Anything V2
- 总体框架流程
引言
在深度估计领域,单目深度估计(Monocular Depth Estimation,MDE)是指利用单个摄像头拍摄的图像,通过计算机视觉技术推断出场景中每个像素点的深度信息。相较于多目深度估计方法,单目深度估计仅使用单个摄像头或传感器,通常依赖于图像的视觉信息进行深度推断。这种方法在实际应用中具有广泛的适用性,特别是在需要轻量级、成本低廉的场景中,如移动设备和自动驾驶中的实时深度感知。
单目深度估计的方法主要包括利用卷积神经网络(CNN)从单张输入图像中直接回归深度场景。这些网络结构经过多年的发展和优化,能够从RGB图像中学习并推断每个像素点的绝对深度值。为了训练这些模型,通常需要大量的真实深度信息来作为监督信号,这些信息可以通过RGB-D相机、激光雷达等传感器获得。
近年来,随着深度学习技术的快速发展,单目深度估计方法在准确性和泛化能力上都取得了显著进展。新的网络结构和损失函数设计使得这些方法能够处理不同类型的场景和视角,从而提高深度估计的精度和鲁棒性。例如,通过数据集混合和尺度-平移不变损失的构建,研究人员能够在训练过程中有效地利用多样化的数据源,提升模型的泛化能力。
除了单目深度估计,多目深度估计利用多个摄像头或传感器来获取更丰富的场景信息。通过多视角的数据融合,这些方法能够有效解决单目方法中存在的深度不确定性和模糊性问题,尤其是在复杂的动态场景中。多目深度估计不仅可以提高深度估计的准确性,还能够增强系统的鲁棒性和对动态环境的适应能力。
最近国外发表Depth Anything V2版本,因此这里结合V1介绍
Depth Anything V1:https://arxiv.org/pdf/2401.10891v2
当谈及深度估计领域时,传统上数据集的构建主要依赖于传感器获取深度信息、立体匹配或结构光技术。然而,这些方法往往成本高、耗时长,并且在特定场景下难以实现。近年来,随着深度学习技术的兴起,研究人员开始探索更为经济高效的方法,文章作者利用单目未标注图像来生成深度标注,从而扩展数据集的规模和多样性。
使用单目未标注图像生成深度标注的方法为深度估计领域带来了新的发展机遇。通过这种方法,研究人员可以利用大规模的公共数据集,例如SA-1B、Open Images和BDD100K,来训练初始的单目深度估计模型。这些数据集包含了丰富的场景和视角变化,能够有效提升模型的泛化能力和适应各种应用场景的能力。
Depth Anything V1
标注方法
利用标注和未标注的图像来促进更好的单目深度估计(MDE)
形式上,标注和未标注集分别表示为 D l = ( x i , d i ) i = 1 M D^l = {(x_i, d_i)}^M_{i=1} Dl=(xi,di)i=1M 和 D u = { u i } i = 1 N D^u = \lbrace u_i \rbrace^N_{i=1} Du={ui}i=1N。
✈️任务的目标是从 D l D^l Dl 中学习一个教师模型 T T T。然后,我们利用 T T T为 D u D^u Du分配伪深度标签。最后,我们在标注集和伪标注集的组合上训练一个学生模型 S S S。
下图提供了一个简要说明。
图中:实线为标记的图像流,虚线为未标记的图像、
学习标注图像
这个过程类似于 MiDaS的训练。
MiDaS论文地址:https://arxiv.org/pdf/1907.01341v3
github地址:https://github.com/isl-org/MiDaS
论文内容总结:MiDaS论文通过整合多个数据源,提出了一种新的训练方法,解决了单目深度估计模型数据集规模有限和环境多样性不足的挑战。他们设计了鲁棒的训练目标函数处理深度范围和尺度的不一致性,采用多目标学习方法整合来自不同数据源的信息。实验证明,这种方法显著改进了单目深度估计的泛化能力,超越了现有方法,成为当前领域的前沿研究方向。
然而,由于 MiDaS 没有发布代码,文章作者首先对其进行了复现。
具体来说,首先将深度值通过 d = 1 / t d = 1/t d=1/t转换到视差空间,这样每个深度图上归一化到 0~1。为了实现多数据集联合训练,采用了仿射不变损失来忽略每个样本的未知尺度和位移公式如下:
这里的深度值(depth)通常指的是场景中物体到摄像头的距离,通常以米(m)为单位。在计算机视觉中,深度值用来描述图像中每个像素点的距离信息
仿射不变损失函数设计: 设计仿射不变损失函数,以在训练过程中对尺度变化和平移不变化具有鲁棒性。常见的仿射不变损失函数包括平方损失函数的变体或者其他形式的损失函数,如Huber损失函数等,用于惩罚预测值与真实值之间的差异,同时考虑到尺度和平移变化
L l = 1 H W ∑ i = 1 H W ρ ( d i ∗ , d i ) L_l = \frac{1}{HW}\sum_{i=1}^{HW}\rho(d^*_i,d_i) Ll=HW1i=1∑HWρ(di∗,di)
其中 d i ∗ d^*_i di∗和 d i d_i di分别是预测和真实值, ρ \rho ρ是仿射不变的平均绝对误差损失:
ρ ( d i ∗ , d i ) = ∣ d ^ i ∗ − d ^ i ∣ \rho(d^*_i,d_i)=|\hat d^*_i - \hat d_i| ρ(di∗,di)=∣d^i∗−d^i∣
d ^ i = d i − t ( d ) s ( d ) \hat d_i = \frac{d_i-t(d)}{s(d)} d^i=s(d)di−t(d)
- t ( d ) t(d) t(d)代表预测值或真实值的平移(translation),它的作用是将预测值或真实值的整体平移到零点附近。这样做的目的是消除预测值和真实值之间的整体偏移。
- s ( d ) s(d) s(d)代表预测值或真实值的尺度(scale),它的作用是对预测值或真实值进行缩放,使得它们的范围映射到单位尺度。这样做的目的是消除预测值和真实值之间的整体比例差异,以便更准确地比较它们的相对关系。
t ( d ) = m e d i a n ( d ) , s ( d ) = 1 H W ∑ i = 1 H W ∣ d i − t ( d ) ∣ t(d)=median(d),s(d)=\frac{1}{HW}\sum_{i=1}^{HW}|d_i-t(d)| t(d)=median(d),s(d)=HW1∑i=1HW∣di−t(d)∣
为了获得一个鲁棒的单目深度估计模型,我们从6个公开数据集中收集了150万张标注图像。此外,为了增强从这些标注图像中学习的教师模型 T T T,采用 DINOv2预训练权重来初始化编码器。在实践中,应用一个预训练的语义分割模型来检测天空区域,并将其视差值设置为0(最远)。
发挥未标注图像的潜力
🌎这是重点。
与之前需要大量构建多样化标注数据集的工作不同,强调未标注图像在增强数据覆盖方面的价值。
通过将单目未标注图像传递给预训练的表现良好的 MDE 模型,可以轻松获得密集的深度图。这比对立体图像或视频执行立体匹配或 SfM 重建要方便得多。选择了八个大规模公共数据集作为未标注来源,它们包含超过6200万张图像。下表下半部分提供了详细信息。
如何使用未标注的数据集技术上:给定先前获得的 MDE 教师模型 T T T,对未标注集 D u D^u Du 进行预测以获得伪标注集 D ^ u \hat D^u D^u:
D ^ u = { ( u i , T ( u i ) ) ∣ u i ∈ D u } i = 1 N \hat D^u = \lbrace (u_i,T(u_i))|u_i \in D^u \rbrace^N_{i=1} D^u={(ui,T(ui))∣ui∈Du}i=1N
- u i u_i ui 表示未标注数据集 D u D^u Du 中的每个样本,结合标注图像和伪标注图像的集合 D l ⋃ D u D^l \bigcup D^u Dl⋃Du,在其上训练学生模型 S S S。
- T ( u i ) T(u_i) T(ui) 则是由先前获得的单目深度估计(MDE)教师模型 T T T 对 u i u_i ui 进行的深度预测。
作者发现,尽管使用自训练管道注入了大量未标注图像,但并没有带来性能改进,与过去少量标注图像的观察结果相矛盾。作者推测,这可能是因为已有的标注图像已经足够丰富,从额外的未标注图像中获得的额外知识有限。尤其是在教师和学生模型共享相同预训练和架构的情况下,它们在未标注集上倾向于做出类似的预测。
为了解决这一困境,作者提出了一种新方法:通过向未标注图像注入强扰动来挑战学生模型。这些扰动包括强色彩失真(如色彩抖动和高斯模糊)以及强空间失真(如CutMix)。这些修改使得模型能够从大规模未标注图像中积极地获取额外的视觉知识,并显著提高了标注图像的基线表现,从而增强了模型的鲁棒性和处理开放世界数据的能力。
具体关于 CutMix 的细节如下:
它最初是为图像分类提出的,在单目深度估计中很少探索。首先在空间上插值一对随机的未标注图像 u a u_a ua和 u b u_b ub:,相当于融合二张图像。
u a b = u a ⊙ M + u b ⊙ ( 1 − M ) u_{ab} = u_a \odot M +u_b \odot (1 - M) uab=ua⊙M+ub⊙(1−M)
其中 M M M是一个矩形区域设为1的二进制掩码。未标注损失 L u L_u Lu首先在由 M M M和 1 − M 1 − M 1−M 定义的有效区域内计算仿射不变损失:
L
u
M
=
ρ
(
S
(
u
a
b
)
⊙
M
,
T
(
u
a
)
⊙
M
)
L_u^M = \rho(S(u_{ab}) \odot M,T(u_a) \odot M)
LuM=ρ(S(uab)⊙M,T(ua)⊙M)
L
u
1
−
M
=
(
S
(
u
a
b
)
⊙
(
1
−
M
)
,
T
(
u
b
)
⊙
(
1
−
M
)
)
L_u^{1-M} = (S(u_{ab}) \odot (1 - M), T(u_b)\odot(1-M))
Lu1−M=(S(uab)⊙(1−M),T(ub)⊙(1−M))
然后通过加权平均来聚合两个损失:
L u = ∑ M H W L u M + ∑ ( 1 − M ) H W L u 1 − M L_u = \frac{\sum M}{HW}L^M_u + \frac{\sum(1-M)}{HW}L^{1-M}_u Lu=HW∑MLuM+HW∑(1−M)Lu1−M
在上述公式中:
- S ( u a b ) S(u_{ab}) S(uab)表示对图像 u a b u_{ab} uab进行深度估计得到的预测深度图。
- T ( u a ) T(u_a) T(ua)和 T ( u b ) T(u_b) T(ub)分别表示对未标注图像 u a u_a ua和 u b u_b ub进行深度估计得到的真实深度图。
- M M M是一个二进制掩码,用于定义一个矩形区域,其中的像素值为1,其他区域为0。这个掩码用于控制在插值过程中哪些区域的信息来自于 u a u_a ua ,哪些来自于 u b u_b ub。
语义辅助感知
在深度估计研究中,有一些工作尝试通过辅助语义分割任务来提升深度估计的性能。在深度估计模型中加入高层次的语义信息是非常有益的。尤其是在处理未标注图像时,这些来自其他任务的辅助监督信号可以有效对抗伪深度标签中的潜在噪声。
为了获得更有信息量的语义信号,参考了DINOv2模型在语义相关任务中的强大表现,例如图像检索和语义分割,即使在冻结权重且没有微调的情况下也能取得良好效果。基于这一观察,提出通过辅助特征对齐损失,将DINOv2的强大语义能力转移到深度模型中。特征空间是高维且连续的,因此比离散掩码包含更丰富的语义信息。特征对齐损失的公式为:
L feat = 1 − 1 H W ∑ i = 1 H W cos ( f i , f i ′ ) L_{\text{feat}} = 1 - \frac{1}{HW} \sum_{i=1}^{HW} \cos(f_i, f_i') Lfeat=1−HW1i=1∑HWcos(fi,fi′)
其中 c o s ( ⋅ , ⋅ ) cos(·, ·) cos(⋅,⋅)衡量两个特征向量之间的余弦相似性。 f f f 是深度模型 S S S 提取的特征,而 f ′ f' f′ 是冻结的 DINOv2 编码器的特征。
特征对齐的关键点:
为了解决这个问题,为特征对齐设置了一个容差边界 α α α。如果 f i f_i fi和 f i ′ f'_i fi′的余弦相似度超过 α,这个像素将不被考虑在 L f e a t L_{feat} Lfeat 中。这允许的方法既享有来自 DINOv2 的语义感知表示,又享有来自深度监督的部分级别区分表示。作为副作用,生成的编码器不仅在下游 MDE 数据集上表现良好,而且在语义分割任务中也取得了强大的结果。这也表明的编码器有潜力作为一个通用的多任务编码器,适用于中级和高级感知任务。
最终,总体损失是三种损失 L l L_l Ll, L u L_u Lu 和 L f e a t L_{feat} Lfeat 的平均组合。
Depth Anything V2
论文地址:https://arxiv.org/pdf/2406.09414v1
github地址:https://github.com/DepthAnything/Depth-Anything-V2
新版本提供了模型的代码
与第一版相比,V2通过三个关键实践显著提升了深度预测的精细度和鲁棒性:
- 1)用合成图像替代所有标注的真实图像,
- 2)扩大教师模型的容量,
- 3)通过大规模伪标注的真实图像桥接训练学生模型
从模型架构的角度来看,这些工作可以分为两类。一类基于判别模型,如BEiT和DINOv2,另一类基于生成模型,如Stable Diffusion
深度估计中的标注数据问题与解决方案:
总体框架流程
训练Depth Anything V2的流程如下:
- 基于高质量合成图像训练可靠的教师模型DINOv2-G。
- 使用教师模型对大规模未标注的真实图像生成伪深度。
- 在伪标注的真实图像上训练学生模型,实现稳健的泛化。
作者将发布四个学生模型,分别基于DINOv2的小、中、大和巨型版本。
使用五个精确的合成数据集(59.5万张图像)和八个大规模伪标注的真实数据集(6200万张图像)进行训练。训练过程中忽略每个伪标注样本损失最大的10%区域,认为这些区域可能含有噪声伪标签。使用的损失函数包括尺度和位移不变的损失Lssi和梯度匹配损失Lgm。