狗都能看懂的One-2-3-45原理详解
从一张2D图像恢复出3D模型。这是计算机视觉领域长期存在的难题。不仅要重建图像中可见的部分(visible parts),还要“想象(hallucinate)”出不可见的部分(如背面、被遮挡区域)。由于单图信息不足,这个问题是ill-posed(病态问题),即:存在多种合理的3D解释(比如一个杯子背面可能有把手,也可能没有),没有唯一解,难以判断哪个是对的。人类可以凭借对3D世界的先验知识(如“椅
前言
从一张2D图像恢复出3D模型。这是计算机视觉领域长期存在的难题。不仅要重建图像中可见的部分(visible parts),还要“想象(hallucinate)”出不可见的部分(如背面、被遮挡区域)。由于单图信息不足,这个问题是ill-posed(病态问题),即:存在多种合理的3D解释(比如一个杯子背面可能有把手,也可能没有),没有唯一解,难以判断哪个是对的。
人类可以凭借对3D世界的先验知识(如“椅子应该有四条腿”),轻松推断出看不到的部分。为了让AI也具备这种能力,过去的方法通常是:在3D数据集(如ShapeNet)上训练类别专用的3D生成网络(如“椅子专用网络”、“汽车专用网络”)。但这类方法的两大缺陷:
- 泛化能力差:训练时没见过的新类别(如“外星飞船”)就无法重建。
- 数据规模瓶颈:公开的3D数据集(如ShapeNet)只有几十万模型,远小于2D图像数据(数十亿张)。
最近的研究(如DreamField、DreamFusion、Magic3D)开始用2D扩散模型或CLIP来辅助3D生成。这些方法的核心是逐物体优化(per-shape optimization),用可微渲染(differentiable rendering)把3D模型渲染成2D图像,再用CLIP或2D扩散模型计算“像不像”的损失,反向优化3D模型。这些优化方法通常用神经场(NeRF、SDF)作为3D表示。虽然优化类方法(如DreamFusion)在文本到3D和图像到3D上效果不错,但有四大通病:
- 耗时长:每物体需优化数万次迭代,几十分钟到数小时。
- 显存占用高:高分辨率图像的体渲染需要大量显存。
- 3D不一致:每次迭代只优化一个视角,导致**“双面人脸”**(Janus问题)。
- 几何质量差:用密度场(NeRF)表示,网格提取困难(表面坑洼、噪声多)。
本文跳出优化类方法的框架,提出一种全新的前馈式(feed-forward)方法。核心创新:把2D扩散模型(Zero123)和基于代价体(cost-volume)的3D重建技术(SparseNeuS)结合。无需逐物体优化,一次前向传播即可生成360度带纹理的3D网格。但是用Zero123从单图生成多视图,再用多视图3D重建技术得到3D网格,这其中会有两个挑战:
- 多视图不一致:Zero123生成的视图不完美一致,传统NeRF优化会失败。
- 相机位姿未知:需要输入图像的绝对相机位姿(如仰角θ),正常一张图是不带相机信息的,只有特殊的数据集才会有标注,但单图无法直接获取。
关于这两个问题,本文提出关键训练策略(如混合训练、两阶段视图选择),使模型能处理不一致的多视图。设计仰角估计模块,自动估计输入图像的仰角θ,从而计算所有视图的相机位姿。总结来说,贡献如下:
- 整合三大模块:多视图合成(Zero123)+ 仰角估计 + 3D重建(SparseNeuS)。
- 无需优化,45秒完成重建(比优化类方法快几十倍)。
- 用SDF表示,几何质量更好;多视图预测视角条件化,3D一致性更强。
- 与现有方法相比,更忠实于输入图像(如纹理、形状细节)。
相关研究
主要有三种方向:
- 用2D先验模型指导3D生成
- 单图到3D(Single Image to 3D)
- 通用神经重建(Generalizable Neural Reconstruction)
其实也和前言中总结的差不多了,2D扩散模型(如Stable Diffusion)和CLIP用于3D优化,但逐物体优化耗时、不一致。早期用3D数据集训练类别专用模型;单图到3D近期用文本反演、Zero123、Point-E、Shap-E等方法。通用神经重建从逐场景优化(NeRF)到通用前馈模型(SparseNeuS),用2D特征+3D代价体直接重建。
方法
Zero123:视角条件化的2D扩散模型
Zero123是一种通过向SD模型注入额外相机参数来使得模型有控制相机视角的能力。因为本身SD模型就有根据提示词或是其他引导条件生成对应物体的能力,所以Zero123是希望在不破坏原有模型生成能力的前提下,注入控制生成图像角度的能力,从而模拟不同相机视角拍照的能力。再用这个模型去生成数据,训练NeRF的三维模型。其实Zero123这个思想其实和ControlNet的思路差不多。
作者想把这个模型应用在传统NeRF/SDF的训练上,结果发现效果很差。他做了一个实验,用 Zero123 生成 32 张视角(球面上均匀采样)。把这 32 张图分别喂给基于nerf的方法(TensoRF)和基于SDF的方法(NeuS),**结果是两种经典方法都失败了!**重建结果出现大量 扭曲(distortions) 和 漂浮伪影(floaters)。

通过作者的实验发现,根本原因是 Zero123 生成的多视图并不完全一致。

实验结论:
| 指标 | 含义 | 实验发现 |
|---|---|---|
| PSNR | 像素级相似度 | 不高,尤其当视角差距大或视角特殊(底部、顶部)时。 |
| Mask IoU | 轮廓重叠度 | 大于 0.95,说明 轮廓很准。 |
| CLIP Similarity | 语义/感知相似度 | 较高,说明 人眼看差不多。 |
视图之间哪怕一点点不一致,对优化类方法都是致命的。
不完美多视图条件下的神经表面重建
作者采用 SparseNeuS(一种“跨场景通用”的 SDF 重建网络)。彻底放弃逐场景优化(如 NeRF/NeuS 那样迭代 10k+ 步)。SparseNeuS 是 MVSNeRF 的改进版:多视图立体 + 神经隐式场 + 体渲染。 给定 m 张带相机位姿的输入图,一次前向就输出 带纹理的 3D 网格。不过说实话,我是不太懂这个网络。

通过论文给的Figure2的图,以及文章的解释,大概列了一下它的流程:
| 步骤 | 作用 | 关键细节 |
|---|---|---|
| ① 提取 2D 特征 | 对 m 张输入图各抽一张特征图 | 2D CNN backbone |
| ② 构建 3D 代价体 | 把 2D 特征反投到 3D 网格,计算方差 | 方差衡量跨视角一致性 |
| ③ 稀疏 3D CNN | 把代价体压缩成 geometry volume | 轻量、保留稀疏结构 |
| ④ SDF MLP | 任意 3D 点 → SDF 值 | 坐标 + 插值后的几何特征 |
| ⑤ Color MLP | 同一点 → RGB | 2D 特征 + 几何特征 + 视角方向 |
| ⑥ SDF 体渲染 | 渲染 RGB/深度 | 与 NeuS 类似,可微 |
作者还提出一个两阶段源视图选择策略,解决 360° 重建,以及混合训练:训练中同时使用 真实 GT 和 Zero123 预测图,让网络学会处理不一致。简单来说就是基于Zero123的路径上,修复Zero123的缺陷,有点帮Zero123擦屁股的意思。这两个方法混合,就解决了原版 SparseNeuS 只能重建前视区域,这个方法能扩展到 完整 360°。具体流程:
| 阶段 | 数据 | 说明 |
|---|---|---|
| 1. GT 渲染 | 每个物体 → n 张 GT 图 + 深度 | 球面上均匀分布的相机位姿 |
| 2. Zero123 预测 | 对每张 GT 图 → 预测 4 张邻近视图(±10°) | 这样共 4×n 张预测图 |
| 3. 输入到网络 | 把 4×n 张预测图 + 相机位姿 送进网络 | 网络看到 不完美但视角密集 的图 |
| 4. 监督目标 | 随机选 一张 GT 图 作为 渲染目标 | 用该视角的 GT RGB/Depth 做损失 |
总结来说,就是用了新的SparseNeuS网络,一次前向传播就输出带纹理的3D网络,并且用GT和Zero123预测图强行解决Zero123预测偏差,最后加上这个两阶段源视图选择策略,扩展到了360°的视角。
相机位姿估计
如何自动估计输入图像在 Zero123 球面坐标系中的仰角(elevation)θ,否则所有相机位姿都会错,导致几何严重扭曲。 Zero123 使用球坐标:θ = 仰角,φ = 方位角,r = 半径(通常固定 1.2)。我们可以同时旋转(φ)或缩放(r)整个物体,不影响形状本身。但仰角 θ 必须准确,否则球坐标到笛卡尔坐标的映射会整体错位。球坐标系里,同样的相对差值 Δθ, Δφ,因 θ₀ 不同,对应到 3D 空间的真实位移也不同。如果整体错一个仰角(如 ±30°),重建网格就会扭曲变形,比如下图的示例:

为此文章提出了仰角估计模块:
| 步骤 | 内容 | 关键细节 |
|---|---|---|
| ① 生成邻近视图 | 用 Zero123 对输入图生成 4 张 10° 邻近视图 | 仅依赖单图,不需要 GT |
| ② 枚举候选仰角 | 两阶段搜索: - 粗粒度:每 10° 一步 - 细粒度:在最佳 ±10° 内每 1° 一步 |
兼顾速度与精度 |
| ③ 计算重投影误差 | 对每个候选 θ: - 计算 4 张图的相机位姿 - 用 Structure-from-Motion 式误差 度量一致性 |
类似于 bundle adjustment |
| ④ 选取最佳 θ | 误差最小的 θ 作为输入图的仰角 | < 1 秒完成 |
总结
这篇感觉创新不算太多,偏工程,都是用了各种方法,发现其中不同的方法有各种问题,然后加了一点trick修复之后再整合一下。而且还和Zero123耦合的比较深。
更多推荐


所有评论(0)