Master Complex Domain 3dgs
系统化掌握 3D Gaussian Splatting 工作流
🎯 工作流概览
第0阶段 第1阶段 第2-3阶段 第4阶段 第5-6阶段
目标锚定 压缩编码 传输+解调 破坏测试 校验固化
↓ ↓ ↓ ↓ ↓
[问题驱动] → [知识索引] → [理解机制] → [找边界] → [长期记忆]
📋 执行流程
当前状态
领域: 3D Gaussian Splatting (3DGS) 目标: 理解底层原理(从输入图像到3D场景表示的完整机制) 阶段: 从第0阶段开始
第0阶段:目标锚定
核心任务
在开始学习前,明确问题驱动的锚点。
引导问题
1. 三问法(请回答以下问题)
你要解决什么具体问题?
- 不是"了解3DGS",而是"能用3DGS做___"
- 例如:实现从2D图像快速重建3D场景 / 优化3DGS渲染速度 / 理解可微渲染管线
3周后,你要能完成哪个可演示任务?
- 示例:从头实现一个简化版3DGS渲染器 / 调试训练优化过程 / 对比3DGS与NeRF的性能
3DGS领域80%场景下,最核心的20%是什么?
- 提示:高斯投影、协方差变换、Alpha Blending、可微优化
2. 建立"问题-知识"映射
请列出你当前面临的具体问题场景:
| 问题场景 | 需要的概念 | 优先级 |
|---|---|---|
| 示例:为什么用高斯而不用点云? | 连续性、可微性、高效渲染 | P0 |
| 示例:如何从2D图优化3D高斯? | 可微渲染、梯度反传 | P0 |
| 示例:为什么3DGS比NeRF快? | 光栅化 vs 体渲染 | P0 |
3. 设定"止损失限"
- 时间预算:____ 小时
- 深度边界:达到"能实现/调优"即停,不追求"推导所有数学公式"
🎯 本阶段产出
- 一张问题驱动清单(最多3个核心问题)
- 一张ROI雷达图(时间/深度/覆盖度)
第1阶段:压缩编码
核心任务
建立知识索引,但强制压缩,避免信息过载。
SOP动作
1. 三书目录对比法
推荐资源(论文/代码/教程):
必读论文:
- 3D Gaussian Splatting for Real-Time Radiance Field Rendering (SIGGRAPH 2023)
- 原始论文,包含所有核心原理
代码实现: 2. official-3dgs-repo (Inria NVIDIA)
教程/分析: 3. 3D Gaussian Splatting Explained (各种博客/视频)
- 推荐搜索:kerbl.bernhard@gmail.com 的技术报告
用对齐章节,标记重合度:
- 重合3次 → 【核心支柱】(必须掌握)
- 重合2次 → 【重要概念】(理解即可)
- 重合1次 → 【边缘知识】(用到再查)
核心支柱预判:
- 3D高斯表示 (位置、协方差、不透明度、球谐函数)
- 可微光栅化 (投影、排序、Alpha Blending、梯度计算)
- 自适应优化 (密集化、剪枝、重置)
2. 建立"黑话词典"(严格限制30个词)
每个词只记3样:
术语:3D Gaussian
一句话定义:用椭球体(由位置+协方差矩阵定义)表示3D空间中的体素
典型场景:表示场景中的光辐射分布
它不是什么:不是简单的点云(没有连续性),不是Mesh(没有显式的面)
术语:Covariance Matrix
一句话定义:3x3矩阵,控制高斯的形状(大小、方向、拉伸)
典型场景:让高斯适应场景的几何结构
它不是什么:不是对角矩阵(可以有旋转)
术语:Spherical Harmonics (SH)
一句话定义:用球面基函数编码视角相关的颜色
典型场景:表示高光、金属反射等各向异性效果
它不是什么:不是RGB三通道(是视角相关的)
术语:Splatting
一句话定义:将3D高斯投影到2D屏幕并累加颜色
典型场景:渲染管线中的核心步骤
它不是什么:不是简单的光栅化(需要排序和Alpha混合)
术语:Differentiable Rasterization
一句话定义:可计算梯度的光栅化,允许从2D损失优化3D参数
典型场景:训练时的反向传播
它不是什么:不是传统GPU光栅化(没有梯度)
术语:Alpha Blending
一句话定义:按深度排序后,从前到后累加颜色(类似透明物体渲染)
典型场景:合成最终像素颜色
它不是什么:不是简单的Z-buffer(需要正确的前后关系)
术语:Densification
一句话定义:根据梯度统计动态增加/删除高斯
典型场景:优化初期快速增加高斯密度
它不是什么:不是固定数量的点云
术语:PSNR / SSIM / LPIPS
一句话定义:评估渲染图像与真实图像的相似度指标
典型场景:训练时的损失函数
它不是什么:不是直接优化视觉质量的指标(PSNR高不一定好看)
3. 绘制"知识地形图"
[高价值+高频] → 核心区(深度学习)
│
[低价值+高频] ──┼── [高价值+低频] → 深入区(理解原理)
│
[低价值+低频] → 查阅区(用到了再搜)
3D Gaussian Splatting 知识地形图:
核心区(高价值+高频) - 必须深度掌握:
- 3D高斯的参数化(位置、协方差、不透明度、SH系数)
- 协方差的视角变换(世界空间 → 屏幕空间)
- 可微光栅化管线(投影、排序、累加、梯度计算)
- 自适应优化策略(密集化、剪枝、重置)
深入区(高价值+低频) - 理解原理即可:
- 球谐函数的数学推导
- 梯度计算的链式法则
- 快速不同iable rasterization算法细节
- 与NeRF、Mip-Splatting等方法的对比
查阅区(低价值+低频) - 用到再搜:
- 特定数据集的准备细节
- CUDA实现的优化技巧
- 不同GPU的渲染速度benchmark
- 各种后处理方法
4. 冗余检查
每学完一个子章节,问自己:
- 这3个概念是否可以合并为1个?
- 这个例子是否可以用更简单的替换?
- 强制输出:用1句话+1张图总结
🎯 本阶段产出
- 压缩版知识地图(A4纸1页)
- 30词黑话词典(每个词≤30字)
- 3个核心支柱(高斯表示 + 可微光栅化 + 自适应优化)
第2阶段:建立信号通路
核心任务
打通"I→O"的主流程,不带任何异常处理。
SOP动作
1. 定义最小I/O系统
输入(Input) 输出(Output)
─────────────────────────────────────────────────────────
多视角2D图像 + 相机参数 → 3D高斯集合 + 渲染图像
(Colmap/Neuralangelo) (优化后的场景表示)
2. 跑通Happy Path(Hello World级)
推荐使用官方实现:
# 1. 环境准备
git clone https://github.com/nerfstudio-project/gsplat.git
cd gsplat
pip install -e .
# 2. 准备数据(使用小数据集)
wget https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/evaluation/data/tandt_db.zip
unzip tandt_db.zip
# 3. 训练
python train.py -s data/tandt/train -m output/tandt
# 4. 渲染/查看
python render.py -m output/tandt -s data/tandt/train
记录每个步骤的状态变化:
Step0: 数据准备 → 状态A(多视角图像+相机位姿)
Step1: 初始化高斯(从SfM点云) → 状态B(初始3D高斯集合)
Step2: 训练循环(迭代优化) → 状态C(逐步优化的高斯参数)
- 每次迭代:渲染 → 计算损失 → 反向传播 → 更新高斯 → 自适应调整
Step3: 渲染输出 → 状态D(新视角的渲染图像)
3. 绘制"主流程数据流图"
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 输入数据 │ → │ 初始化高斯 │ → │ 训练循环 │
│ (图像+相机) │ │ (SfM点云) │ │ (迭代优化) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
Colmap格式 点云→高斯 可微渲染
↓
┌─────────────┐ ┌─────────────┐
│ 自适应控制 │ → │ 渲染结果 │
│ (密集/剪枝) │ │ (新视角图) │
└─────────────┘ └─────────────┘
训练循环内部流程:
┌─────────────────────────────────────────────────────┐
│ 单次训练迭代 │
├─────────────────────────────────────────────────────┤
│ │
│ 3D高斯集合 │
│ ↓ │
│ [投影] 世界坐标 → 屏幕坐标(协方差变换) │
│ ↓ │
│ [排序] 按深度从后往前排序 │
│ ↓ │
│ [光栅化] Alpha Blending累加颜色 │
│ ↓ │
│ 渲染图像 │
│ ↓ │
│ [损失] L1 + SSIM对比真实图像 │
│ ↓ │
│ [反向] 计算梯度 → 更新高斯参数 │
│ ↓ │
│ [自适应] 密集化/剪枝/重置 │
│ ↓ │
│ 更新后的3D高斯集合 │
│ │
└─────────────────────────────────────────────────────┘
4. 建立"观测点"
在流程图的每个节点标记:
观测点清单:
初始化阶段:
- 观测:高斯数量、位置分布、初始大小
- 工具:可视化点云、打印协方差统计
投影阶段:
- 观测:屏幕空间的高斯形状、大小
- 工具:可视化2D高斯椭圆
光栅化阶段:
- 观测:每个像素的累加过程、Alpha值分布
- 工具:TensorBoard监控中间渲染结果
损失计算:
- 观测:PSNR/SSIM曲线、梯度模长
- 工具:记录训练日志
自适应阶段:
- 观测:高斯数量变化、梯度统计
- 工具:打印密集化/剪枝统计
🎯 本阶段产出
- 主流程数据流图(1张完整流程图)
- Hello World级Demo(官方代码成功运行)
- 观测点清单(每个节点的观测方法)
第3阶段:解调分析
核心任务
打开黑盒,理解核心机制,但继续压缩。
SOP动作
1. 寻找"元模型"(第一性原理)
对3DGS的核心概念,强迫自己问3次"为什么":
为什么用高斯?
→ 因为高斯是连续可微的,且易于渲染(投影后仍是2D高斯)
→ 为什么需要连续可微?
→ 因为要反向传播梯度,从2D图像优化3D参数
→ 为什么用高斯而不是其他可微表示?
→ 元模型:高斯在**计算效率(可解析投影)**和**表达能力(任意形状)**之间取得了最佳平衡
为什么需要球谐函数(SH)?
→ 因为颜色是视角相关的(不同角度看同一物体颜色不同)
→ 为什么不能直接用RGB?
→ 因为RGB只能表示视角无关的颜色,无法表示高光、反射
→ 为什么用SH而不是其他表示?
→ 元模型:SH是**球面上的正交基**,能高效编码任意视角相关的信号,且易于求导
为什么用Alpha Blending而不是体渲染?
→ 因为体渲染需要沿射线积分,计算量大
→ 为什么不能直接用最前层高斯?
→ 因为半透明效果、远处的物体需要透过近处物体
→ 为什么用从前到后的累加?
→ 元模型:Alpha Blending模拟了**光线的物理传播**(被前面物体吸收+透过),且计算高效
2. 建立"最小可行性类比"
| 核心概念 | 生活类比 | 验证(能说通吗) |
|---|---|---|
| 3D高斯 | 用彩色棉花糖搭建场景(每个棉花糖可以拉伸、旋转、有透明度) | ✅ 棉花糖可以任意变形,叠加产生混合效果 |
| 协方差变换 | 从斜上方看圆形盘子会变成椭圆 | ✅ 视角变换改变形状 |
| Alpha Blending | 画水彩颜料,后画的颜料覆盖在先画的上面 | ✅ 按顺序累加,透明度影响效果 |
| 梯度反传 | 根据最终画作质量,告诉画家"这里应该多画/少画" | ✅ 从输出误差反馈到输入调整 |
| 密集化 | 在画得不好的地方多添几笔,在多余的地方擦掉 | ✅ 根据需要动态增减 |
| 球谐函数 | 根据观察角度改变颜色的变色龙皮肤 | ✅ 视角相关的颜色变化 |
3. 追问"魔法"(De-magic)
指着流程图的每个节点问:
[初始化魔法]:
- “SfM点云是怎么变成高斯的?”
- 解答:每个点 → 一个高斯(中心=点位置,初始大小=启发式,初始颜色=点颜色)
[投影魔法]:
- “3D协方差怎么变成2D协方差?”
- 解答:Σ_view = J^T Σ_world J(J是投影变换的雅可比矩阵)
- 如果你觉得"自动完成",那是盲区!手动推导一遍!
[光栅化魔法]:
- “到底怎么累加颜色的?”
- 解答:对每个像素,收集所有覆盖它的高斯,按深度排序,从前到后累加:
color = 0 alpha = 0 for gaussian in sorted_gaussians: c = gaussian.color a = gaussian.alpha * gaussian_2d(x, y) color = color + (1 - alpha) * a * c alpha = alpha + (1 - alpha) * a
- 解答:对每个像素,收集所有覆盖它的高斯,按深度排序,从前到后累加:
[梯度魔法]:
- “损失怎么反传到3D高斯的?”
- 解答:链式法则 → dL/dΣ → dL/d位置 → 更新高斯参数
[自适应魔法]:
- “怎么知道哪里需要增加高斯?”
- 解答:统计梯度大小,梯度大的区域说明当前高斯不够,需要密集化
4. 建立"概念依赖树"
[3D Gaussian Splatting]
│
┌─────────────┼─────────────┐
│ │ │
[高斯表示] [可微渲染] [自适应优化]
│ │ │
│ ┌────┴────┐ │
[SfM] [投影] [光栅化] [密集化]
│ │ │ │
点云 [协方差] [Alpha Blending] [剪枝]
变换 排序+累加 重置
必须掌握的前置知识:
- 线性代数:矩阵乘法、协方差矩阵
- 多视图几何:相机投影、世界坐标 vs 屏幕坐标
- 计算机图形学:光栅化、Alpha Blending
- 优化理论:梯度下降、反向传播
🎯 本阶段产出
- 3个元模型(为什么用高斯/为什么用SH/为什么用Alpha Blending)
- 5个关键类比(棉花糖/盘子/水彩/变色龙等)
- 概念依赖树(修剪版,只保留主干)
- “魔法"消除清单(每个黑盒步骤的手动推导)
第4阶段:破坏测试与边界探索 ⭐
核心任务
通过破坏性测试,找到系统的真实边界和失效场景。
SOP动作
1. 建立异常场景矩阵
正常场景 非正常场景 极端场景
──────────────────────────────────────────────────────────
输入层 多视角图像 单视角/视角缺失 图像模糊/运动模糊
已知相机参数 相机位姿错误 极端光照变化
高斯层 合理初始化 随机初始化 空白初始化
正常训练 固定高斯数量 数量爆炸/塌陷
渲染层 标准视角 极端视角(仰视/俯视) 远离训练视角
优化层 正常收敛 不收敛/振荡 过拟合
2. 执行"愚蠢破坏流程”
Level 1:单点破坏
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 输入 │ → │ 训练 │ → │ 输出 │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
[破坏] [破坏] [破坏]
逐个节点破坏,观察现象:
[输入层破坏]:
- 输入空白图像:能训练吗?高斯会如何?
- 预期:损失不下降,高斯保持初始化状态
- 输入单视角:能重建3D吗?
- 预期:严重过拟合,只能在训练视角渲染,新视角崩溃
- 相机位姿错误:平移/旋转错误10度,会发生什么?
- 预期:3D高斯拉伸变形,渲染模糊
[高斯层破坏]:
- 初始化为空(0个高斯):
- 预期:密集化策略会逐步增加,但可能收敛极慢
- 初始化为随机位置:
- 预期:训练时间长,可能收敛到局部最优
- 固定高斯数量(禁用密集化/剪枝):
- 预期:质量下降,细节丢失
[渲染层破坏]:
- 禁用排序(随机顺序):
- 预期:渲染完全错误(Alpha Blending依赖顺序)
- 固定协方差为单位矩阵(不可变形):
- 预期:渲染质量大幅下降(无法适应场景几何)
[优化层破坏]:
- 学习率过大(10x):
- 预期:损失振荡,高斯爆炸/消失
- 学习率过小(0.1x):
- 预期:收敛极慢
- 禁用自适应策略:
- 预期:需要在初始化时提供足够多的点云
Level 2:组合破坏
- [单视角输入] + [大学习率] = ?
- 预期:快速过拟合到单视角
- [模糊输入] + [固定高斯数] = ?
- 预期:无法恢复细节,渲染模糊
- [相机位姿误差] + [视角外推] = ?
- 预期:几何变形严重
Level 3:压力破坏
- 输入图像数量扩大10倍:
- 预期:训练时间线性增加,质量提升但边际收益递减
- 分辨率扩大4倍:
- 预期:显存爆炸,速度下降
- 训练时间压缩(强制1000次迭代):
- 预期:质量下降,高斯分布不均匀
- 场景复杂度提升(植被/毛发):
- 预期:需要更多高斯,可能出现artifacts
3. 反向推理检查表
| 异常场景 | 观察现象 | 根本原因 | 应对策略 |
|---|---|---|---|
| 单视角输入 | 新视角渲染崩溃 | 缺乏多视图几何约束 | 使用先验/正则化 |
| 学习率过大 | 损失振荡 | 梯度步长超出稳定区域 | 降低学习率/梯度裁剪 |
| 禁用排序 | 渲染错误 | Alpha Blending违反物理顺序 | 必须排序 |
| 固定协方差 | 细节丢失 | 无法适应几何 | 使用可学习协方差 |
| 极端视角 | 渲染模糊 | 训练数据未覆盖 | 增加训练视角/正则化 |
4. 建立"负面知识库"
概念:3D Gaussian Splatting
何时不用它:
- 需要严格的几何一致性(用Mesh/NeRF)
- 场景极大(城市级)→ 高斯数量爆炸
- 需要物理精确的反射/折射(用路径追踪)
- 动态场景(需要时序高斯)
典型反模式:
- 用单视角图像重建3D(几何丢失)
- 期望Mesh一样的拓扑(高斯没有面)
- 忽略相机标定(位姿错误会破坏重建)
5. Trade-off竞品对比
| 场景特征 | 3DGS | NeRF | Mesh | 选择 |
|---|---|---|---|---|
| 实时渲染 | ✅ 60fps+ | ❌ <1fps | ✅ | 3DGS |
| 训练速度 | ✅ 快 | ❌ 慢 | N/A | 3DGS |
| 几何质量 | ⚠️ 无拓扑 | ⚠️ 隐式 | ✅ 精确 | Mesh |
| 视角质量 | ✅ 高 | ✅ 高 | ⚠️ 需要贴图 | 3DGS/NeRF |
| 内存占用 | ⚠️ 大 | ⚠️ 大 | ✅ 小 | Mesh |
| 可编辑性 | ⚠️ 难 | ❌ 难 | ✅ 易 | Mesh |
核心追问:
- “什么情况下,我绝对不应该用3DGS?”
- 需要精确几何(CAD、工程仿真)
- 需要拓扑编辑(动画绑定)
- 场景极大且内存受限
🎯 本阶段产出
- 异常场景矩阵(至少覆盖9个场景)
- 3级破坏测试报告(每个Level记录现象+根因)
- 负面知识库(3DGS的3个"不用"场景)
- Trade-off决策树(3DGS vs NeRF vs Mesh)
第5阶段:校验与对齐
核心任务
通过输出倒逼输入,检验真实掌握程度。
SOP动作
1. 费曼技巧(严格版)
Step 1:给大一新生讲
- 禁止使用任何专业术语
- 必须用第3阶段建立的类比
- 如果卡住,标记卡点,回到对应阶段补课
示例(用棉花糖类比):
“想象你有一堆透明的彩色棉花糖,每个棉花糖可以被拉伸、旋转,也可以调整透明度。现在你要用这些棉花糖搭建一个场景的3D模型。你从不同角度拍照,然后根据照片调整棉花糖的位置、形状、颜色,直到从任何角度看,棉花糖堆成的样子都和真实照片一样。这就是3D Gaussian Splatting。”
Step 2:5岁挑战
- 能否用"画画/搭积木"解释?
示例:
“就像画画一样,你先在大画布上铺很多小色块,然后看着照片调整每个色块的位置和颜色。不同的是,这里的色块是3D的,可以从任何角度看。”
2. 建立"校验点系统"
层级1:能复述(语义层)
- 能用1句话定义3DGS
“用可优化的3D高斯集合表示场景,通过可微渲染从多视角图像学习”
- 能画出主流程图
- 能说出3个典型场景
“NeRF实时化、新视角合成、3D重建”
层级2:能应用(操作层)
- 能解决第0阶段设定的3个问题
- 能预测"如果我改动X参数,会发生什么"
“增大学习率 → 收敛加快但可能振荡”
“禁用密集化 → 细节丢失”
- 能独立搭建Hello World级Demo
层级3:能调试(推理层)
- 能解释异常现象的根因
“新视角渲染模糊 → 训练视角覆盖不足 / 高斯过拟合”
“训练不收敛 → 学习率过大 / 相机位姿错误”
- 能提出改进方案
“加入正则化约束 / 使用自适应学习率 / 数据增强”
- 能对比不同方案的Trade-off
“3DGS快但内存大,NeRF慢但质量高”
3. 极端假设游戏
回到第2阶段的流程图,问5个"what if":
- 如果高斯数量扩大1000倍,哪里先崩?
显存爆炸,渲染速度下降(每帧要处理更多高斯)
- 如果训练图像分辨率从512x512变成8K,会发生什么?
显存不够,训练极慢,可能需要梯度checkpoint
- 如果相机位姿完全错误(随机),能训练吗?
不能,会收敛到错误的几何(几何优化依赖正确的位姿)
- 如果禁用自适应策略,只靠初始点云,会怎样?
质量严重依赖初始点云质量,细节无法恢复
- 如果只用RGB损失(不用SSIM),会发生什么?
渲染模糊,过度平滑(SSIM保留结构信息)
能答对3个以上,算"真懂"。
4. 知识迁移测试
用学到的概念解释一个看似无关的现象。
示例1:用"高斯投影"解释"为什么斜着看硬币变成椭圆"
- 硬币是圆形的,3D空间中是一个圆
- 斜着看时,相当于相机视角变换
- 圆的协方差矩阵(单位圆)经过投影变换,变成椭圆
- 这就是3DGS中协方差变换的物理意义
示例2:用"Alpha Blending"解释"为什么透过半透明窗帘看外面是模糊的"
- 窗帘的每一层都有透明度和颜色
- 光线穿过多层窗帘时,每层都吸收一部分光
- 从外到内累加(Alpha Blending),最终看到的颜色是多层混合的结果
- 就像3DGS中多个高斯的前后叠加
示例3:用"密集化"解释"为什么画画时先铺大色块再细化"
- 先铺大色块 = 初始化粗粒度的高斯
- 细化 = 在细节不足的地方增加更多小高斯(密集化)
- 擦掉多余 = 剪枝
- 都是"从粗到细"的优化策略
🎯 本阶段产出
- 费曼录音/文稿(≤3分钟的通俗解释)
- 校验点通过证明(Demo运行截图、调试日志)
- 极端假设答案(至少回答3个)
- 知识迁移案例(1-2个跨领域解释)
第6阶段:解码固化为长期记忆
核心任务
建立知识索引卡片,确保未来可快速提取。
SOP动作
1. 建立"认知索引卡"(每概念1张)
┌─────────────────────────────────────────────┐
│ 概念:3D Gaussian Splatting │
├─────────────────────────────────────────────┤
│ 一句话:用可优化的3D高斯集合表示场景,通过 │
│ 可微渲染从多视角图像学习 │
├─────────────────────────────────────────────┤
│ 本质(元模型): │
│ 可微渲染 + 自适应优化 = 高质量+高速度 │
│ 高斯在计算效率(可解析投影)和表达能力 │
│ (任意形状)之间取得最佳平衡 │
├─────────────────────────────────────────────┤
│ 典型场景:NeRF实时化、新视角合成、3D重建 │
├─────────────────────────────────────────────┤
│ 它不是什么:不是点云(没有连续性), │
│ 不是Mesh(没有拓扑), │
│ 不是NeRF(不用体渲染) │
├─────────────────────────────────────────────┤
│ Trade-off:速度快(60fps+)vs 内存大 │
│ 质量高 vs 无拓扑 │
│ 训练快 vs 需要多视角 │
├─────────────────────────────────────────────┤
│ 何时不用:需要精确几何、场景极大、 │
│ 动态场景、内存受限 │
├─────────────────────────────────────────────┤
│ 类比:用可变形的彩色棉花糖搭建场景 │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 概念:协方差变换 (Covariance Transform) │
├─────────────────────────────────────────────┤
│ 一句话:3D高斯的形状和方向会随视角变化 │
├─────────────────────────────────────────────┤
│ 本质(元模型): │
│ Σ_view = J^T Σ_world J │
│ 雅可比矩阵编码了投影变换的局部线性化 │
├─────────────────────────────────────────────┤
│ 典型场景:渲染时从任意视角看高斯 │
├─────────────────────────────────────────────┤
│ 它不是什么:不是简单的缩放(有旋转) │
├─────────────────────────────────────────────┤
│ Trade-off:精确变换(O(N^3))vs │
│ 近似分解(O(N)) │
├─────────────────────────────────────────────┤
│ 何时不用:高斯固定为单位球(退化) │
├─────────────────────────────────────────────┤
│ 类比:斜着看盘子,圆形变成椭圆 │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 概念:自适应优化 (Adaptive Densification) │
├─────────────────────────────────────────────┤
│ 一句话:根据梯度统计动态增加/删除高斯 │
├─────────────────────────────────────────────┤
│ 本质(元模型): │
│ 梯度大 = 信息不足 → 密集化 │
│ 梯度小 = 冗余 → 剪枝 │
│ 视角外推 → 重置 │
├─────────────────────────────────────────────┤
│ 典型场景:训练初期快速增加密度,后期稳定 │
├─────────────────────────────────────────────┤
│ 它不是什么:不是固定数量的点云 │
├─────────────────────────────────────────────┤
│ Trade-off:质量提升 vs 计算开销 │
├─────────────────────────────────────────────┤
│ 何时不用:初始点云质量极高(够用) │
├─────────────────────────────────────────────┤
│ 类比:画画时先铺大色块,细节不足的地方加笔 │
└─────────────────────────────────────────────┘
2. 建立"故障诊断树"
问题:渲染质量差(模糊/伪影)
│
├─ 检查点1:训练视角渲染质量
│ ├─ 好 → 问题在新视角外推
│ │ ├─ 对策:增加训练视角
│ │ └─ 对策:使用正则化
│ └─ 差 → 继续排查
│
├─ 检查点2:高斯数量
│ ├─ 过少(<1万) → 需要密集化
│ └─ 过多(>1000万) → 过拟合风险
│
├─ 检查点3:损失曲线
│ ├─ 不下降 → 学习率/位姿问题
│ └─ 振荡 → 学习率过大
│
└─ 检查点4:相机位姿
├─ Colmap输出 → 检查reprojection error
└─ 手动标定 → 验证外参
问题:训练速度慢
│
├─ 检查点1:GPU利用率
│ ├─ 低(<50%) → CPU瓶颈(数据加载)
│ └─ 高(>90%) → 正常,只是计算量大
│
├─ 检查点2:高斯数量
│ ├─ 爆炸式增长 → 降低密集化阈值
│ └─ 正常范围 → 减少图像数量/分辨率
│
└─ 检查点3:渲染分辨率
├─ >2K → 降至512/1K训练
└─ 正常 → 考虑使用更小的backbone
3. 制定"复习计划"(间隔重复)
- 第1天:学完后立即复习(输出索引卡)
- 第3天:重新画一遍流程图(不看资料)
- 第7天:回答"极端假设"问题
- 第30天:用新知识解释一个现象
- 第90天:实现一个简化版3DGS渲染器
4. 建立"知识触发器"
为每个核心概念设定触发条件:
| 触发条件 | 立即想起的概念 |
|---|---|
| 看到"新视角合成" | NeRF、3DGS、光度一致性 |
| 看到"实时渲染" | 光栅化、3DGS、Mesh |
| 看到"半透明物体" | Alpha Blending、体渲染 |
| 看到"视角相关颜色" | 球谐函数、BRDF |
| 看到"优化不稳定" | 学习率调度、梯度裁剪 |
| 看到"内存爆炸" | 剪枝、蒸馏、量化 |
🎯 本阶段产出
- 核心概念索引卡(≤10张)
- 故障诊断树(2个典型问题)
- 复习计划(在日历设置提醒)
- 触发器清单(贴在工位可见处)
🎯 完整检查清单
学前(第0阶段)
- 写下3个要解决的具体问题
- 设定时间预算和深度边界
- 绘制ROI雷达图
编码(第1阶段)
- 对比3篇论文/代码,标记重合度
- 建立30词黑话词典
- 用1句话+1张图总结每个子章节
传输(第2-3阶段)
- 跑通官方代码Demo
- 绘制主流程数据流图
- 建立3个元模型和5个类比
- 追问"魔法"并消除盲区(手动推导协方差变换、Alpha Blending)
校验(第4阶段)
- 完成异常场景矩阵(9个场景)
- 执行3级破坏测试(单点/组合/压力)
- 建立"负面知识库"(3个不用场景)
- 对比Trade-off(3DGS vs NeRF vs Mesh)
解码(第5-6阶段)
- 完成费曼复述(录音/文稿)
- 通过3层级校验点(复述/应用/调试)
- 回答极端假设问题(至少3个)
- 完成知识迁移测试(1-2个案例)
- 建立认知索引卡(≤10张)
- 制定复习计划
💡 关键原则
压缩是学习的起点:不压缩,信息会像噪声一样淹没信号
- 3DGS的核心可以压缩为:高斯表示 + 可微渲染 + 自适应优化
破坏是理解的捷径:正常场景看不出设计意图,异常场景才能暴露边界
- 通过禁用排序、固定协方差、单视角输入等破坏性测试,理解每个组件的必要性
输出是掌握的标志:能复述≠能应用,能应用≠能创造
- 能手动推导协方差变换、能诊断训练问题、能实现简化版渲染器
迁移是融会贯通的证明:能在新语境中使用,才算真正理解
- 能用高斯投影解释硬币斜看成椭圆,能用Alpha Blending解释窗帘透光
📚 推荐学习路径
快速通道(1周)
- Day 1-2: 第0-1阶段(目标锚定+压缩编码)
- Day 3-4: 第2-3阶段(跑通代码+理解机制)
- Day 5-6: 第4阶段(破坏测试+边界探索)
- Day 7: 第5-6阶段(费曼技巧+输出索引卡)
深入通道(3周)
- 每个阶段2-3天,完整执行所有SOP动作
- 重点: 手动推导数学公式(协方差变换、梯度计算)
- 产出: 实现一个简化版3DGS渲染器(PyTorch/CUDA)
实战通道(结合项目)
- 直接用3DGS解决你的实际问题(例如:重建你的房间)
- 遇到问题时回到对应阶段补课
- 产出: 项目Demo + 技术报告
🔗 关键资源
论文:
代码:
教程:
可视化:
记住:你觉得自己理解了3DGS,只有在你能向大一新生讲清楚、能诊断训练问题、能实现简化版渲染器的那一刻,才知道真正理解了。而卡壳的地方,就是真正需要下功夫的地方。
下一步行动:
- 选择你的学习通道(快速/深入/实战)
- 从第0阶段开始,明确你的3个核心问题
- 下载官方代码,准备数据集
- 开始你的3DGS探索之旅!