前言

从一张2D图像恢复出3D模型。这是计算机视觉领域长期存在的难题。不仅要重建图像中可见的部分(visible parts),还要“想象(hallucinate)”出不可见的部分(如背面、被遮挡区域)。由于单图信息不足,这个问题是ill-posed(病态问题),即:存在多种合理的3D解释(比如一个杯子背面可能有把手,也可能没有),没有唯一解,难以判断哪个是对的。

人类可以凭借对3D世界的先验知识(如“椅子应该有四条腿”),轻松推断出看不到的部分。为了让AI也具备这种能力,过去的方法通常是:在3D数据集(如ShapeNet)上训练类别专用的3D生成网络(如“椅子专用网络”、“汽车专用网络”)。但这类方法的两大缺陷

  1. 泛化能力差:训练时没见过的新类别(如“外星飞船”)就无法重建。
  2. 数据规模瓶颈:公开的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上效果不错,但有四大通病:

  1. 耗时长:每物体需优化数万次迭代,几十分钟到数小时。
  2. 显存占用高:高分辨率图像的体渲染需要大量显存。
  3. 3D不一致:每次迭代只优化一个视角,导致**“双面人脸”**(Janus问题)。
  4. 几何质量差:用密度场(NeRF)表示,网格提取困难(表面坑洼、噪声多)。

本文跳出优化类方法的框架,提出一种全新的前馈式(feed-forward)方法。核心创新:把2D扩散模型(Zero123)基于代价体(cost-volume)的3D重建技术(SparseNeuS)结合。无需逐物体优化,一次前向传播即可生成360度带纹理的3D网格。但是用Zero123从单图生成多视图,再用多视图3D重建技术得到3D网格,这其中会有两个挑战:

  1. 多视图不一致:Zero123生成的视图不完美一致,传统NeRF优化会失败。
  2. 相机位姿未知:需要输入图像的绝对相机位姿(如仰角θ),正常一张图是不带相机信息的,只有特殊的数据集才会有标注,但单图无法直接获取。

关于这两个问题,本文提出关键训练策略(如混合训练、两阶段视图选择),使模型能处理不一致的多视图。设计仰角估计模块,自动估计输入图像的仰角θ,从而计算所有视图的相机位姿。总结来说,贡献如下:

  • 整合三大模块:多视图合成(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)

F3.png

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

F4.png

实验结论:

指标 含义 实验发现
PSNR 像素级相似度 不高,尤其当视角差距大或视角特殊(底部、顶部)时。
Mask IoU 轮廓重叠度 大于 0.95,说明 轮廓很准
CLIP Similarity 语义/感知相似度 较高,说明 人眼看差不多

视图之间哪怕一点点不一致,对优化类方法都是致命的。

不完美多视图条件下的神经表面重建

作者采用 SparseNeuS(一种“跨场景通用”的 SDF 重建网络)。彻底放弃逐场景优化(如 NeRF/NeuS 那样迭代 10k+ 步)。SparseNeuS 是 MVSNeRF 的改进版:多视图立体 + 神经隐式场 + 体渲染。 给定 m 张带相机位姿的输入图一次前向就输出 带纹理的 3D 网格。不过说实话,我是不太懂这个网络。

F2.png

通过论文给的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° 重建,以及混合训练:训练中同时使用 真实 GTZero123 预测图,让网络学会处理不一致。简单来说就是基于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°),重建网格就会扭曲变形,比如下图的示例:

F10.png

为此文章提出了仰角估计模块:

步骤 内容 关键细节
① 生成邻近视图 用 Zero123 对输入图生成 4 张 10° 邻近视图 仅依赖单图,不需要 GT
② 枚举候选仰角 两阶段搜索:
- 粗粒度:每 10° 一步
- 细粒度:在最佳 ±10° 内每 1° 一步
兼顾速度与精度
③ 计算重投影误差 对每个候选 θ:
- 计算 4 张图的相机位姿
- 用 Structure-from-Motion 式误差 度量一致性
类似于 bundle adjustment
④ 选取最佳 θ 误差最小的 θ 作为输入图的仰角 < 1 秒完成

总结

这篇感觉创新不算太多,偏工程,都是用了各种方法,发现其中不同的方法有各种问题,然后加了一点trick修复之后再整合一下。而且还和Zero123耦合的比较深。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐