从三张照片到上千帧:通用 3DGS 的三次假设放宽

手握一台手机,你想把眼前的世界变成一份能被反复查看的三维数据。拍下第一张照片时问题很简单,但当你意识到"这一条街要完整重建"和"随手拍几张就能出图"是两件完全不同的事,问题的重心就变了:一组照片究竟要满足什么条件,才能变成可复用的三维世界?

这篇专题沿着通用 3D Gaussian Splatting(3DGS)近年最清晰的一条主线推进。我们会从原始 3DGS 的逐场景优化瓶颈出发,一步步放宽三个输入假设:从已标定稀疏视角,到无标定稀疏视角,再到上千帧长轨迹。每一步放宽都会暴露一个新的失败模式,也对应一条新的评价轴。把这三次放宽串起来,你就拿到了一把评价任何通用三维重建工作的坐标。

渲染一秒钟、重建几十分钟:3DGS 的通用化卡在哪儿?

先看 3DGS 到底解决了什么。2023 年推出的原始 3D Gaussian Splatting 把场景表示成一组可微的 3D 高斯。优化过程先稀疏的 SfM(Structure from Motion,运动恢复结构)点云初始化这些高斯,再用一个自适应密度控制循环不断克隆、分裂和剪除它们。训练一完成,渲染端通过一个 tile 级可微光栅化器,能在 1080p 分辨率下以每秒 100 帧以上的速度实时导航整个场景。3DGS

看下面这条流程横幅,一眼就能抓住问题所在:

图注:原始 3DGS 的整体流程。左端输入是 SfM 稀疏点云,经过一整圈"可微光栅化 → 与真实图像算损失 → 自适应密度控制"的优化循环,最右端才通向"实时渲染(≥100 fps)"。注意快的那部分只在最右侧,左侧的重建仍要针对每个场景单独跑一遍。3DGS

这里藏着最容易误读的一点:实时属于渲染,不属于重建。每秒 100 帧说的是已经优化好的场景能多快被画出来,而为了得到这个场景,你每换一个新地方都要重跑一次 SfM 加上几十分钟的逐场景优化。整个过程还不跨场景:这套场景的高斯堆成一团,换一个场景就得清零重来。

于是整篇专题要问的问题浮出水面:能不能训练一次、对从未见过的场景一次前馈重建,而不是每个场景都从头优化?这个"从逐场景优化转向前馈高斯预测"的趋势,在 Chen 与 Wang 的 3DGS 系统性综述里已经被列为领域主线,并将 MVSGaussian、pixelSplat 等归入可泛化分支。Survey3DGS

把"一组照片"的难度摊开,其实有三个层级,正好对应接下来三章的路线。同一台手机,可以只拍三张已标定的照片,拍一段无标定的视频,也可以让无人机飞过上千帧轨迹。三个层级分别要求我们放宽三个假设:标定、位姿、以及帧数。我们逐层攻克。

这三个层级不是拍脑袋分的。它们对应三种真实的输入方式:展台上的三张定妆照、随手绕着桌子走一圈的视频、无人机在街区上空盘旋采集的航线。输入差别这么大,失败的形态也完全不同——三张照片的问题在于视角太少,上千帧的问题却在视角太多。所以每一步放宽,都要单独面对它自己的失败模式。

三张已标定照片,能不能一次前馈生成新场景?

第一步放宽从最温和的地方开始:假设相机已经标定好,手里只有三张照片。传统 MVSGaussian 之前的方法都依赖逐场景优化,而 MVSGaussian 的目标是让网络在一次前馈里直接吐出高斯,不做逐场景优化。它怎么回答"网络凭什么知道每个高斯放在哪"?

答案是复用几何。MVSGaussian 的核心组件有三块,整个设计沿着一条前馈链路展开:

图注:MVSGaussian 的三模块接力。上部"多视角立体深度估计"先用代价体算出每个像素的深度,中部"像素对齐高斯表示"把每个像素反投影成一个 3D 高斯并解码其余参数,底部"高效混合高斯渲染"把 splatting 与体渲染两路输出平均成最终图像。三块横向排布,就是"一次前馈重建"由哪几段组成。MVSGaussian

关键在于"像素对齐"这个表示。把无序的点云想象成一本没有索引的账本,网络没法直接处理;MVSGaussian 把它改写成"每个像素登记一条记录"的数组式结构。位置由像素坐标和估计深度反投影决定,尺度、旋转、不透明度、颜色则由一个小网络逐像素解码。像遍历数组一样逐像素预测,无序三维就变成了可学习的对象。

几何复用是另一个抉择。既然输入已经是多视角图像,MVSGaussian 就用 MVS 的代价体去估计深度分布,让网络复用多视角之间现成的几何对应,而不是从零学三维。渲染端还做了一个小心思:把显式的 splatting 与沿深度的体渲染两路输出平均。它们一个 many-to-many、一个 one-to-one,误差结构互补,混合以后比单用任何一路都稳。在 DTU 三视图上,MVSGaussian 拿到 28.21 PSNR、0.963 SSIM,推理 21.5 FPS,质量和效率同时成立。MVSGaussian

像素对齐高斯这个思路并不是 MVSGaussian 首创。更早的 pixelSplat 已经把每个像素对应一个高斯、再用深度概率分布采样来稳定中心预测的做法带进了前馈 3DGS(CVPR 2024 Best Paper Runner-Up)。pixelSplat MVSGaussian 的贡献在于用显式 MVS 代价体替代对极线采样,并补上混合渲染。另一路 DepthSplat 则走"MVS 加单目 ViT 双分支",说明深度线索也能从单目补上来。DepthSplat 想深挖三模块的内部链路与消融证据,可以读《案例一:三张已标定照片,MVSGaussian 怎样一次前馈生成新场景》。

走到这里,已标定的稀疏三视图一次前馈重建已经是现实。但注意脚下还剩两块没解决的地基:深度估计的质量是一块,而相机位姿仍是 SfM 预计算的。位姿从哪来?这正是下一步要从口号变成可选工程的起点。

去掉相机标定后,为什么强几何主干还不够?

上一章的回答是"每个像素一个高斯,位置由深度反投影决定",但这条答案默认相机位姿已经由 SfM 提前算好。这道标定步骤耗时,而且离真正无标定的手机输入还有距离。于是问题变成:能不能连内参外参一起从图像里一次前馈出来?

VGGT(Visual Geometry Grounded Transformer, CVPR 2025 Best Paper)给了第一个答案。它用约 1.2B 参数的 transformer,把图像 patchify 成 token 后,交替做逐帧与全局自注意力,在一次前馈里同时输出相机内参外参、深度图、点图和点轨迹。VGGT 看它的整体架构:

图注:VGGT 架构总览。左侧 N 张输入图经 DINO patchify 成 token 并拼接镜头 token,中间是 24 层逐帧与全局自注意力交替堆叠,顶部镜头头输出内参外参,底部 DPT 头同时输出深度图、点图与点轨迹特征图。VGGT

单凭前馈 0.2 秒,VGGT 就能超过需要全局对齐或捆绑调整(Bundle Adjustment)的传统方法,去 SfM 这一步从口号变成了可选工程。

但关键的反转在这里:强几何主干不够。VGGT 用一个 transformer 同时承担相机、深度、点图、点轨迹多类输出,特征流必然存在目标冲突,高频外观信息容易被平均掉。StructSplat 的回应是把这个信息流拆成三条各司其职的路,而不是加更多主干:

图注:StructSplat 的整体数据流。几何、语义、纹理三路编码器各取所需(几何给位置、语义维护全局一致、纹理保高频细节),喂给并行的两个解码通路。高斯解码器输出每个像素一格的高斯,相机解码器估计两套相机;随后把目标相机对齐到源坐标系,再转成全局高斯渲染。StructSplat

这就像把一只什么都能干但样样不精的全能模块,拆成职责单一的组件,让每个组件在自己最擅长的表示空间里干活。几何路决定高斯的稳定结构,语义路缓解局部歧义、维护跨视角一致,纹理路用一个轻量卷积专门保住边缘和书脊这类高频细节。这套三路解耦不是简单堆 backbone,而是分配角色。在 StructSplat 论文报告的 DL3DV 评测切分下,单加语义把 PSNR 从 20.610 抬到 26.236,再加纹理冲到 28.045,而同期 AnySplat 是 22.377。StructSplat

单纯拆三路还不够,还有一层更隐蔽的失败模式,叫目标视角泄漏。请看下面这张上下双支路对比:

图注:有无相机对齐的渲染对比。上支路让目标视角图像和源视角一起进入跨注意力,结果高斯里混进了目标信息(哭脸);下支路只用纯源视角提取特征、再显式把目标相机对齐到源坐标系,得到干净高斯(笑脸)。两条支路最后都与目标真实图像计算损失。StructSplat

泄漏的直觉是这样:训练时手里同时有源视角和目标视角,网络很容易走捷径,从目标图像里"偷看"答案;但推理时目标视角不存在,任何依赖目标视角的对齐都会变成部署时用不上的信息捷径。所以 StructSplat 显式把目标相机对齐到源坐标系,让目标视角只用来做渲染监督、不进高斯的特征流。这个显式对齐给它换来了约 0.707 PSNR,从 27.338 提到 28.045。StructSplat

作为对照,同期 NoPoSplat 走了另一条路线:它不显式估计相机,而是把所有视角的高斯预测进一个以首视图坐标系为基准的 canonical space,让网络隐式吸收位姿信息。NoPoSplat 这条隐式锚定路线说明"无 pose 前馈"并非只有显式对齐一个答案,但代价是牺牲显式相机的可解释性。想细看三路特征分工与相机对齐的完整推导,可以读《案例二:一段无标定手机视频,StructSplat 怎样同时找相机、几何与纹理》。

去掉了相机标定,相机条件成了一根新的评价轴。可这一切还只验证在几十张照片的有界场景里。上千帧呢?

上千帧视频,为什么更多照片反而更难重建?

直觉会骗我们。按常理想,照片越多,看到的表面越多,重复观测降低不确定性,重建应该更容易才是。可当帧数从几十跳到上千,任务本身被改变,而不是被放大。

为什么?因为有四条新约束同时压上来。一条街来回走两遍,相距很远的帧几乎没有任何重叠,视角对不上;位姿误差沿轨迹一点点累积,越走越偏;相机隔很久才回访同一个区域,闭合成环时对不上;内存和算力随序列长度线性增长,堆不下。每一条都让"更多图像"不再自动等于"更容易重建"。

而这里最容易踩的坑是:平均 PSNR 会把长程崩坏全部掩盖。一个全局平均分可能看不出远端视角已经塌成一团。DepthSplat 在长序列上的表现就是反例:把输入视图从 50 张加到 120 张,PSNR 不升反降。看这条对比:

图注:输入视图从 50 张加到 120 张,两个方法各自的 PSNR 变化。DepthSplat 从 21.39 一路掉到 17.77,而 LongSplat 只从 23.54 缓降到 21.34(数据取自 LongSplat 论文的 DL3DV 评测表)。同一张图若只看平均值,这条下坠会被藏进一个看起来还行的总分里。

同一批数据,由一个全局平均 PSNR 概括时看不出任何问题,拆开看才发现长序列早已经不起。这条"更多图像不等于更容易重建"的观测,正是综述里反复点名的未解决问题之一:内存与计算瓶颈、大规模场景仍未解。Survey3DGS

帧数这个量级有了自己的失败轴,那谁接得住这个量级?答案分两条路线。

两条接住千帧量级的路线:流式增量,还是一次性前馈?

上千帧的新任务有两条解法线,对应两种不同的资源约束。第一条叫流式增量,代表是 LongSplat。它的思路不是把几千帧全塞进显存再一起处理,而是每来一帧只做最小更新。

LongSplat 的核心是一套叫 Gaussian-Image Representation(GIR)的表示:把已经累积的全局高斯渲染成一张带 ID 的 2D 图像张量,每个像素登记一个高斯和它的全局唯一 ID。这就像给三维场景里的每个对象编了 ID、序列化成一帧快照,之后做 diff 就只要比对变更块。每来一帧,它提取两路互补特征,一路是当前帧与相邻帧的多视角特征 F_c,另一路是历史全局高斯渲染出的 GIR 历史特征 F_h。两路经 transformer 融合后,用一个 confidence mask 只更新有把握的高斯,把冗余剪掉。在 DL3DV 的 120 视图设置下,LongSplat 拿到 21.34 PSNR 并压缩约 44% 的高斯,而同样的设置里 DepthSplat 已经掉到 17.77。LongSplat 看它的整体框架:

图注:LongSplat 流式更新框架。左侧输入图像序列与历史全局高斯各走一路。当前帧经 DepthSplat 提局部特征,历史全局高斯经可微投影渲染成 GIR、再过浅层 CNN 提历史特征。两路在中路的 transformer 融合,得到更新掩码与当前帧高斯,再增量写回全局表示。增量,而不是重做。LongSplat

第二条路线是一次性前馈,代表是 Long-LRM。它的姿态相反:假设一次拿齐 32 张 960×540 的高分辨率图,全部 patchify 后用 Mamba2 与 Transformer 混合主干一次前馈出高斯,再做高斯剪枝。因为 Mamba2 把自注意力的二次复杂度压成线性,长序列才能被装进单卡。在单张 A100 上,整次重建约 1 秒,相对传统 3DGS 的 13 分钟逐场景优化大约快 800 倍。Long-LRM

图注:Long-LRM 一次性前馈路线。上半段 32 张输入图连同各自的光线嵌入一起 patchify 成 token,经 24 个 Mamba2 加 Transformer 混合块处理并在中途做 token 合并,最后解码成逐像素高斯、再做高斯剪枝;下半段展示最终的宽覆盖重建与多视角新视角合成。Long-LRM

这两条路线不是竞争关系,而是同一个新任务在两种资源约束下的姿态:LongSplat 面向视频流持续进入、对显存友好;Long-LRM 面向一次到位的固定图集、图再多也快。它们一个流式增量、一个一次性前馈,共同把"上千帧"这个量级接住了。

注意 LongSplat 并没有放弃相机条件。它的 DepthSplat 主干仍然假设位姿已由预计算给出,论文把无位姿化明确列为未来工作。所以第三步放宽放掉的是帧数上限,不是前面两章的标定与位姿问题——这正是三件事叠加而不是互相替代的证据。

评一套通用重建系统,该用哪几把尺子?

把三步放宽串起来看,你会发现每一步都换了一把新尺子,而 PSNR 只是其中一把。要评价任意一篇新的通用重建工作,先问四件事:它放宽了哪层假设?它在这四条轴上做了什么取舍?视觉质量和几何一致性是否冲突?以及平均分数掩盖了哪条轴的失败?

把三步放宽和四条评价轴放在一张矩阵里,就是带走的那张坐标图:

图注:三次假设放宽 × 四条评价轴的交点坐标。每一次放宽都在放宽一个假设的同时,暴露出新的一条失败轴:放宽标定暴露"相机条件",放宽帧数暴露"可扩展性"。

这套坐标图怎么用?拿到一篇新工作,用三问定位它:第一,它放宽了哪层假设,是去掉了逐场景优化、去掉了相机标定,还是去掉了帧数上限;第二,它在这四条轴上做了什么取舍,几何一致性强的方案未必渲染稳,反之亦然;第三,它的平均 PSNR 掩盖了哪条轴的失败,尤其要警惕长序列上被平均分藏起来的远端崩坏。

读完三步放宽,四点提醒值得复述一遍。平均 PSNR 不是唯一标准,它可能把远距离视点的崩坏平均掉;视觉质量与几何一致性可能冲突,MVS 的深度对应强,但渲染的稳定性未必跟得上;强几何主干替代不了相机标定,VGGT 再强,StructSplat 也还得靠显式对齐堵住泄漏;更多图像不等于更容易重建,帧数翻倍时 DepthSplat 的质量反而倒退。这四条不是结论,是四根探针,每一根都能插进一篇新工作的要害。

回顾整条递进,我们其实读的是一个连贯的判断过程。从 MVSGaussian 证明已标定稀疏视角能一次前馈,到 StructSplat 顶着 VGGT 揭示"强几何主干不够、必须解耦加对齐",再到 LongSplat 接住千帧量级、Long-LRM 以 32 图单次前馈提供互补路线,每一步都在回答上一个台阶留下的问题。Survey3DGS

最后保留一点清醒的边界。这条路目前仍止步于静态场景,动态世界和从重建到可编辑资产还悬在下一步。但坐标系已经在了:视觉质量、几何一致性、相机条件、可扩展性,四条轴一摆,任何一篇新工作都能找到自己的位置与取舍。平均 PSNR 只是其中一把尺子,真正的判断,是先问清楚它放宽了哪一层假设。

参考文献

本专题引用的核心资料如下,建议深入学习时阅读原文:

  1. 3D Gaussian Splatting for Real-Time Radiance Field Rendering — arXiv:2308.04079
  2. MVSGaussian: Fast Generalizable Gaussian Splatting Reconstruction from Multi-View Stereo — arXiv:2405.12218
  3. pixelSplat: 3D Gaussian Splats from Image Pairs for Scalable Generalizable 3D Reconstruction — arXiv:2312.12337
  4. DepthSplat: Connecting Gaussian Splatting and Depth — arXiv:2410.13862
  5. VGGT: Visual Geometry Grounded Transformer — arXiv:2503.11651
  6. StructSplat: Generalizable 3D Gaussian Splatting from Uncalibrated Sparse Views — arXiv:2606.28321
  7. No Pose, No Problem: Surprisingly Simple 3D Gaussian Splats from Sparse Unposed Images — arXiv:2410.24207
  8. LongSplat: Online Generalizable 3D Gaussian Splatting from Long Sequence Images — arXiv:2507.16144
  9. Long-LRM: Long-sequence Large Reconstruction Model for Wide-coverage Gaussian Splats — arXiv:2410.12781
  10. A Survey on 3D Gaussian Splatting — arXiv:2401.03890
从三张照片到上千帧:通用 3DGS 的三次假设放宽