当前位置: 首页 > news >正文

3DGS 学习

目标:理解 3DGS 的核心表示和训练渲染流程,能跑通官方实现,能准备自定义数据集,能排查常见重建问题,并能回答面试常问问题。

目录

  • 1. 3DGS 是什么
  • 2. 3DGS 解决什么问题
  • 3. 3DGS 和 NeRF、Mesh、点云的区别
  • 4. 3DGS 核心表示:一个 Gaussian 里有什么
  • 5. 3D Gaussian 的数学直觉
  • 6. 从 3D Gaussian 到 2D Splat
  • 7. 3DGS 渲染流程
  • 8. 3DGS 训练流程
  • 9. Densification 和 Pruning
  • 10. 颜色表示:Spherical Harmonics
  • 11. 相机内外参在 3DGS 中的作用
  • 12. 3DGS 数据链路:图片到模型
  • 13. 环境安装与验证
  • 14. 实操一:跑通官方预训练模型
  • 15. 实操二:训练官方示例或自定义场景
  • 16. 实操三:渲染和评估
  • 17. 实操四:自定义图片数据集准备
  • 18. 实操五:检查 COLMAP 输出
  • 19. 3DGS 输出文件和 PLY 结构
  • 20. 常用训练参数和调参经验
  • 21. 常见问题排查
  • 22. 进阶方向
  • 23. 面试常问问题
  • 24. 练习任务
  • 25. 参考资料

1. 3DGS 是什么

3DGS,全称 3D Gaussian Splatting,是一种用于新视角合成和三维场景表示的方法。它把场景表示为大量可优化的 3D 高斯椭球,并通过高效的 splatting rasterization 进行实时渲染。

一句话理解:

3DGS 用很多带颜色、透明度、大小、方向的 3D 高斯椭球来表示场景, 再把这些高斯快速投影到屏幕上进行 alpha blending,得到新视角图像。

它的典型输入:

多张图片 相机内参 相机外参 稀疏点云

它的典型输出:

一个 .ply 高斯模型 可从新相机视角实时渲染的场景

3DGS 论文核心贡献可以概括为:

  • 使用 3D Gaussians 表示连续辐射场。
  • 从 SfM 稀疏点初始化,并在训练中动态 densify/prune。
  • 使用可微、可见性感知的高效 splatting 渲染。
  • 在较高画质下实现实时或接近实时的新视角渲染。

2. 3DGS 解决什么问题

3DGS 主要解决:

给定一个真实场景的多视角图片,如何训练出一个能快速渲染任意新视角的 3D 表示。

应用方向:

  • 新视角合成。
  • 实景三维重建。
  • VR/AR 场景浏览。
  • 数字孪生。
  • 机器人和自动驾驶仿真资产。
  • 文物、建筑、室内空间数字化。
  • 影视和游戏资产采集。

与传统 mesh 重建不同,3DGS 并不直接追求显式表面网格,而是追求从不同视角看起来真实。

3. 3DGS 和 NeRF、Mesh、点云的区别

3.1 和 NeRF 的区别

对比NeRF3DGS
场景表示隐式 MLP 辐射场显式 3D Gaussians
渲染方式沿射线采样 + 体渲染高斯投影 + rasterization
训练速度通常较慢通常更快
渲染速度原始 NeRF 较慢实时性强
可编辑性较弱高斯是显式对象,较易编辑
几何表面隐式密度,不直接是 mesh高斯椭球集合,不直接是 mesh

一句话:

NeRF 像是在空间中查询一个神经网络; 3DGS 像是在空间中放了很多可渲染的半透明小椭球。

3.2 和 Mesh 的区别

Mesh 表示显式表面:

vertices + faces + texture

3DGS 表示体积感的半透明高斯:

position + covariance + opacity + color

Mesh 更适合:

  • 物理仿真。
  • 碰撞检测。
  • 传统游戏引擎资产。
  • CAD/建模。

3DGS 更适合:

  • 快速真实感新视角渲染。
  • 从图片直接学习场景外观。
  • 不容易得到干净表面的真实场景。

3.3 和点云的区别

普通点云通常只有:

xyz + rgb

3DGS 每个点是一个可投影的 3D 椭球,还包含:

  • 尺度。
  • 旋转。
  • 不透明度。
  • 视角相关颜色。
  • 可优化参数。

因此 3DGS 可以看成“可渲染、可优化、带体积和透明度的点云扩展”。

4. 3DGS 核心表示:一个 Gaussian 里有什么

一个 3D Gaussian 通常包含:

mean / position: μ = [x, y, z] covariance: Σ scale: s = [sx, sy, sz] rotation: q or R opacity: α color / SH features: c

4.1 position

表示高斯中心点在世界坐标系中的位置。

初始 position 通常来自 COLMAP 稀疏点云。

4.2 covariance

协方差控制高斯在三维空间中的形状、大小和方向。

为了保证协方差正定,通常不直接优化任意矩阵,而是用 scale 和 rotation 构造:

Σ = R S S^T R^T

其中:

  • R:旋转矩阵。
  • S:由 scale 构成的对角矩阵。

4.3 opacity

opacity 控制高斯的不透明度。

渲染时多个高斯按深度排序或 tile 顺序进行 alpha blending。

4.4 color / SH

颜色通常用 spherical harmonics 表示,以支持视角相关外观,例如高光。

如果只用 RGB,视角变化时颜色表达能力较弱。

5. 3D Gaussian 的数学直觉

一个 3D Gaussian 可以写成:

G(x) = exp(-1/2 * (x - μ)^T Σ^-1 (x - μ))

含义:

  • 离中心μ越近,值越大。
  • 协方差Σ控制影响范围和方向。
  • 各向同性高斯像球。
  • 各向异性高斯像椭球。

3DGS 使用各向异性高斯,因为真实场景中的表面常常是片状、边缘状或细长结构。各向异性高斯比球状高斯更容易贴合表面。

6. 从 3D Gaussian 到 2D Splat

渲染时,3D 高斯会被投影到相机图像平面。

流程:

3D Gaussian in world -> world-to-camera -> perspective projection -> 2D Gaussian / ellipse on screen

由于透视投影是非线性的,实际会在高斯中心附近用一阶近似,把 3D 协方差变换成屏幕空间 2D 协方差。

直觉:

空间中的一个小椭球,从相机看过去,会变成屏幕上的一个椭圆 splat。

7. 3DGS 渲染流程

典型渲染流程:

输入相机内外参 -> 视锥裁剪,剔除不可见高斯 -> 将 3D Gaussians 投影成 2D splats -> 按 tile 分桶 -> 按深度排序或近似排序 -> alpha compositing -> 输出 RGB 图像

7.1 Alpha Compositing

从前到后混合颜色:

C = Σ T_i * α_i * c_i T_i = Π(1 - α_j), j < i

其中:

  • α_i:第 i 个高斯在当前像素的透明度贡献。
  • c_i:颜色。
  • T_i:到达第 i 个高斯前剩余透过率。

7.2 为什么快

3DGS 快的原因:

  • 显式高斯,不需要 MLP 逐点查询。
  • 不沿每条 ray 做大量采样。
  • 使用 GPU rasterization 思路。
  • tile-based splatting 提升并行效率。
  • 只处理对当前视角有贡献的高斯。

8. 3DGS 训练流程

训练目标:

让渲染图像尽可能接近真实训练图像。

典型训练循环:

读取 COLMAP 相机和稀疏点云 -> 初始化 3D Gaussians -> 随机选择一个训练相机 -> 从该相机视角渲染当前 Gaussians -> 与真实图片计算 loss -> 反向传播优化高斯参数 -> 周期性 densify / prune -> 输出最终 .ply 模型

8.1 常见优化参数

优化内容包括:

  • 高斯中心位置。
  • scale。
  • rotation。
  • opacity。
  • SH color coefficients。

通常不直接优化相机位姿,除非是某些扩展方法。

8.2 Loss

原始 3DGS 常见图像损失包含:

L1 loss SSIM-related loss

直觉:

  • L1 保证像素级颜色接近。
  • SSIM 强调结构相似性。

9. Densification 和 Pruning

3DGS 的一个关键点是训练过程中动态调整高斯数量。

9.1 为什么需要 densification

初始稀疏点云通常不够密,无法表示细节。

训练时如果某些区域误差大或梯度大,说明当前高斯表达能力不够,就需要增加高斯。

常见操作:

  • clone:复制高斯。
  • split:把一个大高斯拆成多个小高斯。

9.2 为什么需要 pruning

训练过程中有些高斯可能没用或有害:

  • opacity 很低。
  • 贡献很小。
  • 尺寸异常。
  • 形成漂浮噪声。

pruning 会删除这些高斯,控制模型规模和噪声。

9.3 直觉

densification 负责补细节; pruning 负责删垃圾。

两者交替进行,让场景表示逐渐变得紧凑且高质量。

10. 颜色表示:Spherical Harmonics

Spherical Harmonics,简称 SH,球谐函数,常用于表示方向相关的颜色。

为什么需要 SH:

同一个空间点,从不同方向看可能颜色不同,例如高光、反射、视角相关亮度变化。

简单 RGB 只能表示固定颜色。

SH 可以表示:

color(view_direction)

SH 阶数越高:

  • 表达能力越强。
  • 参数更多。
  • 训练更复杂。

原始 3DGS 会逐步增加 SH degree,让模型先学低频颜色,再学习更复杂的视角相关外观。

11. 相机内外参在 3DGS 中的作用

3DGS 强依赖相机参数。

11.1 内参

内参决定如何从相机坐标投影到像素:

fx, fy, cx, cy

如果内参错:

  • 高斯投影大小不对。
  • 位置对不齐。
  • 边缘和纹理发糊。
  • 训练 loss 难以下降。

11.2 外参

外参决定每张图片的相机位置和朝向。

训练时:

用第 i 张图片的外参渲染预测图 再和第 i 张真实图比较

如果外参错:

  • 真实图和渲染图不是同一个视角。
  • 高斯会被优化到错误位置。
  • 模型可能散掉或漂浮物很多。

11.3 COLMAP 约定

COLMAP 中images.txt/images.binqvec/tvec通常表示 world-to-camera:

X_cam = R * X_world + t

相机中心:

C = -R^T * t

这是 3DGS 数据排查中的高频点。

12. 3DGS 数据链路:图片到模型

典型自定义数据流程:

采集图片或视频抽帧 -> COLMAP SfM -> 得到相机内参、外参、稀疏点云 -> 图像去畸变 -> 3DGS 读取 COLMAP 数据 -> 训练 -> render.py 渲染 -> metrics.py 评估 -> viewer 查看结果

12.1 数据质量比调参更重要

好的输入通常比复杂调参更重要。

采集建议:

  • 相邻图片有足够重叠。
  • 围绕目标或沿路径平滑移动。
  • 避免运动模糊。
  • 避免纯白墙、玻璃、镜子、大面积水面。
  • 曝光尽量一致。
  • 不要频繁变焦。
  • 拍摄主体和背景最好有纹理。
  • 动态物体越少越好。

13. 环境安装与验证

官方实现依赖 CUDA GPU,训练通常需要 NVIDIA 显卡。

13.1 克隆仓库

gitclone https://github.com/graphdeco-inria/gaussian-splatting--recursivecdgaussian-splatting

注意--recursive,因为官方仓库包含子模块。

如果忘记加:

gitsubmodule update--init--recursive

13.2 创建 Conda 环境

官方仓库通常提供environment.yml

condaenvcreate--fileenvironment.yml conda activate gaussian_splatting

如果环境创建失败,常见原因:

  • CUDA/PyTorch 版本不匹配。
  • Visual Studio Build Tools 缺失。
  • 子模块没有拉取。
  • Windows 路径或编译环境问题。

13.3 验证 Python 和 CUDA

python -<<"PY" import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else "cpu") PY

13.4 安装 COLMAP 和 ImageMagick

处理自定义数据通常需要:

  • COLMAP:估计相机和稀疏点云。
  • ImageMagick:部分脚本用于图像缩放。

验证:

colmap-hmagick-version

有些系统中 ImageMagick 命令可能是:

convert-version

14. 实操一:跑通官方预训练模型

官方仓库提供预训练模型或示例数据时,可以先跑渲染和 viewer,确认环境没问题。

假设模型目录:

output/model_name/ point_cloud/ cameras.json cfg_args

渲染:

python render.py-moutput/model_name

查看输出:

output/model_name/train/ours_30000/renders/ output/model_name/test/ours_30000/renders/

如果官方 viewer 编译好了,可以启动实时查看器。不同平台 viewer 路径略有差异,按官方仓库 README 说明运行。

15. 实操二:训练官方示例或自定义场景

15.1 数据目录格式

常见 scene 目录:

scene/ input/ image_001.jpg image_002.jpg sparse/ 0/ cameras.bin images.bin points3D.bin images/

不同脚本会生成或要求不同目录。原始官方流程通常使用:

python convert.py-sscene

来调用 COLMAP 并整理数据。

15.2 使用 convert.py 准备数据

把原始图片放入:

scene/input/

运行:

python convert.py-sscene

它通常会完成:

  • COLMAP 特征提取。
  • 特征匹配。
  • 稀疏重建。
  • 去畸变。
  • 生成训练需要的图像目录和 sparse 模型。

如果你的机器没有 GPU 或 COLMAP GPU SIFT 不可用,可能需要查看convert.py -h或手动运行 COLMAP 并关闭 GPU:

--SiftExtraction.use_gpu0--SiftMatching.use_gpu0

15.3 开始训练

python train.py-sscene-moutput/scene

常用:

python train.py-sscene-moutput/scene--iterations30000

训练输出通常包含:

output/scene/ cameras.json cfg_args input.ply point_cloud/ iteration_7000/ point_cloud.ply iteration_30000/ point_cloud.ply

15.4 查看训练过程

训练时关注:

  • loss 是否下降。
  • 高斯数量是否增长到合理范围。
  • 是否出现 CUDA OOM。
  • 中间保存的 PLY 是否越来越合理。
  • viewer 中是否出现大量漂浮物。

16. 实操三:渲染和评估

16.1 渲染

python render.py-moutput/scene

指定迭代:

python render.py-moutput/scene--iteration30000

16.2 评估指标

python metrics.py-moutput/scene

常见指标:

  • PSNR:像素误差相关,越高越好。
  • SSIM:结构相似性,越高越好。
  • LPIPS:感知距离,越低越好。

注意:

指标高不一定视觉完美,指标低也不一定完全不可用。 最好结合渲染图、视频和新视角观察。

16.3 渲染视频

官方实现常基于相机集合渲染。如果要自由轨迹视频,可以:

  • 使用 viewer 录制。
  • 自己生成相机轨迹。
  • 读取训练相机位姿并插值。
  • 使用第三方工具或扩展脚本。

17. 实操四:自定义图片数据集准备

17.1 图片采集

推荐:

  • 图片数量:小物体 50 到 200 张,室内/大场景可更多。
  • 重叠率:相邻视角 60% 到 80%。
  • 相机运动:平滑移动,避免大跳变。
  • 焦距:尽量固定。
  • 分辨率:不要太低,太高会增加训练成本。

17.2 视频抽帧

ffmpeg-iinput.mp4-vffps=2scene/input/frame_%05d.jpg

如果运动快,可以提高 fps:

ffmpeg-iinput.mp4-vffps=5scene/input/frame_%05d.jpg

17.3 先跑 COLMAP 检查

训练 3DGS 前,建议先用 COLMAP GUI 或 CLI 看:

  • 注册了多少张图片。
  • 稀疏点云是否覆盖主体。
  • 相机轨迹是否合理。
  • 是否有明显错误匹配。

如果 COLMAP 都很差,3DGS 往往也不会好。

17.4 手动 COLMAP 流程

mkdir-pscene/distorted/sparse colmap feature_extractor\--database_pathscene/distorted/database.db\--image_pathscene/input colmap exhaustive_matcher\--database_pathscene/distorted/database.db colmap mapper\--database_pathscene/distorted/database.db\--image_pathscene/input\--output_pathscene/distorted/sparse colmap image_undistorter\--image_pathscene/input\--input_pathscene/distorted/sparse/0\--output_pathscene\--output_typeCOLMAP

具体目录和参数要和你使用的 3DGS 实现匹配。

18. 实操五:检查 COLMAP 输出

18.1 转文本

mkdir-pscene/sparse_txt colmap model_converter\--input_pathscene/sparse/0\--output_pathscene/sparse_txt\--output_typeTXT

检查:

cameras.txt images.txt points3D.txt

18.2 Python 读取相机中心

保存为check_colmap_cameras.py

frompathlibimportPathimportnumpyasnpdefqvec_to_rotmat(qvec):qw,qx,qy,qz=qvecreturnnp.array([[1-2*qy*qy-2*qz*qz,2*qx*qy-2*qz*qw,2*qx*qz+2*qy*qw],[2*qx*qy+2*qz*qw,1-2*qx*qx-2*qz*qz,2*qy*qz-2*qx*qw],[2*qx*qz-2*qy*qw,2*qy*qz+2*qx*qw,1-2*qx*qx-2*qy*qy],])defmain():images_txt=Path("scene/sparse_txt/images.txt")lines=images_txt.read_text(encoding="utf-8").splitlines()centers=[]names=[]i=0whilei<len(lines):line=lines[i].strip()ifnotlineorline.startswith("#"):i+=1continueparts=line.split()qvec=np.array([float(x)forxinparts[1:5]])tvec=np.array([float(x)forxinparts[5:8]])name=parts[9]R=qvec_to_rotmat(qvec)C=-R.T @ tvec centers.append(C)names.append(name)i+=2centers=np.array(centers)print("registered images:",len(centers))print("center min:",centers.min(axis=0))print("center max:",centers.max(axis=0))print("first 5:")forname,centerinzip(names[:5],centers[:5]):print(name,center)if__name__=="__main__":main()

重点:

COLMAP 的 tvec 不是相机中心。 相机中心 C = -R^T t。

19. 3DGS 输出文件和 PLY 结构

训练后的核心模型通常是:

point_cloud.ply

里面保存的是高斯参数,不是普通点云。

常见字段可能包括:

x, y, z nx, ny, nz f_dc_* f_rest_* opacity scale_* rot_*

含义:

  • x, y, z:高斯中心。
  • f_dc_*:SH 的 DC 颜色分量。
  • f_rest_*:更高阶 SH 系数。
  • opacity:不透明度参数。
  • scale_*:尺度参数。
  • rot_*:旋转参数,常用四元数。

不要把它简单当作只有 RGB 的普通点云。

20. 常用训练参数和调参经验

不同实现参数可能略有差异,以下以官方实现思路为主。

20.1 iterations

训练迭代次数。

常见:

--iterations30000

小场景可少一些,大场景或复杂纹理可更多。

20.2 resolution

控制训练图像分辨率。

如果显存不足:

python train.py-sscene-moutput/scene-r2

或使用更低分辨率图片。

20.3 densification 相关

影响高斯增长。

现象:

  • 高斯太少:细节不够。
  • 高斯太多:显存大、渲染慢、可能噪声多。

20.4 opacity reset

训练中周期性重置 opacity,有助于控制高斯透明度和 densification。

如果不了解原理,初学不建议乱改。

20.5 SH degree

SH 阶数越高,视角相关颜色表达越强。

但过高也可能增加训练难度和过拟合。

20.6 白背景

如果数据是白底物体,可能需要设置白背景相关选项,具体看实现:

--white_background

否则背景颜色假设不一致会影响训练。

21. 常见问题排查

21.1 convert.py 失败

检查:

  • COLMAP 是否安装并在 PATH 中。
  • ImageMagick 是否可用。
  • 图片是否放在scene/input
  • 路径是否有特殊字符。
  • COLMAP GPU 是否可用。

处理:

  • 手动运行 COLMAP 看具体错误。
  • 关闭 SIFT GPU。
  • 删除模糊或异常图片。
  • 换英文路径。

21.2 训练 CUDA OOM

处理:

  • 降低图像分辨率。
  • 使用-r 2或更低分辨率。
  • 减少训练图片数量。
  • 调整 densification 参数。
  • 使用显存更大的 GPU。

21.3 结果一团糊

优先检查:

  • COLMAP 位姿是否正确。
  • 注册图片数量是否足够。
  • 图像是否去畸变。
  • 图片和 sparse 模型是否对应。
  • 训练图像是否模糊。
  • 相机是否有大幅曝光变化。

21.4 漂浮物很多

可能原因:

  • 动态物体。
  • 反光、玻璃、水面。
  • COLMAP 点云噪声。
  • 视角覆盖不足。
  • densification 产生噪声高斯。

处理:

  • 清理输入图片。
  • 删除动态物体严重图片。
  • 增加视角覆盖。
  • 调整 pruning/densification。

21.5 新视角露洞

原因:

  • 训练视角没有覆盖该区域。
  • 高斯不够密。
  • 背面没有被拍到。
  • 场景被遮挡区域没有观测。

解决:

  • 补拍视角。
  • 增加数据覆盖。
  • 延长训练或调整 densification。

21.6 颜色闪烁或高光异常

可能原因:

  • 曝光不一致。
  • 白平衡变化。
  • 反光材质。
  • SH 表达或训练不稳定。

处理:

  • 固定曝光和白平衡采集。
  • 清洗异常图片。
  • 尝试降低复杂反光区域影响。

21.7 相机路径方向反了

可能原因:

  • W2C 和 C2W 混用。
  • OpenCV/OpenGL 坐标系转换错误。
  • 自定义渲染轨迹矩阵方向错。

检查:

COLMAP qvec/tvec 是 world-to-camera。 如果需要 camera-to-world,要取逆。

22. 进阶方向

3DGS 之后有很多扩展方向:

  • 动态 3DGS:处理动态场景。
  • 4D Gaussian Splatting:加入时间维度。
  • 可编辑 3DGS:删除、分割、语义编辑。
  • 压缩 3DGS:降低模型体积。
  • SLAM + 3DGS:在线建图和渲染。
  • COLMAP-free 3DGS:弱化或移除 COLMAP 依赖。
  • Mesh extraction:从高斯提取表面。
  • 语义 3DGS:给高斯附加语义标签。
  • Avatar / human Gaussian:人体和头像建模。

学习路线建议:

先跑通官方静态场景 -> 理解 COLMAP 和相机参数 -> 理解 Gaussian 参数和渲染 -> 学习动态/压缩/语义等扩展

23. 面试常问问题

23.1 3DGS 是什么?

3DGS 是一种显式三维场景表示方法,用大量可优化的 3D 高斯椭球表示场景,并通过高效 splatting 渲染实现高质量实时新视角合成。

23.2 3DGS 和 NeRF 有什么区别?

NeRF 使用隐式 MLP 表示辐射场,渲染时沿射线采样并查询网络;3DGS 使用显式 3D Gaussians,渲染时把高斯投影到屏幕并 alpha blending,因此训练和渲染通常更快。

23.3 一个 3D Gaussian 包含哪些参数?

通常包含中心位置、尺度、旋转、透明度和颜色特征。颜色常用 spherical harmonics 表示,以支持视角相关颜色。

23.4 为什么 3DGS 使用各向异性高斯?

各向异性高斯可以形成不同方向和尺度的椭球,更容易贴合表面、边缘和细长结构,表达能力比球状高斯更强。

23.5 3DGS 中 covariance 如何保证正定?

通常不直接优化任意协方差矩阵,而是用 scale 和 rotation 构造协方差,例如Σ = R S S^T R^T,这样可以保证正定。

23.6 3DGS 渲染流程是什么?

给定相机参数后,把 3D 高斯变换到相机视角,投影成屏幕空间 2D splats,按 tile 分组并按深度进行 alpha compositing,最终得到渲染图像。

23.7 3DGS 为什么渲染快?

因为它是显式表示,不需要 MLP 查询,也不需要沿每条 ray 大量采样;它使用 GPU 友好的 splatting/rasterization 流程,只处理对当前视角有贡献的高斯。

23.8 3DGS 为什么需要 COLMAP?

COLMAP 提供相机内外参和稀疏点云。相机参数用于训练视角监督,稀疏点云用于初始化高斯位置。

23.9 3DGS 一定需要 COLMAP 吗?

不一定。只要能提供准确相机内外参和合理初始点云,也可以来自 SLAM、仿真、深度相机或其他 SfM 系统。但 COLMAP 是最常见流程。

23.10 相机内参在 3DGS 中有什么作用?

内参决定高斯从相机坐标投影到像素平面的方式,包括焦距和主点。内参错误会导致投影错位和训练质量下降。

23.11 相机外参在 3DGS 中有什么作用?

外参决定每张训练图像的相机位置和朝向。训练时会按对应外参渲染图像并与真实图像计算损失。

23.12 3DGS 是否优化相机位姿?

原始常见流程通常固定 COLMAP 相机位姿,主要优化高斯参数。一些扩展方法会联合优化相机位姿。

23.13 Densification 是什么?

Densification 是训练过程中根据梯度、误差或尺度等信号增加高斯数量的过程,用于补充细节和提高表达能力。

23.14 Pruning 是什么?

Pruning 是删除无效或低贡献高斯的过程,例如 opacity 太低、尺寸异常或贡献很小的高斯,以减少噪声和模型冗余。

23.15 3DGS 中 opacity 有什么作用?

opacity 控制高斯的不透明度。渲染时多个高斯会按透明度和深度进行 alpha blending。

23.16 Spherical Harmonics 在 3DGS 中有什么用?

SH 用于表示视角相关颜色,让同一个高斯在不同观察方向下能呈现不同颜色或亮度,增强高光和反射等外观表达。

23.17 3DGS 的输出 PLY 是普通点云吗?

不是。3DGS 的 PLY 保存的是高斯参数,包括位置、SH 颜色、opacity、scale、rotation 等,不只是普通 xyz/rgb 点云。

23.18 3DGS 常见伪影有哪些?

常见伪影包括漂浮物、模糊、露洞、颜色闪烁、视角错位、边缘破碎和透明云雾状噪声。

23.19 3DGS 结果差优先排查什么?

优先排查 COLMAP 位姿质量、注册图片数量、稀疏点云覆盖、图像是否去畸变、图片和相机参数是否对应、输入图片是否模糊或动态物体过多。

23.20 3DGS 和 Mesh 哪个更适合工程部署?

取决于任务。3DGS 更适合真实感新视角渲染;Mesh 更适合物理交互、碰撞检测、传统引擎资产和几何编辑。

23.21 3DGS 如何处理动态场景?

原始 3DGS 主要面向静态场景。动态场景需要扩展方法,例如给高斯加入时间维度、形变场、动态分解或 4D Gaussian 表示。

23.22 3DGS 为什么可能模型很大?

因为高质量场景可能包含数十万到数百万个高斯,每个高斯又包含位置、尺度、旋转、opacity 和 SH 系数,参数量较大。

23.23 如何压缩 3DGS?

常见方法包括 pruning、量化、低阶 SH、聚类、码本、哈希编码、重要性筛选和专门的压缩高斯表示。

23.24 面试中如何概括 3DGS 项目经验?

可以这样回答:

我用 3DGS 做过多视角场景的新视角合成。 流程是先采集有足够重叠的图片,用 COLMAP 恢复相机内外参和稀疏点云, 然后用稀疏点初始化 3D Gaussians,训练时随机选择相机视角进行可微 splatting 渲染, 渲染图和真实图通过 L1/SSIM 类损失优化高斯的位置、尺度、旋转、透明度和 SH 颜色。 训练过程中通过 densification 补细节,通过 pruning 删除低贡献高斯。 排查质量问题时我会优先看 COLMAP 注册数量、相机轨迹、点云覆盖、去畸变和输入图片质量。

24. 练习任务

24.1 跑通官方仓库

完成:

git clone --recursive conda env create train.py render.py metrics.py

记录训练时间、显存占用和输出模型大小。

24.2 自己采集一个小物体

拍 80 到 150 张图片,要求:

  • 图片清晰。
  • 相邻视角有重叠。
  • 不变焦。
  • 背景有一定纹理。

convert.pytrain.py

24.3 检查 COLMAP 输出

把 sparse 模型转成 txt,查看:

  • cameras.txt
  • images.txt
  • points3D.txt

计算相机中心并检查轨迹是否合理。

24.4 调整分辨率训练

分别用原图、-r 2-r 4训练,比较:

  • 训练速度。
  • 显存占用。
  • 渲染质量。
  • 模型大小。

24.5 观察 densification

记录不同 iteration 的 PLY:

iteration_7000 iteration_30000

比较高斯数量、视觉效果和漂浮物。

24.6 和 NeRF 做对比

选择同一组图像,用一个 NeRF 实现和 3DGS 分别训练,比较:

  • 训练时间。
  • 推理速度。
  • 新视角质量。
  • 模型大小。
  • 几何可编辑性。

25. 参考资料

  • 3D Gaussian Splatting 官方项目:https://github.com/graphdeco-inria/gaussian-splatting
  • 3D Gaussian Splatting 论文页面:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
  • 论文:3D Gaussian Splatting for Real-Time Radiance Field Rendering:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf
  • COLMAP 官方文档:https://colmap.github.io/
  • COLMAP Output Format:https://colmap.github.io/format.html
  • OpenCV 相机标定:https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html
  • NeRF 原论文:https://www.matthewtancik.com/nerf
  • Inria 介绍文章:https://www.inria.fr/en/creating-stunning-real-time-3d-scenes-breakthrough-3d-gaussian-splatting
http://www.gsyq.cn/news/1629540.html

相关文章:

  • WeChatMsg:三步打造你的微信聊天记录数字档案馆,永久珍藏每一段对话
  • 基于MP8859和PIC18的I2C可调降压电源设计
  • 硬件定时器队列:高精度网络管理的核心技术解析
  • 每周AI新动态:GLM 5.2与OpenAI开源模型发布
  • 跨平台Windows启动盘制作:macOS环境下FAT32限制与WIM文件分割的技术解决方案
  • 华三ACL单向TCP互通组网-通过Established状态回包实现
  • Text-to-CAD:用语言重新定义三维设计范式
  • 如何快速配置ViGEmBus虚拟手柄驱动:5个高效技巧指南
  • Context Engineering 2026年中实战:Prompt、记忆、RAG、工具与评估五位一体
  • Go 服务优雅停机:K8s 发 SIGTERM 后不是立刻消失
  • 大模型轻量化选型避坑指南:效果与成本的真实评估方法
  • GalTransl:用AI技术彻底革新Galgame汉化体验的完整指南
  • 慢速HTTP攻击防御实战与LiqunKit工具深度解析
  • Si4732与PIC18F86J11构建高保真收音系统
  • 三步掌握WidescreenFixesPack:让经典游戏在宽屏显示器焕发新生
  • 高斯溅射渲染引擎gsplat:从零构建高性能3D重建开发环境
  • 服务治理——微服务的“交通管理“
  • palera1n越狱深度解析:解锁iOS设备的终极技术方案
  • 5分钟实现Windows毛玻璃特效:DWMBlurGlass美化指南
  • 运营不会写代码,也能用 Codex 做报表自动化和小工具吗?
  • 【lucene】codecs各格式的学习顺序
  • 零失败AI图片生成方案:Stable Diffusion实战指南
  • PCF8591与PIC18F2682的信号转换系统设计与优化
  • NoFences终极指南:免费开源桌面分区工具快速整理Windows桌面
  • AI编程不是替代程序员,而是重写职业契约(附Gartner认证能力矩阵与迁移路线图)
  • 真实场景下的机器学习Pipeline实战指南:从业务理解到模型上线
  • Jmeter压测实战:Shell脚本实现Linux服务器性能实时监控与自动化集成
  • 【信息科学与工程学】计算机科学与自动化——第五十七篇 计算性与不可计算性01
  • IDM激活脚本终极指南:永久解锁下载神器,告别30天试用限制
  • Potrace完全指南:如何将位图完美转换为矢量图形