一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting
一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting
文章目录
- 一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting
- 摘要
- Abstract
- 1. 基本思想
- 1.1 设计
- 1.2 特点
- 2. Nerfstudio&Splatfacto
- 2.1 Nerfstudio
- 2.2 Splatfacto
- 3. Splatfacto数据格式要求
- 3.1 相机的内参
- 3.2 相机的外参
- 3.3 深度图
- 3.4 掩码
- 4. Splatfacto与VTON360
- 总结
- 参考
摘要
本周主要学习了开源高斯泼溅实现库 gsplat 及其在 Gaussian Splatting 方法中的应用和优化。gsplat 是一个基于 PyTorch 和 CUDA 的高效实现库,支持模块化 API 接口,能够显著提升 Gaussian Splatting 模型的训练速度、内存效率和收敛时间。此外,还深入研究了 gsplat 的核心功能,包括密集化策略、姿态优化、深度渲染、抗锯齿处理等技术细节,以及其在 Nerfstudio 框架中的扩展实现 Splatfacto。同时,对 Splatfacto 的数据格式要求、训练流程及其在 VTON360 项目中的改进进行了系统性总结,为后续研究基于高斯光栅化的 3D 场景重建提供了重要参考。
Abstract
This week’s study focused on gsplat, an open-source library for Gaussian Splatting, and its applications and optimizations in the Gaussian Splatting method. gsplat is a highly efficient library built on PyTorch and CUDA, offering a modular API interface that significantly improves training speed, memory efficiency, and convergence time for Gaussian Splatting models. Key features such as densification strategies, pose optimization, depth rendering, anti-aliasing techniques, and N-dimensional rasterization were thoroughly examined. Furthermore, the integration of gsplat with the Nerfstudio framework through the Splatfacto module was explored, including its data format requirements, training procedures, and its modification in the VTON360 project. This provides valuable insights for further research on 3D scene reconstruction based on Gaussian rasterization.
1. 基本思想
gsplat是一个开源库,旨在训练和发展Gaussian Splatting方法。它的特点是前端具有与PyTorch库兼容的Python绑定,后端具有高度优化的CUDA内核。 gsplat提供了许多增强高斯分布模型优化的特性,可显著地改善Gaussian Splatting模型的优化,其中包括对速度,内存和收敛时间的优化改进。实验结果表明,与原始Gaussian Splatting论文的实现相比,gsplat的训练时间减少了10%,内存需求减少了4倍。 gsplat在GitHub上长期进行维护。其核心理念是为基于PyTorch的项目开发高斯溅射模型提供一个简单且易于修改的API。
开源Gaussian Splatting方法实现的先前工作包括GauStudio,它将各种研究整合到一个代码库中,以及几个基于PyTorch的复现。与以前的工作不同,gsplat不仅寻求实现原始3DGS工作并进行性能改进,还旨在提供一个易于使用和模块化的API接口,允许外部扩展和修改,从而促进高斯溅射领域的进一步研究。
1.1 设计
gsplat 是一个独立开发的库,旨在提高效率和模块化。它可以在 Windows 和 Linux 平台上通过 PyPI 安装,并提供 PyTorch 接口。
出于速度考虑,许多操作都被编写成了优化的 CUDA 内核,并通过 Python 绑定暴露给开发者。此外,gsplat 还包含了原生的 PyTorch 实现,以支持对新研究想法的迭代。gsplat 的设计目标是提供一个简单的接口,该接口可以从外部项目中导入,从而轻松集成主要的Gaussian Splatting(Gaussian Splatting)功能,并根据最新研究成果进行算法自定义。gsplat 提供了详尽的示例、验证 CUDA 操作正确性的测试用例,以及托管在线的进一步文档,因此也可以作为新研究人员进入该领域的教育资源。
1.2 特点
gsplat 库包含与Gaussian Splatting相关的特性和算法实现。通过模块化接口,用户可以简单地通过 API 调用启用所需功能。在此,我们简要介绍 gsplat 提供的一些算法增强功能,这些功能在 Kerbl 等人提出的原始 3DGS 实现中并未包含。
密集化策略:Gaussian Splatting优化过程的一个关键组成部分包括在场景欠重建和过重建区域分别对高斯分布进行密集化和修剪。这一直是研究的活跃领域,而 gsplat 库支持一些最新的密集化策略。这些策略包括 Kerbl 等人提出的自适应密度控制(ADC)、Ye 等人提出的 Absgrad 方法,以及 Kheradmand 等人提出的马尔可夫链蒙特卡洛(MCMC)方法。gsplat 的模块化 API 允许用户轻松地在不同策略之间切换。
姿态优化:gsplat 中的高斯渲染过程(如图 1 所示)是完全可微的,这使得梯度可以流向高斯参数 G(c,Σ, μ, o) 以及其他参数,如相机视图矩阵 P = [R | t],这在原始工作中并未考虑。这对于缓解数据集中的姿态不确定性至关重要。具体而言,可以针对相机视图矩阵的旋转和平移分量计算重建损失的梯度,从而通过梯度下降优化初始相机姿态。
深度渲染:从高斯场景渲染深度图对于正则化和网格化等应用非常重要。gsplat 支持使用优化的 RGB+Depth 光栅化器渲染深度图,该光栅化器也是完全可微的。gsplat 支持使用每个像素的累积 z-depth和经过 alpha 归一化的预期深度来渲染深度图。
N 维光栅化:除了渲染三通道 RGB 图像外,gsplat 还支持渲染更高维度的特征向量。这受到将学习到的特征图与可微体渲染相结合的算法的启发。为了满足这些特征的存储需求,gsplat 后端允许在训练期间调整影响内存分配的参数,如内核块大小。
抗锯齿:以不同分辨率查看由高斯表示的三维场景时,可能会产生锯齿效应,这在先前的三维表示中也曾出现过。当分辨率降低或从远处查看场景时,小于一个像素大小的单个高斯分布由于采样率低于奈奎斯特频率而会产生锯齿伪影。Mip-Splatting在投影的二维高斯协方差上提出了一种低通滤波器,确保高斯分布的范围始终跨越一个像素。gsplat 支持使用 Yu 等人引入的二维抗锯齿模式进行渲染。
2. Nerfstudio&Splatfacto
2.1 Nerfstudio
Nerfstudio是一个为NeRF开发提供支持的Python框架。该框架的设计注重模块化,实时可视化开发,以及便于处理真实数据,使得NeRF方法的开发和实施变得更加简单。Nerfstudio通过提供一个整合的平台,使得研究人员和开发者能够更容易地合作和开发交互式3D场景。这个框架不仅适用于研究人员,也为工业界和非技术用户提供了使用NeRF的便利。
2.2 Splatfacto
同时Nerfstudio整合了Gaussian Splatting的实现方法,命名为Splatfacto。Nerfstudio使用gsplat作为其高斯光栅化的后端,这是一个内部重新实现旨在对开发人员更加友好。
训练:
ns-train splatfacto --data {PROCESSED_DATA_DIR}
查看训练完模型的渲染:
ns-viewer --load-config {outputs/.../config.yml}
评估训练指标:
ns-eval --load-config={PATH_TO_CONFIG} --output-path=output.json
3. Splatfacto数据格式要求
3.1 相机的内参
如果所有图像都具有相同的相机内参,则可以将这些值放在文件的顶部。
{"camera_model": "OPENCV_FISHEYE", // camera model type [OPENCV, OPENCV_FISHEYE]"fl_x": 1072.0, // focal length x"fl_y": 1068.0, // focal length y"cx": 1504.0, // principal point x"cy": 1000.0, // principal point y"w": 3008, // image width"h": 2000, // image height"k1": 0.0312, // first radial distortion parameter, used by [OPENCV, OPENCV_FISHEYE]"k2": 0.0051, // second radial distortion parameter, used by [OPENCV, OPENCV_FISHEYE]"k3": 0.0006, // third radial distortion parameter, used by [OPENCV_FISHEYE]"k4": 0.0001, // fourth radial distortion parameter, used by [OPENCV_FISHEYE]"p1": -6.47e-5, // first tangential distortion parameter, used by [OPENCV]"p2": -1.37e-7, // second tangential distortion parameter, used by [OPENCV]"frames": // ... per-frame intrinsics and extrinsics parameters
}
每帧图片的内参也可以定义在frames
域中。一旦在一个域中定义了一个字段(比如fl_x
),每个frames
域中都要定义相同的字段补充相应数据。
{// ..."frames": [{"fl_x": 1234}]
}
3.2 相机的外参
对于相机的变换矩阵,前3列是 + X +X +X, + Y +Y +Y和 + Z +Z +Z,定义相机方向; X X X, Y Y Y, Z Z Z 值定义原点。最后一行是为了写成齐次坐标的形式。
{// ..."frames": [{"file_path": "images/frame_00001.jpeg","transform_matrix": [// [+X0 +Y0 +Z0 X]// [+X1 +Y1 +Z1 Y]// [+X2 +Y2 +Z2 Z]// [0.0 0.0 0.0 1][1.0, 0.0, 0.0, 0.0],[0.0, 1.0, 0.0, 0.0],[0.0, 0.0, 1.0, 0.0],[0.0, 0.0, 0.0, 1.0]]// Additional per-frame info}]
}
3.3 深度图
为了进行带有深度图条件的监督学习,需要在transforms.json
中为每一帧定义字段depth_file_path
,并使用一种由nerfstudio支持的计算深度损失的方法(例如,depth-nerfacto)。深度假定为16位或32位,单位为毫米,以保持与Polyform一致。深度图像中的零值被视为未知深度。我们可以使用NerfstudioDataParserConfig
中的depth_unit_scale_factor
参数来调整这个比例因子。请注意,默认情况下,我们会调整深度图像的大小以匹配RGB图像的形状。
{"frames": [{// ..."depth_file_path": "depth/0001.png"}]
}
3.4 掩码
Splatfacto训练的图像中,某些部分可能不应该在训练期间使用(例如:移动的物体,人)。这些图像可以使用帧数据中指定的附加掩码图像进行屏蔽。
{"frames": [{// ..."mask_path": "masks/mask.jpeg"}]
}
- mask必须只有一个通道,并且只能有黑和白这两种像素
- mask的大小必须与训练图片的大小一致
- 黑色像素的区域是被忽略的
4. Splatfacto与VTON360
在VTON360中作者提到对Nerfstudio的Splatfacto进行了修改与扩展,主要是去掉了3D场景中的背景。作者添加一个不透明度损失到背景区域,并强制背景的不透明度为零。但如果在3DGS重建的早期阶段使用,不透明度损失可能会迫使所有高斯函数为零不透明度,导致训练失败。所以作者线性增加不透明度损失系数从0到max-opacity-loss-scale。更多细节可以在splatfactox/splatfactox.py:286中找到。
因此splatfacto模块在VTON360项目中需要手动安装。
#! /bin/bashset -exu
exp_dir="output"
cam_path="demo_data/campath.json"# 1. reconstruction with 3DGS.
ns-train splatfactox \--output-dir ${exp_dir} \--experiment-name test \--max-num-iterations 20000 \--pipeline.model.cull-alpha-thresh 0.005 \--pipeline.model.max-opacity-loss-scale 2.0 \--pipeline.model.background_color white \--viewer.quit-on-train-completion True \nerfstudio-data --data demo_data/0024_00208 \# use the newest checkpoint
ckpt_dir=$(ls ${exp_dir}/test/splatfactox | sort -r | head -n 1)
echo using checkpoint ${ckpt_dir}# 2. render a video with the given camera path.
# there is no detail about the format of the camera path in NeRF Studio's docs,
# but you could export camera path manually using ns-view and then
# edit the exported JSON file (focus on the field named `camera_path` in the JSON file) for a better result.
ns-render camera-path \--camera-path-filename $cam_path \--load-config ${exp_dir}/test/splatfactox/${ckpt_dir}/config.yml \--output-path ${exp_dir}/video.mp4 \# 3. render each frame in the video.
ns-render camera-path \--output-format images \--camera-path-filename $cam_path \--load-config ${exp_dir}/test/splatfactox/${ckpt_dir}/config.yml \--output-path ${exp_dir}/frames/ \
这是2D VTON后将多视角图片转换为3D GS的训练命令和渲染视频命令。
总结
本周的学习主要围绕 gsplat 库及其在 Gaussian Splatting 方法中的优化展开。作为一个基于 PyTorch 和 CUDA 的开源项目,gsplat 提供了高效的模块化 API,实现了对原始 3DGS 方法的多方面改进,包括训练速度提高 10%、内存需求减少 4 倍等。通过研究 gsplat 的密集化策略、姿态优化、深度渲染、抗锯齿处理等核心功能,进一步理解了该库在 3D 场景重建中的潜力。
此外,详细分析了 Nerfstudio 框架下的 Splatfacto 模块,包括其数据格式要求、训练指令和扩展功能。特别是在 VTON360 项目中,Splatfacto 模块通过引入不透明度损失机制实现了背景区域的裁剪优化,同时避免了训练早期的梯度消失问题,展现了高斯光栅化方法在多视角 3D 场景重建中的重要应用价值。
参考
gsplat: An Open-Source Library for Gaussian Splatting
gsplat: GitHub仓库
Nerfstudio: A Modular Framework for Neural Radiance Field Development
复现nerfstudio并训练自己制作的数据集
NeRF Studio’s Dataset Format
Splatfacto: Nerfstudio’s Gaussian Splatting Implementation