cinematic-gaussians
项目结构
-
train.py
主训练脚本,负责模型的训练过程,包括数据加载、模型初始化、优化器设置、训练循环、日志记录和模型保存。 -
gaussian_me
核心模块,包含与模型、优化器、渲染器和数据处理相关的代码:- io/:处理数据集加载和解析。
- utils/:提供各种工具函数,如图像处理、损失计算和通用工具。
- model.py:定义高斯模型的核心逻辑。
- optim.py:定义优化器,用于更新模型参数。
- renderer.py:实现渲染逻辑。
-
docs
包含项目的文档和静态资源。 -
submodules
包含一些外部依赖的子模块,如差分高斯光栅化和简单的 KNN 实现。
核心模块讲解
1. 数据加载与处理
数据加载由 io 模块完成,主要通过 CamerasDataset 类实现:
- from_folder 方法根据文件夹内容推断数据集类型,并调用相应的解析函数(如
readVolumeSceneInfo
)。 __getitem__
方法通过索引访问单个相机数据,并将图像转换为 PyTorch 张量。- split_train_val 方法将数据集划分为训练集和验证集。
2. 模型定义
GaussianModel 是项目的核心模型,定义在 model.py 中。它使用高斯分布来表示场景中的点云,并支持 3D 渲染和优化。
3. 优化器
GaussianOptimizer 定义在 optim.py 中,用于更新高斯模型的参数。它支持学习率调整和梯度更新。
4. 渲染器
render 函数定义在 renderer.py 中,用于将高斯模型渲染为图像。它支持背景颜色设置和分辨率调整。
5. 工具函数
utils 提供了多个工具模块:
- camera_utils.py:处理相机相关的工具函数,如 camera_to_JSON。
- image_utils.py:提供图像处理工具,如计算 PSNR。
- loss_utils.py:定义损失函数,如 L1 损失和 SSIM 损失。
训练流程
train.py 文件实现了训练逻辑,主要包括以下步骤:
-
参数解析
使用 argparse 从命令行解析训练参数,并通过 ModelParams、OptimizationParams 和 PipelineParams 类提取参数。 -
数据加载
使用 CamerasDataset.from_folder 加载数据集,并根据需要划分为训练集和验证集。 -
模型初始化
使用 GaussianModel.from_pc 从点云初始化高斯模型,并将其移动到 GPU。 -
优化器设置
初始化 GaussianOptimizer,并设置学习率和优化目标。 -
训练循环
- 每次迭代从数据加载器中获取一个相机视点。
- 使用渲染器生成图像,并计算与真实图像的损失(L1 和 SSIM)。
- 反向传播计算梯度,并更新模型参数。
- 定期记录日志和保存模型。
-
日志记录与模型保存
使用 TensorBoard 记录训练过程中的损失和渲染结果,并在指定的迭代次数保存模型。
通过高斯模型进行训练,具体训练了什么?
-
高斯模型的初始化
使用 GaussianModel.from_pc 方法从数据集中提取的点云数据(dataset.init_pc())初始化高斯模型。高斯模型通过一组高斯分布来表示场景中的点云,每个高斯分布包含位置、半径、方向和颜色等信息。 -
数据集的加载与划分
- 数据集通过 CamerasDataset.from_folder 方法加载,包含场景的相机信息和图像数据。
- 如果启用了验证模式(model_params.eval),数据集会被划分为训练集和验证集(split_train_val 方法)。
-
渲染与损失计算
- 使用 render 函数将高斯模型渲染为图像。渲染结果包括生成的图像、视点空间点云、可见性过滤器和高斯半径等信息。
- 计算生成图像与真实图像之间的损失,包括:
- L1 损失:衡量生成图像与真实图像的像素差异。
- SSIM 损失:衡量生成图像与真实图像的结构相似性。
- 最终损失是 L1 损失和 SSIM 损失的加权组合。
-
模型参数的优化
- 使用 GaussianOptimizer 对高斯模型的参数进行优化。优化的目标是最小化渲染图像与真实图像之间的损失。
- 优化过程中会动态调整学习率,并通过反向传播更新高斯模型的参数。
-
背景随机化与多分辨率训练
- 支持随机背景颜色(opt.random_background),以增强模型的泛化能力。
- 支持多分辨率训练(scales),逐步提高渲染分辨率以优化细节。
-
日志记录与模型保存
- 使用 TensorBoard 记录训练过程中的损失、渲染结果和模型参数分布。
- 在指定的迭代次数(saving_iterations)保存高斯模型的点云数据(
.npz
格式)。
训练的输出结果
-
优化后的高斯模型
- 高斯模型的参数经过优化后,能够更准确地表示场景中的点云数据。
- 优化后的模型可以用于高质量的图像渲染。
-
渲染图像
- 训练过程中生成的渲染图像与真实图像逐渐接近,最终能够生成逼真的场景渲染结果。
-
日志与可视化
- 使用 TensorBoard 记录的训练日志,包括:
- 损失曲线(L1 损失和总损失)。
- 渲染图像与真实图像的对比。
- 高斯模型参数的分布(如透明度直方图)。
- 这些日志可以帮助分析训练过程和模型性能。
- 使用 TensorBoard 记录的训练日志,包括:
-
中间与最终模型文件
- 在指定的迭代次数保存的高斯模型点云文件(
.npz
格式),包含优化后的高斯分布参数。 - 这些文件可以用于后续的评估或渲染。
- 在指定的迭代次数保存的高斯模型点云文件(
加载数据集,包含场景的相机信息和图像数据
CamerasDataset.from_folder 方法负责从指定的文件夹路径加载数据集。
-
数据集类型推断
通过检查文件夹中是否存在特定文件(如 cameras.json 或transforms_train.json
),推断数据集的类型。 -
场景信息加载
根据数据集类型调用相应的函数(如 readVolumeSceneInfo 或 readColmapSceneInfo),加载场景信息(scene_info)。 -
返回数据集实例
使用加载的 scene_info 创建并返回一个 CamerasDataset 实例。
scene_info 对象包含了场景的所有信息,包括:
-
相机信息
每个相机的信息存储在 scene_info.cameras 中,包含相机的位姿、视场角(FoV)、图像路径等。 -
图像数据路径
图像数据的路径存储在每个相机信息的 image_path 属性中。图像数据在 __getitem__ 方法中通过路径动态加载: