A Hierarchical 3D Gaussian Representation for Real-Time Rendering of Very Large Datasets
TU Wien; Université Côte d'Azur
一句话总结
为 3D Gaussian Splatting(3DGS)引入一套可优化的层级结构(LOD),并配合”分块(chunk)分治训练 + 层级合并”的完整流水线,使得数万张图像、覆盖数公里街景的超大场景第一次能被实时(>30 FPS)渲染。
研究背景
3DGS 用一组显式的各向异性 3D 高斯体表示场景,兼具高画质、快速训练与实时渲染,是无界场景新视角合成(NVS)的代表方法。但无论表示本身多高效,训练与渲染的资源(尤其显存)都限制了可处理场景的规模:
- NeRF 类方法难以扩展:隐式表示 + 网格类加速结构通常带来立方级的内存增长。少数大场景方案(如 BlockNeRF)资源开销极高,且都没有实时渲染能力。
- 原始 3DGS 会耗尽资源:把整个大场景一次性塞进去,显存迅速爆掉,即便是高端 GPU 也无法渲染,训练时开销更大。
- 大场景采集本身很稀疏:车载/头盔式采集轨迹稀疏、非”物体中心”,光线空间覆盖不均,还夹杂曝光变化、行人、移动车辆等干扰,原始 3DGS 的稠密化策略在此表现不佳。
本文提出一个完整系统,用分治 + 层级 LOD 把可处理场景的规模提升约一个数量级,并首次实现这种规模场景的动态 LOD 实时渲染。
核心方法
整体流水线分四步:先对整个场景做一次极粗的初始化作为背景骨架(scaffold)与天空盒;再把场景切成若干 chunk 并行独立训练;为每个 chunk 构建可优化的 3DGS 层级;最后把所有 chunk 的层级合并成全局层级,用于 LOD 实时渲染。
flowchart LR
A[数千标定相机<br/>覆盖大范围] --> B[粗初始化<br/>全场景骨架+天空盒]
B --> C[切分 chunk<br/>50x50m / 100x100m]
C --> D[逐 chunk 独立训练<br/>稀疏数据适配]
D --> E[逐 chunk 构建层级<br/>BVH 自底向上合并]
E --> F[层级优化<br/>优化中间节点]
F --> G[合并所有 chunk<br/>清理冗余节点]
G --> H[LOD 实时渲染<br/>切割选择+平滑过渡]
1. 3DGS 层级(LOD)的构建
背景:3DGS 的 \(\alpha\)-blending 权重为 \(\alpha = o\,G\),其中投影高斯贡献为
\[G(x,y) = e^{-\frac{1}{2}\left([x,y]^T-\mu'\right)^T \Sigma'^{-1}\left([x,y]^T-\mu'\right)}\]
合并规则:层级中每个节点仍是一个完整的 3D 高斯(叶节点来自原始优化,内部节点由孩子合并而来),从而复用同一套快速光栅化。为使合并节点与孩子的加权分布之间的 3D KL 散度最小,均值与协方差按下式合并:
\[\mu^{(l+1)} = \sum_i^N w_i\, \mu_i^{(l)}\]
\[\Sigma^{(l+1)} = \sum_i^N w_i\left(\Sigma_i^{(l)} + (\mu_i^{(l)}-\mu^{(l+1)})(\mu_i^{(l)}-\mu^{(l+1)})^T\right)\]
合并权重:从屏幕空间贡献推导。单个高斯对整幅图的贡献 \(C_i = o_i c_i \sqrt{(2\pi)^2 |\Sigma'|}\),要求父节点贡献等于两个孩子之和,解得(忽略无关常数与颜色):
\[w_i' = o_i \sqrt{|\Sigma_i'|}\]
实际中 \(\sqrt{|\Sigma_i'|}\) 正比于对应椭球的投影表面积 \(S_i\),故直接用 \(S_i\) 计算。球谐 SH 系数按同样权重加权平均。
falloff(衰减值)替代不透明度:多个相邻高斯 \(\alpha\)-blend 后会出现”比单个高斯更慢”的衰减曲线。合并节点用 \(\sum_i w_i' / S_p\) 表示这一慢衰减效果,但该值可能大于 1——因此对中间节点它不再是”不透明度”而称为 falloff,渲染时行为同 opacity,但 \(\alpha\) 被 clamp 到 1。
层级结构:在所有高斯上自顶向下建 AABB 的 BVH(用 3× 存储尺寸作为包围范围),沿最长轴对投影均值做二分中值划分,保证子节点空间紧凑;随后自底向上递归合并出中间节点高斯。
2. 切割选择与平滑层级切换
定义节点 \(n\) 的粒度 \(\epsilon(n)\) 为其包围盒在屏幕上的投影尺寸。给定视角与目标粒度 \(\tau_\epsilon\)(如 1 像素),选出”自身满足但父节点不满足粒度条件”的节点组成切割(cut)。由于父节点投影不可能小于任何孩子,切割可在线性时间(并行时每节点常数时间)求出。
平滑过渡靠对单个高斯属性插值实现。插值权重为
\[t_n = \frac{\tau_\epsilon - \epsilon(n)}{\epsilon(p) - \epsilon(n)}\]
位置、颜色、SH 线性插值;协方差则分别插值 scale 与 rotation(效果优于直接插值协方差矩阵)。为避免”形状相同但旋转/缩放表述不同”导致的多余旋转,构建层级时做朝向匹配:从根递归地重新解释每个孩子的旋转轴,穷举使其相对父节点旋转最小。
不透明度插值需特殊处理:过渡开始时孩子与父节点共享属性,需修改孩子 falloff 使混合结果等于父节点。对两个孩子解
\[\alpha_p c_p = \alpha' c_p + (1-\alpha')\alpha' c_p\]
得 \(\alpha' = 1 - (1-\alpha_p)^{1/2}\);推广到 \(K\) 个孩子为 \(\alpha' = 1 - (1-\alpha_p)^{1/K}\)。再用同样的线性方案插值:\(\alpha(t) = t\,\alpha_i + (1-t)\,\alpha'\)。
3. 优化并压实层级
层级最初纯几何构建,之后可进一步优化中间节点提升画质。关键洞察:不做降采样,始终以全分辨率渲染,只随机选择目标粒度。传统”降低分辨率对齐层级”的做法会丢失高频细节(各向异性大高斯本可建模的高频),而随机粒度能在多种 cut 下优化节点同时保留细节。目标粒度按 \(\tau_\epsilon = \tau_{max}^{\xi}\,\tau_{min}^{1-\xi}\)(\(\xi \in [0,1)\))采样。
优化时梯度需正确传播到相邻两层(含插值权重与 \(\alpha'\),其中 Eq.12 的梯度手工推导);为避免高层优化破坏叶节点质量,用 stop-gradient 冻结叶节点。由于层级在不同尺度工作,还采用 Yu et al. 的 EWA 抗锯齿。
压实(compacting):标记所有叶节点为保留,从 \(\tau_{min}=3\) 像素起对所有训练视角求 cut 的并集,找出最底层相关节点,删除它们与已标记节点之间的冗余节点,随后 \(\tau\) 翻倍重复直到 \(\tau_{max}\)(半分辨率)。这避免了”父子尺寸只略微差异”的节点因很少被选中而训练不足。
4. 大场景分块训练
- 粗初始化 + 分块:先在全场景上跑一次极粗的 3DGS(关闭稠密化、不优化位置,用 SfM 点),得到背景骨架与天空盒。walking 采集用 50×50 m、车载用 100×100 m 的 chunk。每个 chunk 选取落在范围内或范围 2× 内且在范围内有 >50 个 SfM 点的相机。
- chunk 级训练适配稀疏数据:
- 用 100 000 个高斯在 10× 场景直径的球面上建天空盒;chunk 外内容用粗模型,仅临时优化其 opacity 与 SH。
- 修改稠密化策略:稀疏采集下原始”屏幕空间梯度均值”不再可靠,改用最大值判据决定是否稠密化。
- 单目深度正则:预测单目深度,用 SfM 点做尺度/位移对齐后正则化优化,显著改善缺乏特征的路面等区域。
- 合并与渲染:某 chunk 关联但落在别的 chunk 更近处的高斯在合并阶段被删除;构建带全局根节点的整体层级。渲染时设粒度阈值求 cut,每 2 帧更新一次 cut(从 CPU RAM 向 GPU 传输细节节点),每 100 帧清理一次。
工程实现:基于原始 3DGS 的 C++/PyTorch 实现,改造 SIBR 查看器渲染。因存在 \(\alpha>1\) 的中间节点,优化后改用绝对值激活代替指数激活,并在 clamp 发生时置零该高斯的 opacity 梯度。采集用头盔挂 5–6 台 GoPro HERO6;位姿用 COLMAP(层级 mapper + 逐 chunk bundle adjustment),并做逐图曝光校正、CNN 分割去除移动车辆/行人/车牌。
实验与结果
数据集:自采 SmallCity(5822 图 / 450 m)、Campus(22042 图 / 1.6 km)、BigCity(38235 图 / 7 km),以及 Wayve 提供的场景(11520 图 / 1 km)。分别切成 4/11/22/46 个 chunk,每 chunk 2–8M 个叶高斯。粗、单 chunk、层级优化各约 1 小时(单张 V100 32GB),峰值显存分别约 2–5 / 8–10 / 11–16 GB。
单 chunk 质量对比(因其他方法无法处理完整大场景,只在单 chunk 上公平对比,所有方法同输入):本文的 “Ours (leaves)” 在 PSNR/LPIPS/SSIM 上全面超过 3DGS、Mip-NeRF 360、Instant-NGP、F2-NeRF。例如 SmallCity 上 PSNR 从 3DGS 的 25.34 提升到 26.62。主要收益来自深度监督与改进的稠密化(消融见 Tab.6)。
层级/LOD 效果:随粒度变粗质量自然下降;但在较粗 cut 下,层级优化(Ours opt)明显优于未优化版本。如 Campus 在 \(\tau_3=15\) 像素时,PSNR 从 22.93(未优化)升到 24.12(优化),意味着同等计算预算下画质更好。
大场景实时渲染(A6000):所有相机路径在高质量档 \(\tau_1\) 平均 30+ FPS,中档 \(\tau_2\) 约 60 FPS。LOD 大幅削减负载——场景越大削减越多:BigCity 在 \(\tau_2\) 下每帧只渲染约 8% 的叶高斯。原始 3DGS 渲染器在测试系统上根本无法运行 Campus / BigCity(Wayve 超出 RTX 4090、SmallCity 超出 RTX 4080)。每高斯内存约 400 字节(比 3DGS 多 69%),层级场景磁盘约比非层级 3DGS 大 68%。
Mega-NeRF 空拍数据对比(Mill 19):即便未针对空拍调优,本文在 Building/Rubble 上均优于 Mega-NeRF;且 Mega-NeRF 需 8 张 V100 训练 27–30 小时,本文仅需 2–4 张 V100 约 3 小时并可实时渲染。
贡献与局限
贡献:
- 首个可优化的 3DGS 层级,支持高效层级选择与平滑插值过渡;
- 中间节点优化方法,改善质量/速度权衡;
- 基于 chunk 的分治训练与渲染,支持并行处理超大场景。整体系统首次实现数公里街景、数万张图像的动态 LOD 实时渲染,且可用消费级设备采集。
局限:
- 视觉瑕疵多源于输入数据本身:视角覆盖不足、标定误差、未完全去除的移动干扰(尤其”停下的车”难以识别)。
- 稀疏采集下大部分区域的外插(自由视点偏离采集轨迹)能力有限,未来可借助高质量先验改善。
- 当前用固定粒度,未来可加入基于资源预算的动态 LOD 选择,以及可见性/距离剪裁进一步提速。
- 作者展望:3DGS 层级有望成为一等的图形表示,用于场景图、动画、碰撞检测等。