3DGS 算法架构与实现:初始化、密度控制与训练策略
在理解了 3DGS 的核心数学原理后,本文将深入探讨其完整的算法架构与实现细节。3DGS 的成功不仅依赖于优雅的数学表示,更依赖于精心设计的训练策略。
1. 引言
1.1 算法总体框架
3DGS 完整流程包括 SfM 点云初始化、高斯初始化、训练循环(可微分渲染、计算损失、反向传播、参数更新)、密度控制(添加/移除高斯)及最终输出高斯场景。
主要步骤:
- SfM 点云初始化:从多视角图像获取稀疏点云和相机位姿。
- 高斯初始化:基于 SfM 点生成初始高斯集合。
- 训练循环:随机采样视角,前向渲染,计算损失,反向传播。
- 密度控制:根据梯度累积情况克隆、分裂或剪枝高斯。
2. 初始化
2.1 SfM 点云获取
3DGS 使用 Structure from Motion (SfM) 获取初始点云和相机位姿。
常用 SfM 工具:
- COLMAP(推荐)
- OpenMVG
- VisualSFM
SfM 流程:
- 特征提取 (SIFT)
- 特征匹配
- Bundle Adjustment
- 输出稀疏点云与相机位姿
COLMAP 输出格式:
| 文件 | 内容 |
|---|---|
| cameras.bin/txt | 相机内参 (fx, fy, cx, cy) |
| images.bin/txt | 图像位姿 (四元数 + 平移) |
| points3D.bin/txt | 稀疏点云 (位置 + 颜色) |
2.2 高斯初始化策略
每个 SfM 点初始化为一个高斯:
# 初始化参数
for point in sfm_points:
# 位置:直接使用 SfM 点坐标
mu = point.xyz # (3,)
# 缩放:基于邻近点距离
distances = compute_knn_distances(point, k=3)
scale = mean(distances)/2 # (3,) 各向同性
# 旋转:单位四元数(无旋转)
rotation = [1,0,0,0] # (4,)
# 不透明度:初始为 0.1,存储 logit 值
opacity = inverse_sigmoid()
sh_dc = RGB2SH(point.color)
sh_rest = zeros()

