DashGaussian概述
DashGaussian 项目与论文详细概述文档
1. 背景与要解决的问题
3DGS 优势与瓶颈
- 3D Gaussian Splatting (3DGS) 用高斯原语直接表示场景,能在保持 NeRF 级别画质的前提下,把单场景优化时间从数十小时降到十几分钟。
- 但对很多应用来说,这仍然偏慢:
- 消费级 GPU 上训练一场景需要十几分钟。
- 大规模城市、多场景批量重建时,总时间仍然巨大。
时间主要花在哪里?
论文指出 3DGS 一次迭代中最耗时的是三类操作:- 前向渲染:按当前高斯集合在给定分辨率上渲染所有像素。
- 反向传播:对所有像素和所有高斯求梯度。
- 原语更新/稠密化:根据 densification 策略克隆/分裂/剪枝高斯。
这三者的复杂度几乎都只由两件事决定:
- 渲染分辨率(像素个数)。
- 高斯原语数量(参与每个像素累积的 primitive 数)。
论文把这两者合称为 “优化复杂度”(optimization complexity)。
已有加速方法的问题
- 工程向:改写 CUDA / backward pipeline(如 3dgs-accel、Taming-3DGS 等),提升每次前向/反向的速度。
- 算法向:在 densification 后剪枝冗余高斯(如 Reduced-3DGS、Mini-Splatting),或减少每个高斯的特征维度。
- 这些方法在大幅压缩参数时,画质容易明显下降,或者改动 pipeline 较大,泛化性有限。
DashGaussian 想解决的问题:
在不牺牲(甚至略微提升)渲染质量的前提下,通过更聪明地分配计算资源,显著缩短 3DGS 优化时间,并且作为一个 可插拔插件 适用于多种 3DGS backbone。
2. 核心思想与主要贡献
核心思想(一句话):
把 3DGS 优化看成“逐步拟合训练视图中越来越高频成分”的过程,通过 频域引导的分辨率调度 + 分辨率引导的 primitive 数量调度,在不同阶段动态控制优化复杂度,从而在几乎不降画质的情况下,大幅加速训练。三个关键模块
- 频率引导的分辨率调度(Resolution Scheduler)
- 通过对训练图像做 DFT,分析各个分辨率下的频率能量,决定:
- 早期在低分辨率上训练(拟合低频内容),
- 逐步切换到高分辨率(拟合高频细节)。
- 通过对训练图像做 DFT,分析各个分辨率下的频率能量,决定:
- 分辨率引导的 primitive 调度(Primitive Scheduler)
- 把目标高斯数量设成随迭代数和分辨率变化的凹向上曲线:
- 早期避免 primitive 暴涨(否则低分辨率下会浪费计算)。
- 中后期再加速 densification,最后达到接近 backbone 最终密度。
- 把目标高斯数量设成随迭代数和分辨率变化的凹向上曲线:
- 动量式 primitive 预算(Momentum-based Primitive Budgeting)
- 不用手动指定最终 primitive 上限,而是在训练中根据每次自然 densification 的数量,用类似动量更新的公式估计所需的最大 primitive 数 P_fin。
- 频率引导的分辨率调度(Resolution Scheduler)
实验结论概括
- 作为独立快优化方法:
- 在 Taming-3DGS backbone 上,DashGaussian 可以把单场景优化时间压到 约 200 秒,同时画质略好于其他快速 3DGS 方法。
- 作为插件:
- 在 3DGS、Mip-Splatting、Revising-3DGS、Taming-3DGS 等多种 backbone 上,平均加速约 45.7%,
- 同时 primitive 数更少或相当,PSNR/SSIM/LPIPS 基本不降,甚至略有提升。
- 作为独立快优化方法:
3. 算法 / “网络结构”整体框架
DashGaussian 不是一个新的神经网络结构,而是对已有 3DGS 优化过程的 调度框架。可以把整体流程理解为下图(文字版):
输入模块
- 多视图 RGB 图像
{I_n},带相机内外参(COLMAP/SfM 得到)。 - 场景点云(用于初始化高斯原语,和原版 3DGS 一致)。
- 多视图 RGB 图像
3DGS Backbone(原始网络/模型)
- 一组 3D 高斯
{G_i}(位置、协方差、opacity、颜色参数等)。 - 可微分的 splatting 渲染核(diff-gaussian-rasterization)。
- 损失函数(L2 + 可能的正则项)。
- densification 逻辑(根据梯度/误差分裂/克隆高斯)。
- 一组 3D 高斯
DashGaussian 调度层(新贡献)
频率分析与分辨率曲线生成(离线预处理 + 全局调度)
- 对训练图像在不同下采样尺度 r 计算频率能量 X(F_r)。
- 根据能量比例,决定:
- 每个分辨率区间应占的迭代步数。
- 实际训练时第 k 步采用的渲染分辨率 r(k)。
- 补充细节:
- 使用防混叠的下采样(PyTorch 官方 anti-alias 算法)避免 2D aliasing。
- 通过对 log 比例的函数(补充材料中的 Eq.(6)(7))压缩低分辨率阶段、延长高分辨率阶段。
分辨率引导的 primitive 数量曲线
- 记 P_init 为初始 primitive 数,P_fin 为目标上限。
- 定义目标 primitive 数 Pi ≈ P_init + (P_fin - P_init) · f(r(i), i/S),
使得:- 早期(低分辨率)增长受限,防止过密。
- 中后期增速加快,但最终 primitive 总面积(∑Pi)整体较小。
- 保持整条曲线 凹向上,与以往 concave-down 或前半段暴涨的 densification 策略形成对比。
动量式 P_fin 估计
- 每次 densification 后,统计“本次自然 densify 的 primitive 数量” P_add(i)。
- 按
[
P_{fin}^{(i)} = \max\left(P_{fin}^{(i-1)},\ \gamma P_{fin}^{(i-1)} + \eta P_{add}^{(i)}\right)
]
更新目标上限(γ≈0.98,η≈1)。 - 实际最终 primitive 数 N_GS ≤ P_fin,因 densification 同时受阈值和 top-k 控制。
训练迭代流程(单步)
每个迭代 i:
- 步骤 1:用分辨率调度器确定当前分辨率 r(i),下采样 ground-truth 图像到对应大小。
- 步骤 2:在该分辨率下用当前高斯集合渲染,计算与下采样 GT 的损失。
- 步骤 3:反向传播更新所有高斯参数(位置、协方差、颜色、opacity 等)。
- 步骤 4:根据 primitive 调度器与 backbone 自身的 densification 分数,选择 top-k 原语进行 prune / clone / split,使实际数量尽量接近 Pi。
输出
- 优化好的 3D 高斯集合(可导出为
.ply等),在全分辨率下渲染 novel views。 - 同时得到一条分辨率曲线和一条 primitive 数曲线(仅用于分析/可视化)。
- 优化好的 3D 高斯集合(可导出为
4. 输入、输出与可微性
输入
- 与标准 3DGS 相同:
- 多视图 RGB 图像(一般是 COLMAP 预处理后的数据组织形式)。
- 每张图像的相机内外参。
- 初始点云(SfM/Colmap 生成)。
- DashGaussian 额外需要:
- 训练图像在频域的能量分布(训练开始前可一次性计算)。
- 调度相关超参数:
- 总迭代数 S,
- 初始分辨率控制参数 a(决定最小 r_max),
- 动量参数 γ、η(决定 P_fin 估计)。
- 与标准 3DGS 相同:
输出
- 与 backbone 一致:
- 场景的 3D 高斯集合:
- 位置
p_i、协方差Σ_i、opacityo_i、颜色系数c_i(如 SH 系数)。
- 位置
- 用这些高斯可以在任意视角渲染 RGB 图像。
- 场景的 3D 高斯集合:
- 实验中统计的指标:
- PSNR、SSIM、LPIPS、训练时间(分钟)、最终 primitive 数(N_GS)。
- 与 backbone 一致:
是否可微?
- 渲染和参数更新部分完全沿用 3DGS 的 可微分 rasterization,DashGaussian 只改变:
- 用哪一分辨率渲染(选择不同大小的像素格子);
- 在 densification 时克隆/剪枝哪些高斯(和原 3DGS 一样,本来就是非连续操作)。
- 因此,它保持与 3DGS 相同的 端到端可微优化特性,可以继续用梯度下降进行训练/微调。
- 渲染和参数更新部分完全沿用 3DGS 的 可微分 rasterization,DashGaussian 只改变:
5. 训练与微调:如何使用 DashGaussian
5.1 项目层面的使用方式
环境准备(见项目 README)
- Clone 仓库:
git clone https://github.com/YouyuChen0207/DashGaussian.git
- 按原始 3DGS 仓库的说明安装依赖(本仓库已将
diff-gaussian-rasterization切到3dgs-accel分支以加速 backward)。
- Clone 仓库:
运行脚本
- 设置
scripts/full_eval.sh中的数据路径(指向你的 Mip-NeRF360/Deep Blending/T&T 数据路径)。 - 执行:
bash scripts/full_eval.sh
- 设置
关键命令行选项(在
full_eval.py中)--dash:启用 DashGaussian 调度(核心开关)。--fast:使用 Sparse Adam 优化器(类似 Taming-3DGS 风格的“工程加速”)。--preset_upperbound:手动设置 primitive 数上限,关闭动量式 primitive 预算(默认不启用)。
5.2 是否可以“微调训练”?
这里的“微调”可以理解为两类:
(1) 在新场景上训练时,微调 DashGaussian 的调度超参数
- 例如:
- 场景纹理很简单,可把 a 设得更大,让初始分辨率更低、低分辨率阶段更长,从而进一步加速。
- 对画质非常敏感,可适度增大 γ,让 P_fin 更大、primitive 更密集。
- 例如:
(2) 在已有 3DGS 模型基础上继续优化(继续训练)
- 思路:
- 使用原 3DGS/Taming-3DGS 的 checkpoint 作为初始化。
- 启用
--dash,在较短的额外迭代中继续优化:- 早期可以从中等分辨率开始,避免过度下采样;
- 也可以把总迭代数 S 设置得更小,让调度在“后半程”完成。
- 优点:
- 在已有结果上进行“收尾抛光”,利用频域分辨率调度更好拟合高频细节。
- 可在已有 primitive 分布基础上,用 DashGaussian 的 primitive 调度重新整理密度配置。
- 思路:
5.3 典型训练 / 微调流程示例(概念层面)
新场景完整训练
- 步骤 1:按原 3DGS 流程准备数据(COLMAP、poses、sparse point cloud)。
- 步骤 2:在 DashGaussian 仓库中配置好路径,执行训练脚本并加上
--dash。 - 步骤 3:可选:
- 使用
--fast叠加 Sparse Adam 加速, - 使用默认 γ=0.98,a=4,一般能在保证质量的前提下获得较大加速。
- 使用
已有 checkpoint 微调
- 步骤 1:在 backbone 代码中加载原 3DGS 或 Taming-3DGS 的 checkpoint。
- 步骤 2:启用 DashGaussian:
- 开启
--dash,将总迭代数设置为较小值(如原训练步数的一小部分)。 - 适当提高初始分辨率(减小 a 或直接限定 r(i) 的最小值),避免过多时间浪费在已收敛的低频部分。
- 开启
- 步骤 3:根据需要选择是否允许继续 densification:
- 需要更细节 ⇒ 启用 primitive 调度、保留 P_fin 更新。
- 只想微调颜色 ⇒ 可以大幅减小 primitive 增长或固定 P_fin。
6. 论文实验与数据集概览
6.1 使用的数据集
Mip-NeRF 360
- 实际拍摄的“无界”场景数据集,含 bicycle, garden, stump, flowers, treehill, room, kitchen, counter, bonsai 等场景。
- 主要用于评估室内外复杂几何与光照下的 novel view synthesis。
Deep Blending Dataset
- 由 Deep Blending 提供的场景,如 drjohnson、playroom。
- 场景纹理和几何复杂度高,适合评估视角插值质量和融合能力。
Tanks & Temples (T&T)
- train、truck 等大场景。
- 经典大规模重建基准,用于评估算法在复杂室外结构上的性能。
MatrixCity(大规模实验)
- 大规模城市级神经渲染数据集。
- 论文中跟随 VastGaussian 的划分策略,把城市切成 9 个 block 分别训练,用 Taming-3DGS 作为 backbone,检验 DashGaussian 在城市级重建中的扩展性。
6.2 对比方法与 backbones
快速 3DGS 优化方法对比(表 1)
- 3DGS(原始版本)。
- Reduced-3DGS:通过裁剪高斯减少内存与算力。
- Mini-Splatting:限制高斯总数。
- Taming-3DGS:通过更高效 backward 和 Sparse Adam 加速。
- DashGaussian + Taming-3DGS(本文方法)。
作为插件增强不同 backbone 的对比(表 2)
- 3DGS + DashGaussian。
- Mip-Splatting + DashGaussian(alias-free 3DGS)。
- Revising-3DGS* + DashGaussian(作者基于 Taming-3DGS 重实现)。
- Taming-3DGS + DashGaussian。
6.3 评价指标
渲染质量
- PSNR(越高越好)。
- SSIM(结构相似性,越高越好)。
- LPIPS(感知距离,越低越好)。
效率与模型规模
- 平均优化时间(分钟)。
- 最终高斯数量 N_GS(越少越好,在质量相近的前提下)。
6.4 关键实验结论
与其它快速 3DGS 方法比较(表 1)
- 在 Mip-NeRF 360 / Deep Blending / T&T 三个数据集上:
- DashGaussian(搭配 Taming-3DGS)能在 ~200 秒内完成训练,
- 相比 Reduced-3DGS / Mini-Splatting 有明显更好或相当的 PSNR/SSIM,
- 相比 Taming-3DGS 本身,时间进一步大幅降低,画质略有提升。
- 在 Mip-NeRF 360 / Deep Blending / T&T 三个数据集上:
作为插件增强各 backbone(表 2)
- 在所有 backbone 上:
- 时间减少约 45.7%(平均)。
- primitive 数略减或持平(说明调度有效减少计算冗余)。
- PSNR/SSIM 基本持平甚至稍高,LPIPS 大多不变或略优。
- 在所有 backbone 上:
时间剖析(图 5)
- 对 3DGS 与 Taming-3DGS 分别统计:
- 单步 forward、backward、optimize 的时间。
- DashGaussian 在三项上都有显著下降,说明通过控制分辨率与 primitive 数,确实减少了每步的实算量。
- 对 3DGS 与 Taming-3DGS 分别统计:
消融实验(表 3,表 8,表 9)
- 单独使用分辨率调度或 primitive 调度都可以在加速的同时轻微提升画质。
- 同时使用两者(Full),效果最好:
- 时间减少最多(例如 Taming-3DGS 上约 41.3%),
- primitive 数变少,PSNR 仍高于 backbone。
- 超参数 γ、a 的变化基本遵循直观:
- γ 越大 ⇒ P_fin 越大 ⇒ primitive 更多 ⇒ 画质略好,时间略长。
- a 越大 ⇒ 初始分辨率越低 ⇒ 时间更短,画质变化不大。
大规模 MatrixCity 实验(表 10)
- 在城市级场景上:
- DashGaussian 将 Taming-3DGS 的训练时间从 44.22 min 降到 25.82 min(约 41.6% 加速),
- PSNR/SSIM/LPIPS 略有改善,primitive 数几乎不变。
- 在城市级场景上:
7. 总结与适用场景
DashGaussian 解决的核心问题
- 在 3DGS 训练中,如何不牺牲画质、甚至略有提升的前提下,大幅减少训练时间。
方法本质
- 把 3DGS 优化视为逐步拟合图像频率成分的过程,
- 通过频率分析来调度渲染分辨率,
- 再用分辨率引导 primitive 的密度增长,
- 并用动量策略自适应地估计合适的 primitive 上限。
工程特点
- 不改变 3DGS 的基本表示与渲染核,仅在“训练调度层”做工作。
- 作为插件易于嵌入:在不同 backbone 上仅需改动分辨率、densification 与学习率 schedule。
- 完全保持可微性,可继续做场景级训练与微调。
适合的应用场景
- 需要大量场景批量重建(如多房间/多建筑)。
- 目标设备算力有限(如消费级 GPU),但仍希望保持 3DGS 级别画质。
- 现有 3DGS pipeline 已跑通,希望“白嫖”进一步加速而不大改工程结构。
如果你喜欢这篇文章,欢迎点个赞或分享给更多人。