Marigold V2:用画画的扩散模型测距离,精细到每根发丝

一张照片里根本没有距离——深度估计凭什么靠"猜"?

Marigold 的做法一句话能说清:把深度估计当成画画来办。它拿到一张照片,再叠上一张满是噪声的深度底片,让扩散模型一步步把噪声清掉,清出来的就是这张照片的逐像素深度图。去噪的每一步都在替照片补回被压扁时丢掉的距离信息,补位的依据,是画图模型在海量图片上背下来的世界先验:树挡着房子,说明树更近;远处的建筑又小又模糊,说明它在几十米外。它没有发明新的测量公式,只是把这份记性翻译成深度,连为测距重新标注数据都不用。注意交出来的不是“米”,而是一张相对深度图,每个像素携带一个远近数值,远近关系是对的,绝对尺度并不承诺,术语叫仿射不变深度。这个赌注值不值得押,要按三样东西来盘:前提、口径、代价,其中前提有两层。

前提的第一层:测距为什么必须靠猜。闭上一只眼睛,你照样能说出桌上的水杯比墙上的画更近,人靠的是经验,光影、遮挡、比例这些线索藏在你看过的所有画面里。计算机做单目深度估计,也就是只凭一张照片逐像素猜出每个点离相机多远,撞上的是同一个难题,但它没有童年可依。数学上,一张照片是被压扁的三维世界,无穷多个真实场景可以投射出同一张图,距离信息在压缩的一瞬间就丢了大半。先验不是锦上添花,是唯一的出路,Marigold 的整个赌注都立在这个前提上。

前提的第二层:先验从哪来,这决定了赌注押在哪条路线。判别式路线(Depth Anything、Metric3D 这一族)用上千万甚至上亿张带标注的图硬学"什么样的画面里有什么样的远近",目前零样本最强,代价是细节常常被磨平。生成式路线押的是另一个注:大规模文生图模型在海量图片上训练时,已经把"世界长什么样"这本百科全书背进了权重,这些知识不需要重新标注,它们已经写进生成模型里。把这本书借来测距,正是 Marigold 的赌注,而且这本书还在越写越厚:底座每换一代,先验就更强,这是生成式路线独有的"免费升级"通道。

图注:单目深度估计的数据流:输入只有一张 RGB 照片,距离信息不完整,模型要为每个像素输出一个深度值。中间补位的正是先验。

第二样是口径:怎么才算赢。后面读到数字时都得记着,V2 交出的是一张相对深度图,术语叫仿射不变深度,它保证远近距离关系是对的,但不承诺"米"是准的。评测时先拿预测图和真值做一次鲁棒对齐(全局缩放加平移,方案来自 Pixel-Perfect Depth 提出的 RANSAC 对齐),再算误差。论文里所有好看的指标,都是这个口径下的数字,不是米制绝对误差,少了这一层,数字就没法比。

第三样是代价。两条路线的成本结构完全不同:

判别式路线生成式路线(Marigold)
先验来源千万级标注硬学文生图预训练背下的世界知识
训练数据上千万到数千万张7.4 万张合成图
细节保真常见平滑纤细结构保留好
推理成本一次前向V1 是 50 步乘 10 次采样,V2 压到一次前向

MDFM Survey 把这两条路线分别列为判别式与生成式范式;MMDE Survey 则把两种评测口径讲得很清楚。生成式路线要怎么把百科全书翻出来用,是接下来两章的事。

画图模型真的能干测量活:Marigold V1 的配方,以及它为什么慢

2024 年,ETH Zürich 的团队做了一个当时看起来有点离谱的决定:把深度图塞进为画画训练的 Stable Diffusion,让它去噪输出一张"深度图"。V2 的项目页后来用一句话总结这件事:把深度图塞进图像 VAE,按理说不该 work,但它就是 work 了。

为什么能 work?这要回到底座的设计。Stable Diffusion 的建筑师把生成拆成两段:先用自动编码器(VAE)把图像压成低维的 latent 表示,再在 latent 上做扩散。VAE 学的是感知压缩,保留的是人眼可感知的结构,而不是语义标签。所以一个单通道的深度图,只要落在它见过的低频结构分布里,照样能编码、能解码、能生成。这条"图像 VAE 能吞吐非图像信号"的合法性,是 V1 和 V2 共用的地基,latent 可以粗略理解为图像的底片,深度图的底片和照片的底片用的是同一台冲印机。LDM

V1 的配方现在看非常简单。冻结 VAE 和文本编码器,把输入图像和一张含噪深度图各自编成 latent,沿通道维拼在一起喂给 U-Net;U-Net 第一层卷积把输入通道翻倍,权重减半以保持数值规模,整个微调只动 U-Net。训练数据刻意精简:Hypersim 的 5.4 万张室内图加上 Virtual KITTI 的 2 万张室外图,凑成 7.4 万张合成 RGB-D 对,一张 RTX 4090 上大约 2.5 天跑完。Marigold V1

Marigold V1 训练协议

图注:V1 的训练协议:冻结的 VAE 把图像与深度图各自编成 latent,噪声加到深度 latent 上,再与图像 latent 沿通道拼接后喂给 U-Net。图中红色括号标出的 Train 部分,就是整个微调唯一触碰的模块。Marigold V1

结果很反直觉:训练集里没有一张真实照片,模型却在真实照片的零样本基准上拿到了五个里的四个第一。原因不难理解:它没有新学"世界长什么样",只是学会了把已有先验翻译成深度。生成模型本来就是从"图片长什么样"里训练出来的,这次只是换了一个输出介面,把画画的能量引到测量上。

但它慢得离谱。推理时每个深度 latent 都要从纯噪声出发跑 50 步 DDIM 去噪,为了稳定再采样 10 次做集合平均。一次测距等于 500 次网络前向,出图要等好久。V1 用事实证明"画图模型能干测量活",也把"慢"这个把柄留给了后人。谁要是能把 500 次压成 1 次,谁就拿到了通往实用的钥匙。

想从几百次去噪降到 1 次?先换主干,再换训练目标

V2 要解决的就是"把 500 次前向压成 1 次",这需要同时拧两颗螺丝:主干和训练目标。

第一颗螺丝是主干。V1 的去噪网络是 CNN 风格的 U-Net;2022 年底出现的扩散 Transformer(DiT)证明 Transformer 也能当去噪主干,而且可扩展性更好:latent 被切成小方块(patch),每个 patch 变成一个 token,丢进一排标准的 Transformer block,条件信息通过自适应层归一化(adaLN-Zero)注入。token 越多模型越强,这是一个可以连续调节的旋钮,不像 U-Net 那样结构固定。V2 换上的正是这个时代的产物:Qwen-Image-Edit-2509,一个图像编辑 DiT。DiT

第二颗螺丝是训练目标。V1 学的是经典去噪:从纯噪声一步一步清出图像。V2 换用 flow matching 一族的目标,关键差别在轨迹形状。看下面这张来自 Flow Matching 论文的 2D 玩具图:

扩散与 OT 轨迹

图注:左半边是扩散路径:粒子轨迹弯曲,接近目标时还会回绕(overshoot);右半边是最优传输(OT)路径:从噪声指向数据的轨迹接近直线。Flow Matching

弯与直的区别决定了"能不能一步到位"。弯路径上,中间状态离答案还很远,必须多步迭代慢慢收;直路径上,中间状态本身就是起点和答案的线性插值,走到一半时看它一眼,就知道答案大约在哪,一步就能逼近甚至直达。Flow Matching 论文里的采样实验也印证了这一点:同样的生成质量,最优传输路径需要的采样步数接近腰斩。这正是 V2 敢单步推理的合法性来源:训练时用 rectified-flow 公式,把时间 t 固定在 0.5,让模型从"一半噪声一半信息"的 latent 直接回归一次干净结果;推理时整条链路就变成一次 VAE 编码加一次 DiT 前向,不再迭代。Flow Matching

选 Qwen-Image-Edit 而不是纯文生图模型,也有讲究:图像编辑模型天生被训练成"看懂一张输入图,再输出一张对应的图",这个任务结构和"看图输出深度图"几乎同构,它自带的图像结构先验比纯文生图更对口。注意这里换的不是一个参数,而是一整套:底座、训练目标、推理协议三件事一起换,V2 就这么从 DDPM 时代跳进了 DiT 时代。时代是换了,但新问题马上就来。Marigold V2

换完时代,训练反而更难:V2 怎么驯服单步深度估计

换完时代,问题立刻冒出来。直接拿单步目标去训,细丝、毛发、透明物上会冒出一片 flying pixels。flying pixels 指的是本应连贯属于前景或背景的像素,在预测里互相粘连、乱飞的杂点,出现在最该干净利落的边缘上。

根子不在模型,在真值。训练用的 HyperSim 是路径追踪渲染的合成数据,渲染一根半透明发丝时,像素到底归前景还是归背景,是准蒙特卡洛随机决定的。所以这些薄结构上的 GT 深度本身就是噪声分布。模型要让 AbsRel 指标好看,就得去"完美复制这些随机归属",可下游应用真正想要的是前景连贯、边缘锐利。训练目标和用户想要的东西在这里错位了,而且错位恰好发生在毛发、树叶、玻璃这类最能看出模型水平的细节上。

论文用两阶段微调把质量追回来。先看它的方法总图:

Marigold V2 两阶段训练协议

图注:Stage 1 冻结 VAE,只训练 DiT 上的 QLoRA 适配器,并用 iREPA-depth 做表示对齐正则;Stage 2 解冻 VAE decoder,加入 SinkLoss 续训;底部箭头表示推理时只需一次 VAE 加 DiT 的前向。Marigold V2

Stage 1 的手术很小。基座权重量化到 4 位以省显存,只训练注入其中的 rank-128 QLoRA 适配器,也就是当前大模型微调的标准轻量姿势:大权重冻结不动,只学一小块补丁。损失由四块拼成:latent 上的 MSE、像素上的 L1、空间梯度上的 L1,以及 iREPA-depth。前三块都是老面孔,最后一块才是第一个补救。

iREPA-depth 治的是"细节糊"。它让 DiT 的中间特征去对齐一个参照物的特征,参照物不是 RGB 图,而是真值深度图本身提出来的 DINOv3 特征。DINOv3 是预训练的特征提取器,学到的东西偏语义:结构相近的物体特征相近。对深度图而不是 RGB 图提特征,是因为特征空间和几何重建天然更贴近;论文还专门比较过,用像素级的感知损失 LPIPS 做同样的事,在密集区域给不到同样的改善。直觉上,这不是要求"每个像素长得像标准答案",而是要求"模型对世界的理解与几何真值一致",后者给模型留下了表达空间,细节才活得下来。

Stage 2 加第二个补救 SinkLoss,治 flying pixels。思路是把预测和真值各切成不重叠的 5×5 小块,在块内做一次"软的一对一配对":把两块各自的 25 个数值两两算绝对距离,构成代价矩阵,再用带熵正则的最优传输解一个最小配对成本,Sinkhorn 是解这类问题的高效近似算法,这里迭代 5 次。

图注:SinkLoss 的处理流程:把预测与真值切成小块,块内两两计算绝对距离构造成本矩阵,再做软配对。不要求像素位置一一对应,只要求块内的数值集合能配得上。

"不要求位置对齐"是关键。逐像素损失像要求两排棋子按位置一一对齐,哪怕某一枚棋子的位置本来就是噪声随机摆的;SinkLoss 只要求这一堆棋子的数值集合和那一堆能配对,归错边的坏像素还会被一个很大的额外代价屏蔽掉,不让它带坏训练。GT 上随机归属的像素再也不能逼着模型复制噪声,模型反而能学出"前景整体连贯、边缘锐利"。超参是论文给出的单一配置:块大小 K=5、温度 τ=0.1、屏蔽代价 B=10⁶、5 次 Sinkhorn 迭代,论文没有对它们做扫参。

整条训练链路要花多少钱?Stage 1 跑 160K 步,约 5 天;Stage 2 续训 30K 步,约 1 天。单张 32GB 内存的 GPU 就能跑,训练数据还是那 7.4 万张。论文列出的三项主贡献是轻量微调协议、iREPA-depth 和 SinkLoss,其中两项都是补救。主干换代吃掉旧时代的老本,两个补救再把质量追回来。故事到这里闭环:换时代是免费的机票,但落地质量要自己挣。Marigold V2

数字说话:五个零样本基准全部第一,误差再降 16–26%

补救有没有用,看数字。论文在五个从没见过的真实基准上做零样本评测,全部第一:

基准V2 AbsRel ↓V2 δ1 ↑
NYUv23.698.0
KITTI5.497.4
ETH3D2.899.2
ScanNet3.797.9
DIODE5.297.1

AbsRel 是平均绝对误差占真实距离的比例,越小越好;δ1 是预测值与真值之比落在 0.8 到 1.25 之间的像素占比,越大越好。两个指标都是在把预测 RANSAC 对齐到真值之后算的,口径是相对深度,不是米制,这一点读表时得记着。

摘要里"16% 到 26% 的改进"对应表格两端:KITTI 上 AbsRel 从此前最佳的 6.5(FE2E)降到 5.4,降 16.9%;ETH3D 上从 3.8 降到 2.8,降 26.3%。同走"扩散做深度"路线的 GeoWizard 在这两个基准上是 9.7 和 6.4,也被明显甩开。GeoWizard

更值得注意的是一个事实:V2 用的还是和 V1 一样的 7.4 万张合成图。V1/V2 的比较表明,这份增益并未伴随微调数据的扩容而来,同一份数据也能出更强的结果。这跟判别式路线"疯狂堆数据换精度"的路径很不一样,这个信号比单个 SOTA 数字更有意思。不过话要说明白:论文现有的对比,是把新底座、新目标、两个补救当成整套方案一起换的结果,并不能把增益逐项归因给其中任何一项,哪颗螺丝贡献了多少,目前没有隔离实验能回答。

更直观的证据在定性对比里。注意这张对照图检验的只是两个补救里的一个组合:VAE decoder 解冻与 SinkLoss,并不涉及 iREPA-depth。三列分别是 Stage 1 检查点、解冻 VAE 但不加 SinkLoss、解冻 VAE 加 SinkLoss:

SinkLoss 消融对比

图注:同一批测试图(含纤细毛发、密集树叶、远景建筑),三列依次是 Stage 1 基线、解冻 VAE 不加 SinkLoss、解冻 VAE 加 SinkLoss。最后一列 flying pixels 明显更少,发丝等细节仍然保留。Marigold V2

中间那一列说明一个反直觉的点:光解冻 VAE decoder 反而会让 flying pixels 变多,加上 SinkLoss 才把它压下去,SinkLoss 在这一对组合里不可或缺。也要守住边界:这张图只支持 decoder 解冻与 SinkLoss 这对组合的结论,iREPA-depth 的贡献要由别处的实验来支撑,不能拿它当 iREPA-depth 的实证。这张图是"精细到每根发丝"说法最直观的支撑:V1 时代要 50 步乘 10 次采样才能稳住的质量,V2 一次前向就拿回来了,而且更好,连发丝级的结构都能保住。

不过得保持诚实。论文报告的是单步推理的性能,它没有给出单步对多步的完整精度与速度曲线,所以"单步全面优于多步"这句话论文并没有证明。单步只是在延迟表里表现亮眼:1024×1024 下比同方向的 Lotus-2、FE2E 更快、更省显存,2048×2048 仍能塞进单张 32GB GPU。快是真的快,但不是无条件的最快。Marigold V2

一个协议能走多远:从法向量到反照率,以及它没解决的事

同一套配方能走多远?V2 亲自演示了四连击。测深度之外,它把协议套到表面法向量(把像素 L1 换成角度损失,四个基准 SOTA)、albedo 反照率(HyperSim 上 PSNR 和 LPIPS 第一)、metric depth completion(在冻结的模型上挂一个很小的 rank-16 适配器加两个学到的标量,100 步优化就适配新任务)和 see-through depth(隔着玻璃看到背后的结构,AbsRel 从 13.7 降到 8.2)。每个任务都只用合成数据,训练成本都在几天量级。

"同一个协议通吃多个密集任务"这件事,Marigold 家族早有铺垫。TPAMI 2025 的期刊版把 Marigold 重新定义为"一族条件生成模型加一套微调协议",并把协议正式推广到深度、法向量和内在分解。下面这张来自 TPAMI 版本的 gallery,是协议外推的最好注脚:

Marigold 家族跨模态 gallery

图注:Marigold 家族在野外照片上的跨模态预测:同一张输入,依次给出深度、表面法向量、albedo 与 shading 的预测。微调数据里从未出现过人类、动物、食物、引擎和玩具,这些场景却全部泛化。Marigold TPAMI

训练集里从来没有人类和动物,模型却能量出人的轮廓、动物的身位。这件事的意义在于,先验是可迁移的:生成模型背下的世界知识不只服务于画画,换一层输出头就能服务于测量。V2 是这条生成式路线上最新的节点,而且它把这条路线最大的短板(慢)补掉了一大块,推理终于从"等一杯咖啡"变成了"眨一下眼"。Marigold TPAMI

把它放回坐标系里看:判别式路线靠上千万张标注,零样本很强,但细节平滑,对没见过的长尾场景容易露怯;生成式路线靠预训练先验加几万张合成图,细节强、泛化好,代价是结果绑在底座上。生成式路线的另一个隐性成本,是大底座本身离实时很远,V2 做完单步化,这个问题缓解了但没有消失。

局限要摊开说。第一,V2 仍然只输出仿射不变深度,不是米制绝对深度。做机器人抓取、AR 落地,还得再配一层尺度标定,评测时那次 RANSAC 对齐不是免费的。第二,质量直接绑定 Qwen-Image-Edit 这个底座,底座强则方法强,底座换代的时候这套方法的收益也会跟着漂移。第三,单步与多步的完整取舍曲线论文没有做,大底座的部署成本也谈不上实时。生成式测距逼近实用,但还没有到"装上就能用"的程度。Marigold V2

回到最开始那个问题:一张照片里没有距离,凭什么猜?Marigold 的回答是:不用猜,用记。画图模型在几十亿张图上背下的世界结构,如今只需要一次前向,就能变成一张精确到发丝的深度图。会画画的模型,终于也能当一把精确的尺子。

想深入可以读原文:Marigold V2: Revisiting Diffusion Transformers for Monocular Depth Estimation — arXiv:2609.08084

参考文献

Marigold V2:用画画的扩散模型测距离,精细到每根发丝