当前位置:   article > 正文

单目深度估计---Depth Anything论文详解_depthanything

depthanything

今天讲一篇单目深度估计的绝世好文,Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data ,此论文发表于2024.01,开年王炸,来自来自香港大学、字节、浙江实验室,且已被cvpr2024录用。
笔者认为这篇论文的思路井井有条,上下连贯,而且消融实验充实很多另笔者信服。适合反复阅读咀嚼。

本文(Depth Anything)更注重于非常多数据集下训练过程的技巧,在模型架构上没有过多的改进。

以下,笔者带领各位读者阅读讲解论文原文中比较重要的部分,希望能够更清楚的理解Depth Anything
强烈推荐读者阅读原论文!!!

前言

论文题目:Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data —— 任何深度:释放大规模无标记数据的力量(注意论文名字,因为后续的很多工作都是在未标注数据上做的。)

论文地址:https://arxiv.org/abs/2401.10891.pdf

源码地址:https://github.com/LiheYoung/Depth-Anything

Abstract 概要

作者认为Depth Anything是一种用于稳健单目深度估计的非常实用的解决方案。在不追求新颖的技术模块的情况下,作者目标建立一个简单而强大的基础模型(而且是Zero-shot)。为此,作者通过设计一个数据引擎来收集并自动标注大规模未标记数据(∼62M),从而扩大数据覆盖范围,来能够减少泛化误差。(训练的数据量很多)

作者研究了两种简单而有效的策略,这些策略使数据扩展很有希望。
首先,通过利用数据增强工具创建更具挑战性的优化目标。它迫使模型积极寻求额外的视觉知识并获得强大的表示。
其次,开发了一种辅助监督来强制模型从预训练的编码器(encoder是特征语义分割的encoder)继承丰富的语义分割先验

概要结尾总结起来三点:
1 使用大量的未标注图像信息
2 采用优化策略—数据增强工具(作用在未标注图像)
3 进行辅助监督—继承语义分割知识(作用在未标注图像)

1 Introduction 介绍

计算机视觉和自然语言处理领域目前正在经历一场革命,出现了“基础模型”,这些模型在各种下游场景中表现出强大的零/少样本性能(比如说Segment Anything)。同时作者认为,深度估计也需要这类基础模型(所以作者取名Depth Anything)。(小插曲: 原论文第一页左下角有注释:While the grammatical soundness of this name may be questionable,we treat it as a whole and pay homage to Segment Anything------------虽然这个Depth Anything的语法合理性可能值得怀疑,但我们将其视为一个整体,并向 Segment Anything 致敬)

作者谈到了Midas模型, 它的训练策略是通过在混合标记数据集合(a collection of mixed labeled datasets)上训练(就是说所有的数据集都是含有lable标签的)。作者认为这种数据范围受到限制,(作者在此基础上进行了改进,用了大量的未标注信息)
相比于上面的Midas模型的训练集,作者使用他们原始的未标记图像(没有任何形式的标签,标注)。为了给未标记图像提供可靠的注释工具,作者从六个公共数据集中收集了 1.5M 标记的图像来训练初始 MDE(monocular depth estimate 单目深度估计) 模型(作者后续称之为T模型)。然后,未标记的图像会被这个MDE模型注释(伪标签),让最终的模型(作者后续称之为S模型)与伪标注的图像与真实标注的图像共同学习(其实说到底就是半监督的策略)。

笔者简述:
1 通过已有标签的数据来训练一个MDE模型(称之为T模型)
2 未标签的数据通过T模型来生成伪标签
3 通过已有标签的数据和第2步中生成的伪标签数据来训练另一个MDE模型(称之为S模型)

但是!!!利用这种大规模的无标记图像确实并非易事,尤其是在有足够的标记图像和强大的预训练模型的情况下。在作者的初步尝试中,直接组合标记和伪标记数据未能改善仅使用标记图像的基线(论文后面作者会讲详细的设计过程和失败的原因)。-------解释: 把有GT标签和伪标签的图片放到一起送入到学生模型(S模型)当中,与只使用GT标签图像训练的S模型相比,没有太大提升。所以作者认为大规模的无标记图像并没有被完整的利用到。作者推测,以这种幼稚的自学方式获得的额外知识是相当有限的。如何解决------扰动图片(图片增强),增强S模型的泛化能力。

笔者简述:
1-- 单纯的使用伪标记图像与真实标注的数据对S模型进行训练是没有提升的
2-- 1的思考引发了作者,可以考虑对伪标注图像进行数据增强来提升S模型的能力

接下来作者讲到语义对单目深度估计的好处-----已经有一些工作证明了辅助语义分割任务对MDE的好处。作者也遵循这一研究思路,旨在为模型提供更好的高级场景理解能力。然而,作者观察到,当MDE模型已经足够强大时,这样的辅助任务很难带来进一步的收益(论文后面作者会讲详细的设计过程和失败的原因)。作者推测这是由于将图像解码为离散类空间时语义信息的严重丢失。因此,考虑到 DINOv2 在语义相关任务中的出色表现,作者建议通过简单的特征对齐损失(比如说余弦相似性损失,二范数损失,具体的后面作者会详细说明)来保持其丰富的语义先验。这不仅增强了 MDE 性能,而且还为中级和高级感知任务提供了多任务编码器。
PS:DINOv2是在Segment Anything之后发布的大模型,其底层是 Vision Transformer (ViT) 架构。

笔者简述:
1 谈到了语义知识对于单目深度估计的好处。
2 首先作者是把语义分割的结果----离散的信息,来引导S模型学习单目深度估计任务。
3 作者根据1的思考,改使用语义分割的特征----连续的信息,来引导S模型学习单目深度估计任务(特征对齐损失),会发现效果会得到提升,增强了MDE性能。

作者在Introducition结尾提到的创新点:
1 强调了大批量数据对单目深度估计的改善(之前是没人做过的)
2 指出了如何更好的联合训练GT和伪标签数据------通过数据增强来产生更难的优化目标让模型学习到额外知识。
3 不使用辅助的语义分割任务结果,而是使用语义分割的预训练encoder)(比如DINOV2)(生成语义分割特征来为模型提供丰富的语义先验知识。

2 Related Work 相关工作

相关工作就不细看了。要注重一个关键点,Zero-shot depth estimation 的末尾,有这样一句话:

Besides, as demonstrated by ZoeDepth , a strong relative depth estimation model can also work well in generalizable metric depth estimation by fine-tuning with metric depth information. Therefore, we still follow MiDaS in relative depth estimation, but further strengthen it by highlighting the value of large-scale monocular unlabeled images
此外,正如ZoeDepth 所证明的那样,一个强大的相对深度估计模型也可以通过对度量深度信息进行微调,在可推广的度量深度估计中很好地工作。因此,我们仍然遵循MiDaS的相对深度估计,但通过突出大尺度单目未标记图像的价值来进一步加强它。

这段话就是说,本论文的模型在训练和推理的时候都是进行的相对深度估计。如果在自驾任务或其它需要绝对深度的时候呢?那就通过微调就可以获得很好的模型性能。所以作者在做实验期间用的绝大多数是相对深度估计,在后续模型性能展示和消融的时候也同样会用到绝对深度估计(作者会进行特别说明)。

3 Depth Anything 实验过程

第一节主要定义了一些符号 D l D^l Dl是有GT的数据, D u D^u Du是无GT的数据, T表示老师模型,只用 D l D^l Dl数据集训练。 S表示学生模型,用 D l D^l Dl D u D^u Du数据集训练。

3.1 learning labeled images --------T模型

经典的训练过程,模型不细讲了,损失函数采用的是仿射不变损耗(affine-invariant loss)
在这里插入图片描述
,,,,,在这里插入图片描述
d i ∗ ^ \hat{d_i^*} di^是预测值 d i ∗ d_i^* di的缩放结果,缩放到-1到1
d i ^ \hat{d_i} di^是真实值 d i d_i di的缩放结果,缩放到-1到1.
在这里插入图片描述
在这里插入图片描述
因为 即GT的anno标注的是绝对深度( d i d_i di),而模型预测的是相对深度,所以要从绝对深度转变为相对深度。
PS:这里面作者用了中位数,读者可以想一下为什么用中位数而不用平均数?------------平均数容易受极值影响,比如1/3都是天空,那么对平均数的影响就比较大。

训练集的说明

为了后续的Zero-shot比较 ,作者训练的时候没有使用NYUv2数据集(indoor)和KITTI数据集(outdoor)
在这里插入图片描述
预训练权重使用dinov2模型(segment anything的主模型)
同时应用预训练的语义分割模型来检测天空区域,并将其视差值(相对深度)设置为0(最远)。

3.2 Unleashing the Power of Unlabeled Images -S模型

作者首先对 D u D^u Du数据集进行处理,用T模型进行预测,将预测做做为 D u D^u Du的标签,得到新的数据集 D u ^ \hat{D^u} Du^。下图是笔者整合的两个数据集,读者可以对比来看,数据集的第一个表示的是图片,第二个值表示的是标签。
在这里插入图片描述
最终作者是在有标签和无标签数据集上训练的S模型。同时需要注意的,根据之前的工作,没有从T模型微调S模型,而是重新初始化S以获得更好的性能。

训练S的模型并不如意,结果和T模型效果差不多(下图为原论文的table9)
在这里插入图片描述
没有达到数据很多,效果很好的情况,作者认为S模型从真实标签的数据(毕竟1M多图片)中学习到了很多。而从未标签的图像中没有学习到太多额外的知识。而且由于S和T模型的架构相同,所以S模型最终的预测似乎会和T模型的预测差不多,导致S模型学习不到更多的东西。
因此,作者提出,使用更难的优化目标来让S模型学习,训练过程中,作者向未标记的图像注入强烈的扰动。它迫使S模型积极寻求额外的视觉知识,并从这些未标记的图像中获得不变的表示。这些优势有助于S模型更强大地处理开放世界。

具体的,介绍了两种形式的扰动:一种是强烈的色彩失真,包括色彩抖动和高斯模糊,另一种是强烈的空间失真,即CutMix(yolov5用到的)。尽管简单,但这两个修改使大规模未标记图像显着改善了标记图像的基线
注意,两个扰动都是对未标注的数据集进行的处理

第一种就不细讲了,对图片加个高斯模糊或其它操作就行了。
下面讲一下第二种扰动,cutMix:
在这里插入图片描述
这个损失也很好计算,无非就分成了M区域的损失和1-M区域的损失。
M区域的损失:
在这里插入图片描述
S模型预测cumMix图像的结果,且只取M区域。----预测值

T模型预测M区域对应的cutmix前原图像的结果。-----真实值。
这一步不需要加载T模型来预测。之前通过T模型构建 D u ^ \hat{D^u} Du^数据集时,就得到的了 u a u_a ua图像的预测值(伪标签),这里只需要通过截取操作,截取M区域的伪标签即可)

1-M区域的损失:
在这里插入图片描述
这里分析和上面就一致了。
S模型预测cumMix图像的结果,且只取1-M区域。----预测值

T模型预测1-M区域对应的cutmix前原图像的结果。-----真实值。
这一步不需要加载T模型来预测

那么最终的LOSS就很好计算(取对应权重,M区域越大,对应的损失就越大):在这里插入图片描述
损失函数中,特别的,如果M为全图的话,∑M=H*W(即u_a得全图),u_b中为空。

还有个细节,训练的时候有50%的时候使用cutmix。 那么不使用cutmix的时候传入的图片是什么呢?
笔者分析了下:还是传入两张图片,另M=1即可,这样损失函数的形式就不用改变。

引入了扰动后的结果:有所上升(红色区域,S表示时Strong perturbations 强烈扰动)
在这里插入图片描述

3.3. Semantic-Assisted Perception 语义辅助感知

有一些工作通过辅助语义分割任务改进了深度估计。作者相信,用这种高级语义相关信息辅助深度估计模型是有益的。此外,在利用未标记图像的特定上下文中,这些来自其他任务的辅助监督信号也可以对抗伪深度标签中的潜在噪声。
因此,作者进行了初步尝试,使用 RAM + GroundingDINO + HQ-SAM 模型的组合,仔细地将语义分割标签,即labels/targets 离散值 /每个像素点的类别信息,分配给未标记的图像。经过后处理后,这将生成一个包含 4K 类的类空间(语义分割的总label数量是4000个)。在联合训练阶段,该模型被强制执行,以使用共享编码器和两个单独的解码器分别生成深度和分割预测(两分支)。不幸的是,经过反复试验,仍然无法提高原始 MDE 模型的性能。
以下是笔者设想的模型架构:
在这里插入图片描述

作者推测,将图像解码为离散类空间(最终语义分割得结果值)确实会丢失太多的语义信息(对应上图的segmentation_pred,此时的这个值就是离散值,对每个像素点的4000类分类)。这些语义掩码中的有限信息很难进一步提升深度估计模型,尤其是当深度估计模型已经建立了非常有竞争力的结果时。

(笔者从马后炮的角度来看,语义分割的label是离散的整数,值的含义表示的是整数的类别。 深度估计的结果是连续的,值的含义表示的是像素点的深度回归值。 此时用语义分割的Label的离散值去辅助深度估计的连续值,可能就不这么合理。 比如说,图像中可能有一个物体,有离相机很近的区域,同时也有相机很远的区域,最终得到的深度值肯定是不一样的,而因为是同一个物体,语义分割的label值却是一样的。)

上面作者分析了,可能是语义信息不够好,因此,后续作者旨在寻求信息量更大的语义信号,作为深度估计任务的辅助监督。作者看到了segmentation模型的强大,于是,作者建议将其强大的语义能力转移到深度模型中,并具有辅助特征对齐损失。特征空间是高维和连续的,因此包含比离散掩码更丰富的语义信息。特征对齐损失表述为在这里插入图片描述
Cos: 测量两个特征向量之间的余弦相似度。

此时的模型架构就很类似原论文的figure2的虚线架构:
在这里插入图片描述

笔者简述:
1 谈到了语义知识对于单目深度估计的好处。
2 首先作者是把语义分割的结果----离散的信息,来引导S模型学习单目深度估计任务。
3 作者根据1的思考,改使用语义分割的特征----连续的信息,来引导S模型学习单目深度估计任务(特征对齐损失),会发现效果会得到提升,增强了MDE性能。

还有一个问题,笔者上面也谈到过:图像中可能有一个物体,有离相机很近的区域,同时也有相机很远的区域,最终得到的深度值肯定是不一样的,而语义分割的特征是一致的。比如说车头和车尾。作者说,如果强制的让f_i和f_i’一致的话,那么最后对深度估计这个模型是没有好处的。
所以作者这里设置了一个容忍度α,即不让 f i f_i fi f i ′ f'_i fi全一样,导致语义信息对于深度信息过拟合。在进一步的说如果L_feat相似度大于α,就不执行L_feat这个损失。

3.4 Loss 最终损失函数

最终的模型架构可以看原论文图2
在这里插入图片描述

最终的损失函数就是三个损失函数。

T模型
在这里插入图片描述
S模型中针对未标注图像的损失, 针对标注的损失和上面一样
在这里插入图片描述

S模型中的语义特征损失
在这里插入图片描述

4 Experiment 实验

模型的流程讲完了,后续的实验同样很精彩。

4.2. Zero-Shot Relative Depth Estimation

作者强调,没用如下数据集进行训练:KITTI , NYUv2 , Sintel , DDAD , ETH3D and DIODE .
然后作者拿MDE模型与MiDas v3模型进行比较,MiDasv3模型训练的时候使用了更多的含labeled的数据集。 而且注意的是,MiDasv3模型训练的时候还使用了KiTTI和NYUv2数据集。而depth anything是没有的。
在这里插入图片描述
结果很夸张,体现了Depth Anything模型在zero-shot下的实力。 而且depth anything 在比较小的encoder(作者在文中提到,参数量是midas模型大小的1/10)就能达到非常好的效果。

4.3. Fine-tuned to Metric Depth Estimation

通过微调得到绝对的深度估计。 作者这里还细分了,一个是见过这个数据集 4.3.1 。一个是zero-shot 4.3.2

4.3.1 In-Domain Metric Depth Estimation

在这里插入图片描述

在这里插入图片描述

值得一提的是,作者这里采用了ZoeDepth框架(方便和之前ZoeDepth模型对比),并采用了相对基础的深度模型,作者相信,如果配备更高级的架构,结果可以得到进一步的增强。

4.3.2 Zero-Shot Metric Depth Estimation

作者需将 MiDaS 的encoder替换为 Depth Anything 的encode,其他组件保持不变。
在这里插入图片描述

4.4. Fine-tuned to Semantic Segmentation

作者这里还进行了语义分割的结果对比。笔者读到这也是很惊讶的,毕竟是深度估计的模型,竟然也涉及了语义分割的结果比较。
笔者估计:因为前面涉及了语义分割特征和深度估计特征的对齐操作(L_feat损失),那么模型肯定或多或少的会去学到一些语义知识,来看看效果:
在这里插入图片描述
效果也是很好的。笔者认为,由于特征对齐的操作,深度估计学习到了语义分割的特征,那么反过来,语义分割的任务同样学到了深度估计的特征,再加上两个任务的目的基本一致,两者相辅相成,导致了语义分割任务的结果也是比较好的。
作者这里也给了一个很前沿的思想: 希望强调的是,预训练编码器在单目深度估计和语义分割任务方面的优越性,作者相信它(Depth Anything)有很大的潜力作为中级和高级视觉感知系统的通用多任务编码器----推广和衍生。

4.5 ablation studies

这里主要是针对vit-L模型做的消融实验,除非另有说明。

作者首先探究有labeled的6个数据集中,哪个数据集更有效。如表6
在这里插入图片描述

每一列表示,这次训练只用这一个数据集,然后在其它没见过的数据集去做zero-shot。最终作者认为 HRWSI这个数据集更有效。

回看下之前数据集的构成:
在这里插入图片描述
这里笔者回去看了下数据集的构造,另笔者震惊的是,这个数据集的个数只有20K(作者原文也提到)。作者认为这是数据多样性的作用,这与作者使用未标记图像的动机一致(作者认为不是数据多就有用,而是数据多样才有用)。

作者这里顺带提了下。测试数据集结果较差的MegaDepth ,作者认为它有别的数据偏好,这些偏好没有反映在这六个测试数据集中。例如,作者发现使用MegaDepth数据训练的模型专门用于估计超远程建筑物的距离(图1),这对飞行器(aerial vihicle,无人机)非常有益。

接着上面作者的结论-----数据的多样性才能带给模型更好的性能,而不是更多的图片------同时作者认为还要有语义信息的辅助,也能带给模型预测更准确的深度估计-----------表9
在这里插入图片描述
这个是对学生模型训练的消融实现,
看第一第二行,发现性能效果几乎一模一样,作者分析认为简单地用伪标签添加未标记的图像并不一定能为模型带来收益,因为标记的图像已经足够了。
再看第二第三行,同样的数据集下,对未标记的图像施加了强烈的扰动 (S),学生模型面临着寻求更多视觉知识并学习更强大的表示的挑战。因此,大尺度无标记图像显著增强了模型泛化能力。
再看第三和第四行,通过语义约束(L_feat)来辅助完成深度估计任务,也可以增强模型泛化能力。
可以说表9就是第三章流程的缩影。

接着作者把本模型微调然后和其它两个模型在下游任务上进行对比
第一个是和MiDas(做深度估计任务)模型
在这里插入图片描述
第二个是和DINOv2 (做图像分割任务)模型, 因为这里作者拿了这个模型的部分做了预训练,所以要和原权重比一下
在这里插入图片描述
结果上看都是本模型更好,分析的话,之前分析了,语义分割特征和深度估计特征之间相辅相成,互相成就了彼此。

4.6 Qualitative Results 可视化

这里只说明图4吧
在这里插入图片描述
两个模型(Depth Anything 和MiDas)通过对原图(第一行)进行预测,得到深度图(第二行)。
接下来是通过图像生成计数,并以深度图辅助,将各深度图经过ControlNet模型得到结果图(第三行)
可以发现,DepthAnything的深度图最终生成的图像的细节更好。也侧面体现出模型的强大。

7.More Ablation Studies 更多消融实验

结论后续的附录笔者不带大家细看了。 但笔者还是强调第7节的内容。

作者这里分析讨论了:之前是把语义特征送入到了未标注的数据集中,如果送到了标注的数据集中,会带来什么样的效果呢?
在这里插入图片描述
(上图是说把L_feat放到 U(ulabeled无标签数据集)里面和L(labeled 有标签)数据集里面的对比)
这里主要看第一行和第三行的结果
作者发现,性能提升并不明显,作者给出解释:因为标记的数据具有相对更高质量的深度注释(毕竟是激光雷达物理设备得到的)。语义丢失的参与可能会干扰这些信息性手动标签的学习。
相比之下,伪标签噪音更大,信息量更少(不是激光雷达那种物理设备)。因此,在未标记数据中引入辅助约束可以对抗伪深度标签中的噪声,并为模型提供语义能力。

5 Conclusion总结

作者提出了Depth Anything 模型,这是一种非常实用的稳健单目深度估计解决方案。与现有技术不同,作者特别强调廉价和多样化的无标记图像的价值。设计了两种简单而高效的策略来充分利用它们的价值:1)在学习未标记的图像时提出更具挑战性的优化目标(色彩变化,cutmix),以及2)从预训练模型中保留丰富的语义先验(特征对齐)。因此, Depth Anything 模型表现出出色的零样本深度估计能力,并且还可以作为下游度量深度估计和语义分割任务的有前途的初始化。

回看

来回看下abstract中作者总结的三点
1 大量的未标注图像信息
2 优化策略(通过数据增强)
3 辅助监督(语音分割的先验)

并回看下introduciton中的三个创新点:
1 强调了大批量数据对单目深度估计的改善(之前是没人做过的)
2 指出了如何更好的联合训练GT和伪标签------更难的优化目标让模型学习到额外知识-------------作用在unlabeled数据集上
3 不使用辅助的语义分割任务,而是使用语义分割的预训练encoder(比如DINOV2)来为模型提供丰富的语义先验知识-------------作用在unlabeled数据集上

回看标题:Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data
作者确实都是在尽可能的去挖掘这个更大规模的未标注数据的这个能力。

参考

强烈推荐B站视频:https://www.bilibili.com/video/BV1pK42147Yh/ (希望读者自行看过原论文后,再看此视频)

欢迎指正

因为本文主要是本人用来做的笔记,顺便进行知识巩固。如果本文对你有所帮助,那么本博客的目的就已经超额完成了。
本人英语水平、阅读论文能力、读写代码能力较为有限。有错误,恳请大佬指正,感谢。

欢迎交流
邮箱:refreshmentccoffee@gmail.com

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/967310
推荐阅读
相关标签
  

闽ICP备14008679号