graphdeco-inria/gaussian-splatting

GitHub: graphdeco-inria/gaussian-splatting

3D Gaussian Splatting的官方参考实现,通过3D高斯表示和可微分光栅化实现高质量的实时新视角合成,从根本上解决了神经辐射场渲染速度慢的问题。

Stars: 22254 | Forks: 3247

# 用于实时辐射场渲染的 3D Gaussian Splatting Bernhard Kerbl*, Georgios Kopanas*, Thomas Leimkühler, George Drettakis (* 表示同等贡献)
| [网页](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/) | [完整论文](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf) | [视频](https://youtu.be/T_kXY43VZnk) | [其他 GRAPHDECO 出版物](http://www-sop.inria.fr/reves/publis/gdindex.php) | [FUNGRAPH 项目页面](https://fungraph.inria.fr) |
| [T&T+DB COLMAP (650MB)](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip) | [预训练模型 (14 GB)](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/pretrained/models.zip) | [Windows 查看器 (60MB)](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/binaries/viewers.zip) | [评估图像 (7 GB)](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/evaluation/images.zip) |
![Teaser 图像](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/d5ba75a3c5014443.png) 本仓库包含与论文“用于实时辐射场渲染的 3D Gaussian Splatting”相关的官方作者实现,可以在[此处](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/)找到。我们进一步提供了用于创建论文中报告的误差度量的参考图像,以及最新创建的预训练模型。 摘要:*辐射场方法最近彻底改变了使用多张照片或视频捕获场景的新视角合成。然而,实现高视觉质量仍然需要训练和渲染成本高昂的神经网络,而最近出现的更快速的方法不可避免地以质量换取速度。对于无界完整场景(而非孤立对象)和 1080p 分辨率渲染,目前没有任何方法能够实现实时显示速率。我们引入了三个关键要素,使我们能够在保持有竞争力的训练时间的同时实现最先进的视觉质量,并且重要的是,允许在 1080p 分辨率下进行高质量的实时(≥ 30 fps)新视角合成。首先,从相机校准期间生成的稀疏点开始,我们使用 3D 高斯表示场景,保留了连续体积辐射场用于场景优化的理想属性,同时避免了空白空间中不必要的计算;其次,我们对 3D 高斯执行交错优化/密度控制,特别是优化各向异性协方差以实现准确的场景表示;第三,我们开发了一种支持各向异性 splatting 的快速可见性感知渲染算法,既加速了训练又允许实时渲染。我们在几个已建立的数据集上展示了最先进的视觉质量和实时渲染。* ## 资助与致谢 这项研究由 ERC 高级拨款 FUNGRAPH No 788065 资助。作者感谢 Adobe 的慷慨捐赠,Université Côte d’Azur 的 OPAL 基础设施以及 GENCI–IDRIS 提供的 HPC 资源(拨款 2022-AD011013409)。作者感谢匿名审稿人的宝贵反馈,P. Hedman 和 A. Tewari 对早期草稿的校对,以及 T. Müller、A. Yu 和 S. Fridovich-Keil 在比较方面提供的帮助。 ## 新功能! 我们用于维护和更新代码的资源有限。然而,自最初发布以来,我们受许多其他研究人员在 3DGS 上所做的出色工作的启发,添加了一些新功能。我们将在我们的资源能力范围内添加其他功能。 **2024 年 10 月更新**:我们集成了[训练速度加速](#training-speed-acceleration),并使其与[深度正则化](#depth-regularization)、[抗锯齿](#anti-aliasing)和[曝光补偿](#exposure-compensation)兼容。我们通过纠正错误并在[俯视图](#sibr-top-view)中添加允许可视化输入和用户相机的新功能,增强了 SIBR 实时查看器。 **2024 年春季更新**: Orange Labs 慷慨地为 VR 查看添加了 [OpenXR 支持](#openxr-support)。 ## 分步教程 Jonathan Stephens 制作了一个精彩的分步教程,用于在您的机器上设置 Gaussian Splatting,以及从视频创建可用数据集的说明。如果下面的说明对您来说太枯燥,请前往[此处](https://www.youtube.com/watch?v=UXtuigy_wYc)查看。 ## Colab 用户 [camenduru](https://github.com/camenduru) 非常友好地提供了一个 Colab 模板,该模板使用此仓库的源代码(状态:2023 年 8 月!),以便快速轻松地访问该方法。请在[此处](https://github.com/camenduru/gaussian-splatting-colab)查看。 ## 克隆仓库 该仓库包含子模块,因此请使用以下命令检出: ``` # SSH git clone git@github.com:graphdeco-inria/gaussian-splatting.git --recursive ``` 或者 ``` # HTTPS git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive ``` ## 概述 代码库包含 4 个主要组件: - 基于 PyTorch 的优化器,用于从 SfM 输入生成 3D 高斯模型 - 网络查看器,允许连接到并可视化优化过程 - 基于 OpenGL 的实时查看器,用于实时渲染训练好的模型。 - 一个脚本,可帮助您将自己的图像转换为可进行优化的 SfM 数据集 这些组件在硬件和软件方面有不同的要求。它们已在 Windows 10 和 Ubuntu Linux 22.04 上进行了测试。有关设置和运行每个组件的说明,请参见以下部分。 ## 优化器 该优化器在 Python 环境中使用 PyTorch 和 CUDA 扩展来生成训练好的模型。 ### 硬件要求 - 具有 Compute Capability 7.0+ 的 CUDA-ready GPU - 24 GB VRAM(用于训练至论文评估质量) - 有关较小 VRAM 配置,请参阅常见问题解答 ### 软件要求 - Conda(推荐用于轻松设置) - 用于 PyTorch 扩展的 C++ 编译器(Windows 上我们使用了 Visual Studio 2019) - 用于 PyTorch 扩展的 CUDA SDK 11,在 Visual Studio *之后* 安装(我们使用了 11.8,**11.6 存在已知问题**) - C++ 编译器和 CUDA SDK 必须兼容 ### 设置 #### 本地设置 我们默认提供的安装方法基于 Conda 包和环境管理: ``` SET DISTUTILS_USE_SDK=1 # Windows only conda env create --file environment.yml conda activate gaussian_splatting ``` 请注意,此过程假定您安装的是 CUDA SDK **11**,而不是 **12**。有关修改,请参见下文。 提示:下载包并使用 Conda 创建新环境可能需要大量磁盘空间。默认情况下,Conda 将使用主系统硬盘。您可以通过指定不同的包下载位置和位于不同驱动器上的环境来避免这种情况: ``` conda config --add pkgs_dirs / conda env create --file environment.yml --prefix //gaussian_splatting conda activate //gaussian_splatting ``` #### 修改 如果您有足够的磁盘空间,我们建议使用我们的环境文件来设置与我们相同的训练环境。如果您想进行修改,请注意主要版本更改可能会影响我们方法的结果。然而,我们(有限的)实验表明,代码库在更高级的环境(Python 3.8、PyTorch 2.0.0、CUDA 12)中也能正常工作。确保创建一个 PyTorch 及其 CUDA runtime 版本匹配的环境,并且安装的 CUDA SDK 与 PyTorch 的 CUDA 版本没有主要版本差异。 #### 已知问题 一些用户在 Windows 上构建子模块时遇到问题(```cl.exe: File not found``` 或类似错误)。请考虑从常见问题解答中获取此问题的解决方法。 ### 运行 要运行优化器,只需使用 ``` python train.py -s ```
train.py 的命令行参数 #### --source_path / -s 包含 COLMAP 或 Synthetic NeRF 数据集的源目录的路径。 #### --model_path / -m 训练模型应存储的路径(默认为 ```output/```)。 #### --images / -i COLMAP 图像的替代子目录(默认为 ```images```)。 #### --eval 添加此标志以使用 MipNeRF360 风格的训练/测试划分进行评估。 #### --resolution / -r 指定训练前加载图像的分辨率。如果提供 ```1, 2, 4``` 或 ```8```,则分别使用原始、1/2、1/4 或 1/8 分辨率。对于所有其他值,将宽度重新缩放为给定数字,同时保持图像宽高比。**如果未设置且输入图像宽度超过 1.6K 像素,输入将自动重新缩放到此目标。** #### --data_device 指定放置源图像数据的位置,默认为 ```cuda```,如果在大型/高分辨率数据集上进行训练,建议使用 ```cpu```,这将减少 VRAM 消耗,但会略微减慢训练速度。感谢 [HrsPythonix](https://github.com/HrsPythonix)。 #### --white_background / -w 添加此标志以使用白色背景而不是黑色(默认),例如,用于评估 NeRF Synthetic 数据集。 #### --sh_degree 要使用的球谐函数阶数(不大于 3)。默认为 ```3```。 #### --convert_SHs_python 使 pipeline 使用 PyTorch 而不是我们的代码来计算 SHs 的前向和后向的标志。 #### --convert_cov3D_python 使 pipeline 使用 PyTorch 而不是我们的代码来计算 3D 协方差的前向和后向的标志。 #### --debug 如果您遇到错误,则启用调试模式。如果光栅化器失败,将创建一个 ```dump``` 文件,您可以将其转发给我们,以便我们进行调查。 #### --debug_from 调试**缓慢**。您可以指定一个迭代(从 0 开始),在此迭代之后上述调试将激活。 #### --iterations 要训练的总迭代次数,默认为 ```30_000```。 #### --ip 启动 GUI 服务器的 IP,默认为 ```127.0.0.1```。 #### --port 用于 GUI 服务器的端口,默认为 ```6009```。 #### --test_iterations 以空格分隔的迭代,训练脚本在这些迭代时计算测试集上的 L1 和 PSNR,默认为 ```7000 30000```。 #### --save_iterations 以空格分隔的迭代,训练脚本在这些迭代时保存高斯模型,默认为 ```7000 30000 ```。 #### --checkpoint_iterations 以空格分隔的迭代,用于存储检查点以便稍后继续,保存在模型目录中。 #### --start_checkpoint 用于继续训练的已保存检查点的路径。 #### --quiet 省略任何写入标准输出管道的文本的标志。 #### --feature_lr 球谐函数特征学习率,默认为 ```0.0025```。 #### --opacity_lr 不透明度学习率,默认为 ```0.05```。 #### --scaling_lr 缩放学习率,默认为 ```0.005```。 #### --rotation_lr 旋转学习率,默认为 ```0.001```。 #### --position_lr_max_steps 位置学习率从 ```initial``` 变为 ```final``` 的步数(从 0 开始)。默认为 ```30_000```。 #### --position_lr_init 初始 3D 位置学习率,默认为 ```0.00016```。 #### --position_lr_final 最终 3D 位置学习率,默认为 ```0.0000016```。 #### --position_lr_delay_mult 位置学习率乘数(参见 Plenoxels),默认为 ```0.01```。 #### --densify_from_iter 开始致密化的迭代,默认为 ```500```。 #### --densify_until_iter 停止致密化的迭代,默认为 ```15_000```。 #### --densify_grad_threshold 根据 2D 位置梯度决定是否应致密化点的限制,默认为 ```0.0002```。 #### --densification_interval 致密化频率,默认为 ```100```(每 100 次迭代)。 #### --opacity_reset_interval 重置不透明度的频率,默认为 ```3_000```。 #### --lambda_dssim SSIM 对总损失的影响程度(从 0 到 1),默认为 ```0.2```。 #### --percent_dense 点必须超过的场景范围(0--1)百分比才能被强制致密化,默认为 ```0.01```。

请注意,与 MipNeRF360 类似,我们的目标图像分辨率在 1-1.6K 像素范围内。为方便起见,可以传入任意大小的输入,如果其宽度超过 1600 像素,将自动调整大小。我们建议保留此行为,但您可以通过设置 ```-r 1``` 来强制训练使用更高分辨率的图像。 MipNeRF360 场景由论文作者在[此处](https://jonbarron.info/mipnerf360/)托管。您可以在[此处](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip)找到我们用于 Tanks&Temples 和 Deep Blending 的 SfM 数据集。如果您未提供输出模型目录(```-m```),则训练好的模型将被写入 ```output``` 目录中具有随机唯一名称的文件夹中。此时,可以使用实时查看器查看训练好的模型(见下文)。 ### 评估 默认情况下,训练好的模型使用数据集中所有可用的图像。要在保留测试集用于评估的同时它们,请使用 ```--eval``` 标志。这样,您可以渲染训练/测试集并按如下方式生成误差度量: ``` python train.py -s --eval # Train with train/test split python render.py -m # Generate renderings python metrics.py -m # Compute error metrics on renderings ``` 如果您想评估我们的[预训练模型](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/pretrained/models.zip),您必须下载相应的源数据集,并使用额外的 ```--source_path/-s``` 标志向 ```render.py``` 指示它们的位置。注意:预训练模型是使用发布时的代码库创建的。此代码库已经过清理并包含错误修复,因此您通过评估它们获得的指标将与论文中的指标不同。 ``` python render.py -m -s python metrics.py -m ```
render.py 的命令行参数 #### --model_path / -m 您要为其创建渲染效果的训练模型目录的路径。 #### --skip_train 跳过渲染训练集的标志。 #### --skip_test 跳过渲染测试集的标志。 #### --quiet 省略任何写入标准输出管道的文本的标志。 **以下参数将根据训练时使用的内容从模型路径自动读取。但是,您可以通过在命令行上显式提供它们来覆盖它们。** #### --source_path / -s 包含 COLMAP 或 Synthetic NeRF 数据集的源目录的路径。 #### --images / -i COLMAP 图像的替代子目录(默认为 ```images```)。 #### --eval 添加此标志以使用 MipNeRF360 风格的训练/测试划分进行评估。 #### --resolution / -r 更改训练前加载图像的分辨率。如果提供 ```1, 2, 4``` 或 ```8```,则分别使用原始、1/2、1/4 或 1/8 分辨率。对于所有其他值,将宽度重新缩放为给定数字,同时保持图像宽高比。默认为 ```1```。 #### --white_background / -w 添加此标志以使用白色背景而不是黑色(默认),例如,用于评估 NeRF Synthetic 数据集。 #### --convert_SHs_python 使 pipeline 使用 PyTorch 计算出的 SHs 进行渲染而不是我们的代码的标志。 #### --convert_cov3D_python 使 pipeline 使用 PyTorch 计算出的 3D 协方差进行渲染而不是我们的代码的标志。
metrics.py 的命令行参数 #### --model_paths / -m 以空格分隔的应计算度量的模型路径列表。

我们进一步提供了 ```full_eval.py``` 脚本。此脚本指定了我们评估中使用的例程,并演示了一些附加参数的使用,例如,```--images (-i)``` 用于定义 COLMAP 数据集中的替代图像目录。如果您已下载并提取了所有训练数据,您可以像这样运行它: ``` python full_eval.py -m360 -tat -db ``` 在当前版本中,此过程在我们包含 A6000 的参考机器上大约需要 7 小时。如果您想对我们的预训练模型进行全面评估,可以指定它们的下载位置并跳过训练。 ``` python full_eval.py -o --skip_training -m360 -tat -db ``` 如果您想在论文的[评估图像](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/evaluation/images.zip)上计算指标,您也可以跳过渲染。在这种情况下,无需提供源数据集。您可以一次计算多个图像集的指标。 ``` python full_eval.py -m /garden ... --skip_training --skip_rendering ```
full_eval.py 的命令行参数 #### --skip_training 跳过训练阶段的标志。 #### --skip_rendering 跳过渲染阶段的标志。 #### --skip_metrics 跳过指标计算阶段的标志。 #### --output_path 放置渲染和结果的目录,默认为 ```./eval```,如果在评估它们,则设置为预训练模型的位置。 #### --mipnerf360 / -m360 MipNeRF360 源数据集的路径,如果训练或渲染则需要。 #### --tanksandtemples / -tat Tanks&Temples 源数据集的路径,如果训练或渲染则需要。 #### --deepblending / -db Deep Blending 源数据集的路径,如果训练或渲染则需要。

## 交互式查看器 我们为我们的方法提供了两种交互式查看器:远程和实时。我们的查看解决方案基于 GRAPHDECO 小组为几个新视角合成项目开发的 [SIBR](https://sibr.gitlabpages.inria.fr/) 框架。 ### 硬件要求 - 支持 OpenGL 4.5 的 GPU 和驱动程序(或最新的 MESA 软件) - 推荐 4 GB VRAM - 具有 Compute Capability 7.0+ 的 CUDA-ready GPU(仅限实时查看器) ### 软件要求 - Visual Studio 或 g++,**不是 Clang**(Windows 上我们使用了 Visual Studio 2019) - CUDA SDK 11,在 Visual Studio *之后* 安装(我们使用了 11.8) - CMake(最新版本,我们使用了 3.24) - 7zip(仅在 Windows 上) ### 预构建的 Windows 二进制文件 我们在[此处](https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/binaries/viewers.zip)提供了 Windows 的预构建二进制文件。我们建议在 Windows 上使用它们以进行高效设置,因为构建 SIBR 涉及必须动态下载和编译的多个外部依赖项。 ### 从源代码安装 如果您克隆了子模块(例如,使用 ```--recursive```),查看器的源代码可以在 ```SIBR_viewers``` 中找到。网络查看器在 SIBR 框架内运行,用于基于图像的渲染应用程序。 #### Windows CMake 应该会处理您的依赖项。 ``` cd SIBR_viewers cmake -Bbuild . cmake --build build --target install --config RelWithDebInfo ``` 您可以指定不同的配置,例如,如果您在开发过程中需要更多控制,请使用 ```Debug```。 #### Ubuntu 22.04 在运行项目设置之前,您需要安装一些依赖项。 ``` # 依赖 sudo apt install -y libglew-dev libassimp-dev libboost-all-dev libgtk-3-dev libopencv-dev libglfw3-dev libavdevice-dev libavcodec-dev libeigen3-dev libxxf86vm-dev libembree-dev # 项目设置 cd SIBR_viewers cmake -Bbuild . -DCMAKE_BUILD_TYPE=Release # add -G Ninja to build faster cmake --build build -j24 --target install ``` #### Ubuntu 20.04 与 Focal Fossa 的向后兼容性未经过全面测试,但在调用 ``` git checkout fossa_compatibility ``` 之后,使用 CMake 构建 SIBR 仍然可以工作。 ### SIBR 查看器中的导航 SIBR 界面提供了几种浏览场景的方法。默认情况下,您将启动 FPS 导航器,您可以使用 ```W, A, S, D, Q, E``` 进行相机平移,使用 ```I, K, J, L, U, O``` 进行旋转。或者,您可能想使用轨迹球式导航器(从浮动菜单中选择)。您还可以使用 ```Snap to``` 按钮从数据集中对齐到某个相机,或使用 ```Snap to closest``` 找到最近的相机。浮动菜单还允许您更改导航速度。您可以使用 ```Scaling Modifier``` 控制显示的高斯的大小,或显示初始点云。 ### 运行网络查看器 https://github.com/graphdeco-inria/gaussian-splatting/assets/40643808/90a2e4d3-cf2e-4633-b35f-bfe284e28ff7 提取或安装查看器后,您可以在 ```/bin``` 中运行编译好的 ```SIBR_remoteGaussian_app[_config]``` 应用程序,例如: ``` .//bin/SIBR_remoteGaussian_app ``` 网络查看器允许您连接到同一台或不同机器上正在运行的训练过程。如果您在同一台机器和操作系统上进行训练,则不需要命令行参数:优化器将训练数据的位置传达给网络查看器。默认情况下,优化器和网络查看器将尝试在 **localhost** 上的端口 **6009** 上建立连接。您可以通过向优化器和网络查看器提供匹配的 ```--ip``` 和 ```--port``` 参数来更改此行为。如果由于某种原因优化器用于查找训练数据的路径无法由网络查看器访问(例如,由于它们在不同的(虚拟)机器上运行),您可以使用 ```-s ``` 向查看器指定覆盖位置。
网络查看器的主要命令行参数 #### --path / -s 覆盖模型源数据集路径的参数。 #### --ip 用于连接到正在运行的训练脚本的 IP。 #### --port 用于连接到正在运行的训练脚本的端口。 #### --rendering-size 采用两个以空格分隔的数字来定义网络渲染发生的分辨率,默认宽度为 ```1200```。 请注意,要强制执行与输入图像不同的宽高比,您还需要 ```--force-aspect-ratio```。 #### --load_images 加载源数据集图像以在每个相机的俯视图中显示的标志。

### 运行实时查看器 https://github.com/graphdeco-inria/gaussian-splatting/assets/40643808/0940547f-1d82-4c2f-a616-44eabbf0f816 提取或安装查看器后,您可以在 ```/bin``` 中运行编译好的 ```SIBR_gaussianViewer_app[_config]``` 应用程序,例如: ``` .//bin/SIBR_gaussianViewer_app -m ``` 只需提供指向训练模型目录的 ```-m``` 参数即可。或者,您可以使用 ```-s``` 指定训练输入数据的覆盖位置。要使用自动选择之外的特定分辨率,请指定 ```--rendering-size ```。如果您想要确切的分辨率并且不介意图像失真,请将其与 ```--force-aspect-ratio``` 结合使用。 **要解锁完整帧率,请在您的机器上以及应用程序中(菜单 → 显示)禁用 V-Sync。在多 GPU 系统(例如,笔记本电脑)中,您的 OpenGL/显示 GPU 应与您的 CUDA GPU 相同(例如,通过在 Windows 上设置应用程序的 GPU 首选项,见下文)以获得最大性能。** ![Teaser 图像](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/3887f32ade014444.png) 除了初始点云和 splats 之外,您还可以选择通过浮动菜单将高斯渲染为椭球体来对其进行可视化。 SIBR 还有许多其他功能,有关查看器、导航选项等的更多详细信息,请参见[文档](https://sibr.gitlabpages.inria.fr/)。还有一个俯视图(可从菜单中获取),显示输入相机的位置和原始 SfM 点云;请注意,启用时俯视图会减慢渲染速度。实时查看器还使用了略微更激进的、快速的剔除,可以在浮动菜单中切换。如果您遇到过可以通过关闭快速剔除来解决的问题,请告诉我们。
实时查看器的主要命令行参数 #### --model-path / -m 训练模型的路径。 #### --iteration 指定在多个可用状态时加载哪个状态。默认为最新可用迭代。 #### --path / -s 覆盖模型源数据集路径的参数。 #### --rendering-size 采用两个以空格分隔的数字来定义实时渲染发生的分辨率,默认宽度为 ```1200```。请注意,要强制执行与输入图像不同的宽高比,您还需要 ```--force-aspect-ratio```。 #### --load_images 加载源数据集图像以在每个相机的俯视图中显示的标志。 #### --device 如果有多个可用 CUDA 设备,用于光栅化的 CUDA 设备索引,默认为 ```0```。 #### --no_interop 强制禁用 CUDA/GL 互操作。在可能不符合规范行为的系统上使用(例如,带有 MESA GL 4.5 软件渲染的 WSL2)。

## 处理您自己的场景 我们的 COLMAP 加载器期望在源路径位置具有以下数据集结构: ``` |---images | |--- | |--- | |---... |---sparse |---0 |---cameras.bin |---images.bin |---points3D.bin ``` 对于光栅化,相机模型必须是 SIMPLE_PINHOLE 或 PINHOLE 相机。我们提供了一个转换脚本 ```convert.py```,用于从输入图像中提取无畸变图像和 SfM 信息。或者,您可以使用 ImageMagick 调整无畸变图像的大小。这种重新缩放类似于 MipNeRF360,即它在相应的文件夹中创建原始分辨率的 1/2、1/4 和 1/8 的图像。要使用它们,请首先安装最新版本的 COLMAP(最好是 CUDA 驱动的)和 ImageMagick。将您要使用的图像放在 ```/input``` 目录中。 ``` |---input |--- |--- |---... ``` 如果您的系统路径上有 COLMAP 和 ImageMagick,您可以直接运行 ``` python convert.py -s [--resize] #If not resizing, ImageMagick is not needed ``` 或者,您可以使用可选参数 ```--colmap_executable``` 和 ```--magick_executable``` 来指向各自的路径。请注意,在 Windows 上,可执行文件应指向负责设置执行环境的 COLMAP ```.bat``` 文件。完成后,`````` 将包含预期的 COLMAP 数据集结构以及无畸变、调整过大小的输入图像,此外还有您的原始图像和 ```distorted``` 目录中的一些临时(有畸变的)数据。 如果您有自己的未经畸变处理的 COLMAP 数据集(例如,使用 ```OPENCV``` 相机),您可以尝试只运行脚本的最后一部分:将图像放在 ```input``` 中,将 COLMAP 信息放在子目录 ```distorted``` 中: ``` |---input | |--- | |--- | |---... |---distorted |---database.db |---sparse |---0 |---... ``` 然后运行 ``` python convert.py -s --skip_matching [--resize] #If not resizing, ImageMagick is not needed ```
convert.py 的命令行参数 #### --no_gpu 避免在 COLMAP 中使用 GPU 的标志。 #### --skip_matching 指示图像的 COLMAP 信息可用的标志。 #### --source_path / -s 输入的位置。 #### --camera 用于早期匹配步骤的相机模型,默认为 ```OPENCV```。 #### --resize 用于创建调整过大小的输入图像版本的标志。 #### --colmap_executable COLMAP 可执行文件的(Windows 上为 ```.bat```)。 #### --magick_executable ImageMagick 可执行文件的路径。

### 训练速度加速 我们将 [Taming-3dgs](https://humansensinglab.github.io/taming-3dgs/)1 中的直接替换模块和 [fused ssim](https://github.com/rahul-goel/fused-ssim/tree/main) 集成到原始代码库中,以加快训练时间。安装后,加速的光栅化器在使用 `--optimizer_type default` 时可提供 **$\times$ 1.6 的训练时间加速**,在使用 `--optimizer_type sparse_adam` 时可提供 **$\times$ 2.7 的训练时间加速**。 要获得更快的训练时间,您必须首先将加速的光栅化器安装到您的环境中: ``` pip uninstall diff-gaussian-rasterization -y cd submodules/diff-gaussian-rasterization rm -r build git checkout 3dgs_accel pip install . ``` 然后,在运行 `train.py` 时可以添加以下参数来使用 sparse adam 优化器: ``` --optimizer_type sparse_adam ``` *请注意,此自定义光栅化器具有与原始版本不同的行为,有关训练时间的更多详细信息,请参见[训练时间统计数据](results.md/#training-times-comparisons)*。 *1. Mallick and Goel, et al. ‘Taming 3DGS: High-Quality Radiance Fields with Limited Resources’. SIGGRAPH Asia 2024 Conference Papers, 2024, https://doi.org/10.1145/3680528.3687694, [github](https://github.com/humansensinglab/taming-3dgs)* ### 深度正则化 为了获得更好的重建场景,我们在每张输入图像的优化过程中将深度图作为先验。它在无纹理部分(例如道路)效果最好,并且可以去除悬浮物。几篇论文使用了类似的想法来改善 3DGS 的各个方面;(例如 [DepthRegularizedGS](https://robot0321.github.io/DepthRegGS/index.html)、[SparseGS](https://formycat.github.io/SparseGS-Real-Time-360-Sparse-View-Synthesis-using-Gaussian-Splatting/)、[DNGaussian](https://fictionarry.github.io/DNGaussian/))。我们集成的深度正则化是在我们的 [Hierarchical 3DGS](https://repo-sam.inria.fr/fungraph/hierarchical-3d-gaussians/) 论文中使用的,但应用于原始 3DGS;对于某些场景(例如 DeepBlending 场景),它显著提高了质量;对于其他场景,它要么差异很小,甚至可能更差。有关显示潜在益处和质量统计信息的示例结果,请参见此处:[深度正则化统计数据](results.md)。 在合成数据集上进行训练时,可以生成深度图,并且不需要进一步处理即可在我们的方法中使用。 对于真实世界数据集,应为每个输入图像生成深度图,要生成它们,请执行以下操作: 1. 克隆 [Depth Anything v2](https://github.com/DepthAnything/Depth-Anything-V2?tab=readme-ov-file#usage): git clone https://github.com/DepthAnything/Depth-Anything-V2.git 2. 从 [Depth-Anything-V2-Large](https://huggingface.co/depth-anything/Depth-Anything-V2-Large/resolve/main/depth_anything_v2_vitl.pth?download=true) 下载权重并将其放置在 `Depth-Anything-V2/checkpoints/` 下 3. 生成深度图: python Depth-Anything-V2/run.py --encoder vitl --pred-only --grayscale --img-path --outdir 4. 使用以下命令生成 `depth_params.json` 文件: python utils/make_depth_scale.py --base_dir --depths_dir 如果您想使用深度正则化,在训练时应设置一个新参数 `-d `。 ### 曝光补偿 为了补偿不同输入图像中的曝光变化,我们为每张图像优化仿射变换,就像在 [Hierarchical 3dgs](https://repo-sam.inria.fr/fungraph/hierarchical-3d-gaussians/) 中一样。 这可以极大地改善“野外”捕获的重建结果,例如,使用智能手机时相机的曝光设置不固定。有关显示潜在益处和质量统计信息的示例结果,请参见此处:[曝光补偿统计数据](results.md)。 添加以下参数以启用它: ``` --exposure_lr_init 0.001 --exposure_lr_final 0.0001 --exposure_lr_delay_steps 5000 --exposure_lr_delay_mult 0.001 --train_test_exp ``` 同样,其他优秀的论文也使用了类似的想法,例如 [NeRF-W](https://nerf-w.github.io/)、[URF](https://urban-radiance-fields.github.io/)。 ### 抗锯齿 我们在代码库中添加了来自 [Mip Splatting](https://niujinshuchong.github.io/mip-splatting/) 的 EWA 滤波器以消除锯齿。默认情况下它是禁用的,但您可以在使用 `train.py` 在场景上进行训练或使用 `render.py` 进行渲染时通过添加 `--antialiasing` 来启用它。抗锯齿可以在 SIBR 查看器中切换,默认情况下是禁用的,但在查看使用 `--antialiasing` 训练的场景时应该启用它。 ![aa](/assets/aa_onoff.gif) *此场景使用 `--antialiasing` 训练*。 ### SIBR: 俯视图 `Top view`(俯视图)在另一个视图中渲染 SfM 点云以及相应的输入相机和 `Point view` 用户相机。例如,这允许查看查看器距离输入相机有多远。 它是一个 3D 视图,因此用户可以像在 `Point view` 中一样在其中导航(可用模式:FPS、轨迹球、轨道)。 ![俯视图打开](https://raw.githubusercontent.com/graphdeco-inria/gaussian-splatting/main/assets/top_view_open.gif) 提供了用于自定义此视图的选项,网格可以被禁用/启用,并且可以修改其比例。 ![俯视图选项](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/1f29dfd1b4014451.gif) 一个有用的附加功能是移动到输入图像的位置,并逐渐淡出到该位置的 SfM 点视图(例如,以验证相机对齐)。输入相机的视图可以在 `Top view` 中显示(*请注意,必须在命令行中设置 `--images-path`*)。可以通过单击 `Top view settings > Cameras > Snap to closest` 将 `Top view` 相机从 `Point view` 中的用户相机对齐到最近的输入相机。 ![俯视图图像 alpha](https://raw.githubusercontent.com/graphdeco-inria/gaussian-splatting/main/assets/top_view_image_alpha.gif) ### OpenXR 支持 OpenXR 在分支 `gaussian_code_release_openxr` 中受支持 在该分支中,您可以在[此处](https://gitlab.inria.fr/sibr/sibr_core/-/tree/gaussian_code_release_openxr?ref_type=heads)找到 VR 支持的文档。 ## 常见问题解答 - *我从哪里获取数据集,例如 ```full_eval.py``` 中引用的那些?* MipNeRF360 数据集由原论文作者在项目网站上提供。请注意,其中两个数据集无法公开共享,需要您直接咨询作者。对于 Tanks&Temples 和 Deep Blending,请使用页面顶部提供的下载链接。或者,您可以从 [HuggingFace](https://huggingface.co/camenduru/gaussian-splatting) 访问克隆的数据(状态:2023 年 8 月!) - *如何将其用于更大的数据集,例如城市街区?* 当前方法不是为此设计的,但如果有足够的内存,它应该可以工作。然而,该方法在多尺度细节场景(极近特写与远距离镜头混合)中可能会遇到困难。这种情况通常发生在例如驾驶数据集中(近处的汽车,远处的建筑物)。对于此类场景,您可以降低 ```--position_lr_init```、```--position_lr_final``` 和 ```--scaling_lr```(x0.3、x0.1、...)。场景越广阔,这些值就应该越低。下面,我们使用默认学习率(左)和 ```--position_lr_init 0.000016 --scaling_lr 0.001"```(右)。 | ![默认学习率结果](assets/worse.png "title-1") | ![降低学习率结果](assets/better.png "title-2") | | --- | --- | - *我在 Windows 上无法构建子模块,我该怎么办?* 考虑按照[此处](https://www.youtube.com/watch?v=UXtuigy_wYc)精彩视频教程中的步骤进行操作,希望它们会有所帮助。执行步骤的顺序很重要!或者,考虑使用链接的 Colab 模板。 - *仍然不起作用。它说了一些关于 ```cl.exe``` 的事情。我该怎么办?* 用户 Henry Pearce 找到了一个解决方法。您可以尝试将 Visual Studio 路径添加到您的环境变量中(您的版本号可能不同); ```C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64``` 然后确保启动一个新的 conda 提示符并 cd 到您的仓库位置并尝试此操作; ``` conda activate gaussian_splatting cd /gaussian-splatting pip install submodules\diff-gaussian-rasterization pip install submodules\simple-knn ``` - *我在 macOS/Puppy Linux/Greenhat 上无法构建,我该怎么办?* 抱歉,我们无法为本 README 中列出的平台之外的平台提供支持。考虑使用链接的 Colab 模板。 - *我没有 24 GB 的 VRAM 用于训练,我该怎么办?* VRAM 消耗取决于正在优化的点的数量,该数量会随时间增加。如果您只想训练到 7k 次迭代,您需要的将显著减少。要执行完整的训练例程并避免内存不足,您可以增加 ```--densify_grad_threshold```、```--densification_interval``` 或减小 ```--densify_until_iter``` 的值。但请注意,这会影响结果的质量。还尝试将 ```--test_iterations``` 设置为 ```-1``` 以避免测试期间的内存峰值。如果 ```--densify_grad_threshold``` 非常高,则不应发生致密化,并且如果场景本身加载成功,训练应该可以完成。 - *用于参考质量训练的 24 GB VRAM 仍然很多!我们不能用更少的内存来完成吗?* 是的,极有可能。根据我们的计算,它应该可以在**远**低于此的内存(约 8GB)下实现。如果我们能找到时间,我们将尝试实现这一点。如果某位 PyTorch 老手想要解决这个问题,我们期待您的 pull request! - *如何在我自己的项目中使用可微分高斯光栅化器?* 很简单,它作为子模块 ```diff-gaussian-rasterization``` 包含在此仓库中。请随意检出并安装该包。它并没有真正的文档,但从 Python 端使用它非常简单(参见 ```gaussian_renderer/__init__.py```)。 - *等等,但是 `````` 并没有经过优化,而且可以做得更好?* 有几个部分我们甚至没有时间考虑改进(目前为止)。您使用此原型获得的性能对于物理上可能的性能来说可能是一个相当缓慢的基线。 - *有些东西坏了,这是怎么发生的?* 我们努力提供一个坚实且易于理解的基础,以便利用论文的方法。我们已经对代码进行了相当多的重构,但我们测试所有可能的使用场景的能力有限。因此,如果部分网站、代码或性能有所欠缺,请创建一个 issue。如果我们能找到时间,我们将尽最大努力解决它。
标签:3D Gaussian Splatting, 3D高斯溅射, Apex, Bash脚本, C++, CUDA, NeRF, Python, SLAM, Vectored Exception Handling, 三维视觉, 三维重建, 凭据扫描, 图形渲染, 场景重建, 增强现实, 多视角立体视觉, 实时渲染, 数据擦除, 新视角合成, 无后门, 机器学习, 深度学习, 点云处理, 神经辐射场, 虚拟现实, 计算机图形学, 计算机视觉, 辐射场, 逆向工具