Depth Anything - 单目深度估计的基础模型

原文:towardsdatascience.com/depth-anything-a-foundation-model-for-monocular-depth-estimation-8a7920b5c9cc

🚀 Sascha 的论文俱乐部

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/354e1dcf7abcd68b79380a6c9aed4a3e.png

Sascha Kirch出版物创建的图像

单目深度估计,从 2D 图像预测 3D 空间中的距离。正如在每一篇关于深度估计的论文中所说的,“病态且本质上模糊的问题”,是计算机视觉和机器人学中的一个基本问题。同时,基础模型在基于深度学习的 NLP 和计算机视觉领域占据主导地位。如果我们能利用它们的成功来进行深度估计,那岂不是太棒了?

在今天的论文解读中,我们将深入探讨“Depth Anything”,这是一个用于单目深度估计的基础模型。我们将了解其架构、用于训练它的技巧以及它是如何用于度量深度估计的。


论文Depth Anything:释放大规模无标签数据的力量,杨立河等,2024 年 1 月 19 日

资源GitHub项目页面演示检查点

会议:CVPR2024

类别:基础模型,单目深度估计

其他解读: [BYOL] – [CLIP] – [GLIP] – [Segment Anything] – [DINO] – [DDPM]


概述

  1. 背景

  2. 方法

  3. 定性结果

  4. 实验

  5. 进一步阅读与资源


背景

为什么深度是一个如此重要的模式,为什么使用深度学习来处理它?

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fdf5110801ef1a8e416d9fad23717e04.png

图 1:图像及其对应的深度图。图像由 Sascha Kirch 提供,深度图使用 Depth Anything Hugging Face Demo 创建。Sascha KirchDepth Anything Hugging Face Demo

简单来说:为了在三维空间中导航,必须知道所有东西的位置以及它们的距离。经典应用包括碰撞避免、可行驶空间检测、将物体放置在虚拟或增强现实环境中、创建 3D 对象、引导机器人抓取物体等等。

深度可以通过具有不同测量模式的各种传感器捕获,使用主动或被动测量原理以及不同数量的传感器。问题是每个传感器都有其优点和缺点,但总结一下:捕获精确的深度是昂贵的!

那么,使用一个相对便宜、不需要复杂设置、不需要太多空间、重量轻且已在许多系统中可用的传感器不是很好吗?这个传感器就是摄像头。使用单个摄像头解决了许多问题,但同时也带来了新的问题:从 2D 图像预测 3D 信息是不良设定的,这意味着我们没有足够的信息来明确地预测深度:物体是小的还是仅仅距离远?表面是凹的还是凸的?这似乎是深度学习,我们的通用函数逼近器的工作!

这个问题以前是如何解决的?

近年来,许多深度学习方法被研究用于从单张图像中进行深度估计。一些尝试了基于回归的方法来直接预测深度值,而另一些则将深度离散化并执行分类以预测像素应该位于哪个深度区间。

随着生成式深度学习的兴起,许多研究人员也使用了 GANs、VAEs 或基于扩散的模型,包括我自己 🤓

RGB-D-Fusion:由 Sascha Kirch 等人于 2023 年提出的类人形主体的图像条件深度扩散

虽然许多模型表现出了有希望的性能,但它们的用途通常非常特定于应用:例如,室内场景与室外场景,预测相对深度与度量深度,稀疏深度与密集深度。

预训练的基础模型已经显示出出色的零样本性能,并且可以使用相对较少的数据样本对新应用进行微调。由于它们非常需要数据,基础模型通常只适用于互联网上可用的模式:图像和文本,但不适用于深度数据……直到现在!


方法

在讨论了深度的重要性以及拥有一个深度数据的基础模型将是理想的选择之后,让我们深入了解 Depth Anything 的作者是如何实现这一点的。

Depth Anything 简述

Depth Anything 是一个自动编码器模型,输入图像并预测深度图。它在标记和未标记图像的组合上训练。

训练过程中涉及多达 3 个阶段:

  1. 在标记图像上训练教师模型。

  2. 使用教师模型为未标记数据创建伪标签,以预训练学生模型(Depth Anything 模型)。

  3. (可选)将模型微调到特定任务或数据集。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/76083fea3f18f19c42030e2469a6f988.png

图 2:Depth Anything 管道。来源:Sascha Kirch + 标注

深入挖掘

收集大量带标签的数据既昂贵又耗时。另一方面,未标记图像数量庞大且易于收集。因此,我们自然会想利用这些数据来训练深度学习模型。一些先前的研究有相同的思想,并结合了经典计算机视觉算法(如立体标定或运动结构)和未标记数据来获取深度标签,但这相当耗时。

Depth Anything 的作者使用包含 1.5M 个样本的标记数据集和一个强大的预训练 DINOv2 编码器(以其语义丰富的表示而闻名的基座模型)训练了一个强大的教师模型,并使用它为训练学生而生成伪标签,这些伪标签用于训练 62M 个未标记样本。

这样,学生可以使用监督技术进行训练,并且能够快速轻松地获得密集的深度图。请注意,虽然伪标签并不完美,但还需要进一步技巧来训练学生。学生的架构与教师相同,但不使用教师的权重。其编码器也使用 DINOv2 进行初始化,但其解码器是随机初始化的。

每当 Sascha Kirch 发布内容时,都收到一封电子邮件 🚀 _ 每当 Sascha Kirch 发布内容时,都收到一封电子邮件 🚀 想了解更多关于深度学习或保持最新信息…medium.com

关于特征对齐的一些话

之前的研究表明,在训练模型时增加额外的语义分割任务可以提高深度估计的准确性。其背后的直觉是,如果你对世界有更好的理解(更有意义的特征嵌入),也可以更好地解决深度估计任务中的歧义。

在一次失败的尝试中,Depth Anything 的作者试图在未标记数据上训练一个共享编码器,并为深度估计任务和语义分割任务使用单独的解码器。未标记图像已被结合基座模型进行标注。

最终,他们实现了特征对齐约束。在学生模型的训练过程中,学生的编码器被约束为具有与冻结的 DINOv2 编码器(一个以其语义丰富表示而闻名的基座模型)相似的特征。正如我们稍后将会看到的,这种相似性是通过余弦相似度来强制的。

然而,由于 DINOv2 对于物体的一部分(例如汽车的前部和后部)具有非常相似的特征,并且在深度估计的子部分可以具有非常不同的深度值,因此他们也引入了一个边缘来强制执行相似性,但仍然从中受益。

那么那些扰动呢?

因此,仅向训练流程中添加未标记数据不足以在仅基于标记数据的基线之上进一步提高性能。

作者所做的是向学生消耗的未标记数据添加强烈的扰动。请注意,这些扰动仅添加到学生输入,而不是教师输入,也不是到 DINOv2 编码器。类似的方法已经在其他自监督框架中使用了,如 DINO 和 BYOL

这些扰动包括颜色抖动、图像噪声和空间扭曲等增强技术。

这些扰动背后的直觉始终相似:让模型学习相同事物的相似特征,无论它们在图像中的外观如何。无论图像是模糊的还是水平镜像的,汽车就是汽车。

用于训练模型的 Data

作者组成了一个数据集,包含 150 万个标记图像和 6200 万个未标记的室内外场景图像。

标签是密集的深度图,意味着每个像素都将与其关联一个深度(如果地图比图像小,可能需要插值)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/93f53bc0d3cdb2bb254a5d3497b2079b.png

表 1:数据集组成。来源 + 由 Sascha Kirch 编写的注释

如前所述,标记数据用于训练教师模型和学生模型。未标记数据仅用于训练学生模型。

训练模型的损失函数

学生模型的损失函数是 3 个损失项的平均值:

  1. 学生预测和真实标签之间标记图像的损失。

  2. 学生编码器和 DINOv2 之间特征对齐的损失。

  3. 学生预测和教师从未标记数据生成的伪标签之间未标记图像的损失。

让我们从标记图像开始: 这是在学生模型对图像的预测和标记数据集的相应标签之间的一种简单平均绝对误差,即 MAE。

https://medium.com/@SaschaKirch 的注释](…/Images/e28fed3841ffb5f813b42a670341227d.png)

方程式 1:标记图像的损失项。来源 + Sascha Kirch 的注释

特征对齐损失 是通过学生模型的编码器输出和 DINOv2 编码器输出之间的平均余弦相似度来计算的。由于我们希望损失惩罚不相似性,我们从 1 减去余弦相似度。请注意,余弦相似度衡量的是两个向量之间的角度,而不是它们的距离。

https://medium.com/@SaschaKirch 的注释](…/Images/e5fa78c49a62b6cb6e1f447b890dc062.png)

方程式 2:特征对齐的损失项。来源 + Sascha Kirch 的注释

注意:论文提到了一个边缘 𝛼,以避免过于强烈地约束相似性,如前所述。关于这一点,论文并不十分明确,但我猜他们忽略了小于 𝛼 的损失,并根据他们的消融研究使用 𝛼=0.15。

最后,让我们看看未标记的数据。 尽管对单个图像应用了强烈的扰动,但作者还为 50% 的样本实现了 CutMix 增强技术。它基本上是使用掩码组合 2 张图像。

https://medium.com/@SaschaKirch 的注释](…/Images/939c2df035bee65b2b35677bae33c6e3.png)

方程式 3:CutMix 图像构建。来源 + Sascha Kirch 的注释

然后将组合图像输入到学生模型中,将单个图像输入到教师模型中以获得伪标签。然后计算平均绝对误差。请注意,损失计算了两次,一次为每个由掩码 M 确定的贡献图像。

https://medium.com/@SaschaKirch 的注释](…/Images/22be2b76fad1d4b9b68fd5492e4183ac.png)

方程式 4:用于未标记图像的损失项的各个损失项。来源 + Sascha Kirch 的注释

最后,将各个项相加,并对所有像素取平均值。我猜没有必要再次乘以掩码,因为已经在上面的方程中完成了。

https://medium.com/@SaschaKirch 的注释](…/Images/aa01d4e319749a1e9c9a8ba33e904a68.png)

方程式 5:未标记图像的损失项。来源 + Sascha Kirch 的注释


定性结果

在深入实验和消融之前,让我们先改变论文的顺序,先检查一些定性结果。

在第一次测试中,模型使用来自不同领域的未见图像进行推断,包括室内和室外场景以及不同的光照条件。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/25d5c92e5eaafa16797f025d0555ac5e.png

图 3:六个未见数据集上的定性结果。来源 + Sascha Kirch 的注释

此外,他们将其性能与 MiDaS v3.1 进行比较,表明 Depth Anything 模型总体上能够捕捉更多细节,并且对场景有更好的整体理解,从而能够更好地解决歧义。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/250beaabe2d5af7099b8ed0b1583e650.png

图 4:Depth Anything 与 MiDaS v3.1 的定性比较。来源 + Sascha Kirch 的注释

在最后的定性测试中,他们使用了一个 ControlNet,一个基于扩散的生成模型,根据预测的深度图和输入提示生成新的图像。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e34c4aa64714b107bbbe1d41a02190a1.png

图 5:使用预测深度进行深度+文本条件 ControlNet 的图像生成。来源 + Sascha Kirch 的注释


实验和消融

现在,让我们更仔细地看看已经进行的实验和消融,以评估他们方法的有效性。

实验部分

总结来说,作者在他们的实验中表明:

  1. Depth Anything 编码器在 0-shot 相对深度估计和域内微调度量深度估计方面优于之前的 SOTA,即使是在较小的骨干网络上。

  2. 特征对齐约束是有效的,并且 Depth Anything 编码器具有语义丰富的特征,可以被微调到分割模型中。

零样本相对深度估计

在这个实验中,Depth Anything 模型在作者组成的数据集上预训练,并在其他数据集上评估,而没有看到这些数据集的任何样本(0-shot)。它与 MiDaS v3.1 的最佳检查点进行比较。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b95374c95fcfc8363e407d3ffe18d10e.png

表 2:零样本相对深度估计来源 + Sascha Kirch 的注释

域内微调度量深度估计

在这个实验中,预先训练在相对深度估计上的 Depth Anything 模型被微调用于度量深度估计。一个编码器-解码器模型使用预先训练的 Depth Anything 编码器和随机初始化的解码器进行初始化。然后使用给定数据集的训练集通过 ZoeDepth 框架进行微调,并在同一数据集上最终评估,并与其他模型进行比较。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b970b8f1b0b03ac97589c74601b3bb41.png

表 3:微调(领域内)度量深度估计来源 + 标注由Sascha Kirch提供

微调(零样本)度量深度估计

在这里,相同的预训练 Depth Anything 模型被微调用于度量深度估计,但这次在它测试的另一个数据集上进行评估。

ZoeDepth 框架用于微调两个度量深度估计模型。第一个模型使用 MiDaS v3.1(在表中显示为 ZoeDepth)作为编码器,第二个模型使用 Depth Anything 编码器。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ffbd5bc62dc39a359377f45dea954f76.png

表 4:微调(零样本)度量深度估计来源 + 标注由Sascha Kirch提供

微调语义分割

在这个实验中,作者测试了 Depth Anything 编码器的语义能力。回想一下,它在训练过程中通过他们的特征对齐损失被约束,以拥有与 DINOv2 编码器相似的特征,DINOv2 是一个已知具有丰富语义嵌入的基础模型。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a2352f3aa494c6befcc91ad296d8e07c.png

表 5:微调语义分割来源 + 标注由Sascha Kirch提供

消融

一般消融研究

在这个一般消融研究中,作者测试了他们不同的损失项和约束以及强扰动在未标记数据上的有效性。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/49d32d88f3963aeb5ac04eedd03d7116.png

表 6:一般消融研究针对单个损失项和强扰动。来源 + 标注由Sascha Kirch提供

不同编码器用于下游任务

在这个最后的消融研究中,作者展示了当在深度估计和语义分割任务上进行微调时,他们的编码器优于 DINOv2 的编码器和 MiDaS 的编码器,这表明 Depth Anything 编码器的特征空间捕捉了更多的语义信息。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/68ba85728d3abc4c5931be0bc591d290.png

表 7:不同下游任务上不同编码器的比较。来源 + 由 Sascha Kirch 撰写的注释


结论

深度一切是迈向除图像或文本之外其他领域基础模型的一大步。他们成功训练了一个强大且语义丰富的编码器模型,该模型可以以零样本模式使用,或者进一步微调到自定义数据集。


进一步阅读与资源

这里有一份链接列表,提供了关于深度一切和基础模型的更多资源。

Hugging Face 演示:与深度一切互动:

深度一切 – 李河勇的 Hugging Face Space

论文解读

你可能还会喜欢我的其他论文解读,涵盖其他基础模型:

Sascha Kirch 的论文解读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值