从三张甚至一张普通照片恢复出带有纹理的三维模型,这个目标在过去会被视为摄影测量的极端情况。传统流程首先用SfM估计相机位姿,再做多视图立体匹配生成深度图,最后融合点云并网格化。它的隐含前提是图像之间有足够多的重叠区域和视差变化,否则特征匹配数量不足,三角化误差迅速放大,重建结果会出现大面积空洞或几何断裂。深度学习带来的变化是:网络不再只依赖跨视图几何约束,而是从海量三维数据中学习形状、纹理与视角关系的先验,用来补充那些没有被任何相机看到的表面。
稀疏视图重建(sparse view reconstruction)正是沿着这个思路发展出来的方向。它通常指输入图像数量不超过10张、甚至只有1至4张的场景重建任务。和稠密视频或多视角采集不同,稀疏输入的每一张照片都承担了极大信息量,模型必须同时解决相机位姿估计、深度预测、不可见区域补全和外观一致性几个问题。少量照片先经过特征提取与匹配,再送入前馈网络或迭代优化模块,最后输出点云、深度图或辐射场表示。实际系统中这些步骤往往被耦合在同一个网络里。

一、为什么稀疏视图重建比传统方法更难
传统多视图几何的稳定工作区间通常需要几十张图像。以增量式SfM为例,它依赖SIFT、SuperPoint等特征点在多张图像之间的重复观测。若某个区域只出现在一两张图中,该区域的三维点协方差很大,容易形成漂浮噪声。MVS环节更严重,深度图估计依赖多视图光度一致性,当只有两个视角时,纹理缺失或重复纹理区域会给出多个峰值,最终深度图充满离群值。
深度学习可以把这些不适定问题转化为条件生成问题。例如输入一张正面照片,网络可以生成对应背面的大致纹理和几何,因为它在训练时见过大量椅子的背面长什么样。这种先验并不是精确重建,而是统计上合理的补全。对于工业测量等场景,这类补全可能不够可靠;但对于游戏资产草图、VR预览和电商展示,它已经能把人工建模时间从数小时降到分钟级。
另一个困难是位姿估计。传统方法用对极几何从匹配点计算本质矩阵,要求匹配点数量足够且分布均匀。稀疏视图下匹配点可能全部集中在物体边缘,位姿解算对噪声非常敏感。近年来的端到端方法,如DUSt3R,不显式求解特征匹配,而是用Transformer直接回归逐像素的三维点图,并从点图之间的对齐中恢复相机参数。这种方式减少了对特征数量和视差角度的依赖。
二、主流技术路线:从NeRF到前馈高斯泼溅
神经辐射场(NeRF)把场景表示为一个连续函数,输入空间坐标和视线方向,输出颜色和体密度。它需要大量已知位姿的图像来做逐像素光度监督,因此原生NeRF不适合稀疏输入。改进方向有几类:一是把图像特征作为条件输入,如PixelNeRF在每条光线上融合多视图CNN特征,即使只给一张图也能推理不可见方向;二是使用外部深度估计或扩散模型先验,如ReconFusion在NeRF训练中引入扩散模型生成的伪视图,强制新视角保持合理外观;三是直接在潜在空间做重建,让网络学习场景先验而非单场景优化。
基于扩散模型的视角合成方法发展很快。Zero123把单张图像作为条件,通过在大规模三维数据上微调扩散模型,能够生成任意相机外参下的新视图。SyncDreamer进一步在生成过程中同时考虑多视角一致性,输出一组围绕物体的固定视角图像。得到这些伪视图后,可以再送入传统的NeRF或3D Gaussian Splatting管线进行稠密重建。这种方式不要求原始照片有足够重叠,因为它把“少视角”问题转化成了“多视角生成”问题。
3D高斯泼溅(3D Gaussian Splatting)是目前的工程热门。它用一组带位置、协方差、颜色和不透明度的三维高斯函数表示场景,通过可微光栅化快速渲染。与NeRF相比,训练和渲染速度更快,几何边界也更清晰。前馈高斯方法如pixelSplat和MVSplat直接从输入图像回归每个像素对应的高斯参数,无需对每个场景做长时间优化。MVSplat使用多视图深度估计和代价体构建,在两张输入图像上就能得到较好的新视角合成结果,并且推理时间通常在1秒以内,适合交互式应用。
三、实践:用DUSt3R跑通两张图的稀疏重建
DUSt3R的全称是Dense Unconstrained Stereo 3D Reconstruction,它把任意两张图像输入后直接输出两张稠密点图以及它们之间的对应关系。点图可以理解为每个像素在相机坐标系或世界坐标系中的三维坐标。通过对多组点图做全局对齐,就能恢复相机的内参和外参,并融合出场景点云。这个流程不依赖传统SfM的特征提取和匹配,代码也相对简洁。
下面的示例演示了如何加载预训练模型、读取两张视图、执行推理并保存点云。运行前需要安装官方仓库并下载权重,实际实现以对应版本API为准。假设当前目录有两张名为view1.jpg和view2.jpg的照片,它们之间有约30度到60度的视角差,且场景主体保持静止。
import torch
from dust3r.inference import inference
from dust3r.model import AsymmetricCroCo3DStereo
from dust3r.utils.image import load_images
from dust3r.image_pairs import make_pairs
from dust3r.cloud_opt import global_aligner, GlobalAlignerMode
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = AsymmetricCroCo3DStereo.from_pretrained(
'naver/DUSt3R_ViTLarge_BaseDecoder_512_dpt'
).to(device)
images = load_images(['view1.jpg', 'view2.jpg'], size=512)
pairs = make_pairs(images, scene_graph='complete', prefilter=None, symmetrize=True)
output = inference(pairs, model, device, batch_size=1)
scene = global_aligner(output, device=device, mode=GlobalAlignerMode.PointCloudOptimizer)
scene.compute_global_alignment()
scene.clean_pointcloud()
scene.save('sparse_recon.ply')
print('point cloud saved')
输出文件sparse_recon.ply可以直接用MeshLab或CloudCompare打开。点云密度取决于输入分辨率和模型输出步长。如果两张照片主体占比太小,可以先做目标检测并裁剪,或者使用更高分辨率推理。DUSt3R还能输出置信度图,过滤低置信度点后,点云噪声会明显下降。对于需要网格化的任务,可以用泊松重建或screened Poisson从点云生成网格,再进行纹理映射。
除了DUSt3R这类通用几何估计器,如果目标类别固定,比如人脸或汽车,可以采用类别专用先验模型。这些模型在训练时见过大量同类物体的三维形状,即使输入只有一张正脸照片,也能输出完整的后脑勺和侧脸形状。通用模型和专用模型的选择取决于任务对泛化性和精度的要求。
四、效果边界与调优建议
稀疏视图重建的评估需要同时看新视角合成质量和几何精度。新视角合成通常使用PSNR、SSIM和LPIPS,几何评估则常用Chamfer Distance或F-score。一个常见误区是只看渲染图是否清晰。扩散模型生成的伪视图可能纹理逼真,但几何上存在整体比例偏移或局部凸起,这些缺陷在单张渲染图中不容易察觉,旋转到侧面时才会暴露出来。因此评测时必须固定测试视角,并在多个物体上报告指标。
输入照片对结果的影响往往大于网络架构本身。拍摄时应尽量覆盖物体的主要可视面,避免只围绕一个轴旋转一圈却缺少顶部或底部信息。对于透明、高反光或弱纹理物体,无论是传统MVS还是学习模型都会遇到困难,此时可以借助偏振片、喷粉或结构光辅助。照片之间最好保持一致的曝光和白平衡,过大的亮度变化会被网络误认为几何差异。
工程部署方面,3D Gaussian Splatting的显存占用与高斯数量线性相关,一张512分辨率输入可能产生数十万个高斯。移动端可以使用压缩后的高斯表示,或直接输出网格并烘焙纹理。若需要实时交互,建议先离线重建并转换为标准glTF资产,再在浏览器或引擎中加载。对于视频序列中的稀疏帧采样,还可以加入时序约束,让重建结果在时间上保持稳定。
五、总结
从极少量照片重建3D场景已经从实验性研究走向可用的工程工具。NeRF提供了连续场景表示,扩散模型补全了不可见区域,前馈高斯泼溅把推理速度推进到秒级,而DUSt3R这类端到端几何模型则简化了位姿估计和点云生成。不同路线各有侧重:生成式方法适合创意预览,几何回归方法适合快速测量,优化式NeRF适合高质量离线渲染。
技术选型时不必追求单一模型包办所有需求。可以先使用DUSt3R或深度估计模型得到初始几何,再用扩散模型生成缺失视角,最后交给3D Gaussian Splatting做精细化。随着模型权重和推理框架的轻量化,稀疏视图重建会越来越多地嵌入手机、MR眼镜和电商内容生产流程中。对于开发者而言,理解每种方法对视角、尺度、光照和类别的假设,比单纯替换最新模型更能保证落地效果。