尧图精选

3DGS三维高斯泼溅实战:从NeRF到实时渲染的完整指南

🕒 发布时间:2026/10/1 9:32:30 📁 来源:尧图网络
1. 从NeRF到3DGS一场渲染效率的降维打击2023年夏天当整个三维重建圈子还在为NeRF那套体渲染管线反复调参、苦等几十小时训练结果的时候SIGGRAPH上冒出来一篇叫3D Gaussian Splatting的论文直接在圈子里炸了锅。我印象特别深当时我们组正在做一个室内场景的快速重建项目用NeRF跑一个普通房间单卡A100训练了将近二十个小时渲染一帧还要等好几秒。结果3DGS出来之后同样的场景训练时间压缩到十几分钟渲染帧率直接飙到一百以上。那种感觉就像你一直以为从北京到上海只能坐绿皮火车突然有人告诉你高铁已经修好了。3DGS全称3D Gaussian Splatting中文一般叫三维高斯泼溅或者三维高斯散射。它的核心思路和NeRF完全不同——NeRF用神经网络隐式地表示整个场景的密度场和颜色场而3DGS用一大堆三维高斯椭球体来显式地表示场景。每个高斯椭球有自己的位置、形状协方差矩阵、不透明度和颜色用球谐函数表示。渲染的时候把这些高斯椭球投影到屏幕上然后做alpha混合就能得到最终的图像。这个思路其实不新鲜九十年代就有类似的想法但当时没有好的优化手段效果很差。3DGS的贡献在于它设计了一套完整的可微渲染管线让这些高斯椭球的参数可以通过反向传播来优化同时用了一套基于tile的快速光栅化方案把渲染速度做到了实时。那它到底解决了什么问题简单说它解决了NeRF在实际落地中最要命的三个问题训练太慢、渲染太慢、编辑太难。NeRF的训练通常需要几小时到几十小时渲染一帧要几秒甚至几十秒而且因为场景信息被编码在神经网络的权重里你想改个东西几乎无从下手。3DGS把训练时间压到几分钟到几十分钟渲染速度做到实时1080p下超过100FPS而且因为场景是显式表示的你可以直接选中某个高斯椭球去移动、删除、缩放编辑起来非常直观。这三个问题一解决三维重建从实验室走向实际应用的门就打开了。如果你正在做三维重建、SLAM、数字孪生、虚拟现实或者任何需要快速把真实场景搬到数字世界里的项目3DGS都值得你花时间深入研究。哪怕你之前完全没接触过神经渲染只要对三维图形学有基本了解跟着代码跑一遍也能很快上手。接下来我会从它解决的问题出发把核心原理、实操流程、常见坑点都拆开讲清楚。2. 核心问题拆解NeRF到底卡在哪里2.1 NeRF的隐式表示为什么慢要理解3DGS解决了什么问题得先搞清楚NeRF为什么慢。NeRF的核心是一个多层感知机MLP输入是一个三维坐标加上一个观察方向输出是这个点的密度和颜色。渲染一张图的时候需要从相机光心出发对每个像素发射一条光线在这条光线上采样几百个点每个点都要过一遍MLP然后做体渲染积分。一张1080p的图有兩百多万个像素每个像素采样几百个点那就是几亿次MLP前向推理。这还只是渲染训练的时候还要反向传播计算量更大。我拿一个具体例子来说明。假设你用NeRF跑一个中等复杂度的场景比如一个摆了几十件物品的客厅。训练集大概一百多张图分辨率降到800x600。在单张RTX 3090上用标准的NeRF管线大概需要12到24小时才能收敛到一个可用的效果。渲染的时候800x600分辨率下每帧大概需要0.5到2秒。这个速度做离线渲染勉强能接受但如果你想做交互式的场景浏览或者把重建结果用到VR里那完全不够看。更麻烦的是NeRF的隐式表示让场景编辑变得极其困难。你想把场景里的一个椅子挪个位置对不起椅子的信息分散在MLP的几十万个权重里你根本不知道改哪些权重能实现这个操作。你想把场景里的某个物体删掉同样无从下手。这就导致NeRF虽然重建质量很高但在需要交互和编辑的场景里几乎没法用。2.2 3DGS的显式表示如何破局3DGS换了一个完全不同的思路。它不用神经网络来表示场景而是用一堆三维高斯椭球。每个高斯椭球有这些参数位置三个浮点数、协方差矩阵决定椭球的形状和朝向通常用四元数加缩放来表示共七个浮点数、不透明度一个浮点数、颜色用球谐函数表示根据阶数不同通常是三到四十八个浮点数。一个中等复杂度的场景大概需要一百万到五百万个高斯椭球。这些参数都是显式存储的你可以直接读取、修改、删除。渲染的时候3DGS把这些高斯椭球按照深度排序然后投影到屏幕上。每个高斯椭球在屏幕上形成一个二维高斯分布然后按照从后往前的顺序做alpha混合。这个过程可以用GPU的光栅化管线高效实现因为每个高斯椭球的影响范围是局部的不需要像NeRF那样对每个像素做几百次MLP推理。这就是为什么3DGS能跑到实时帧率。训练的时候3DGS用一组已知相机位姿的图片作为输入。它从一组稀疏点云开始通常用COLMAP的SfM结果初始化然后通过可微渲染计算渲染图像和真实图像的差异反向传播来优化每个高斯椭球的参数。同时它还设计了一套自适应密度控制机制在重建不好的区域分裂或者克隆高斯椭球在过度重建的区域删除多余的高斯椭球。这套机制让高斯椭球的分布能自动适应场景的复杂度。2.3 训练和渲染速度的量化对比光说快可能不够直观我拿实际跑过的数据来对比。同一个场景大概一百二十张图分辨率1600x1200用COLMAP做完SfM之后指标NeRF标准管线3DGS官方实现训练时间18-24小时15-25分钟渲染帧率1080p0.5-2 FPS100-150 FPS显存占用训练8-12 GB6-10 GB显存占用渲染4-6 GB1-2 GB场景编辑几乎不可能直接操作高斯椭球重建质量PSNR31-33 dB30-32 dB从表里能看出来3DGS在训练和渲染速度上是碾压性的优势重建质量略低一点但差距不大。显存占用也更友好尤其是渲染阶段1-2GB的显存意味着你可以在移动端或者VR头显上跑。场景编辑能力更是NeRF完全没法比的。注意这里的训练时间对比是基于单张RTX 3090实际时间会随场景复杂度、图片数量、迭代次数变化。3DGS官方实现默认跑30000次迭代大概15-25分钟。如果你把迭代次数降到7000次5-8分钟就能出一个粗略结果质量会差一些但可以用来快速预览。3. 3DGS核心技术点深度拆解3.1 三维高斯椭球的数学表示3DGS里每个高斯椭球的数学形式是这样的给定一个三维坐标x这个高斯椭球在x处的值由下面的公式给出G(x) exp(-0.5 * (x - μ)^T * Σ^(-1) * (x - μ))其中μ是椭球的中心位置Σ是协方差矩阵。协方差矩阵必须是半正定的为了保证这一点3DGS把Σ分解成Σ R * S * S^T * R^T其中R是旋转矩阵用四元数表示S是缩放矩阵对角矩阵对角线元素是三个轴的缩放因子。这样优化的时候只需要优化四元数和缩放因子不用直接优化协方差矩阵避免了矩阵不正定的问题。这个分解还有一个好处它让椭球的形状和朝向变得可解释。四元数控制椭球的旋转缩放因子控制椭球在三个轴上的长度。你可以直接调整这些参数来改变椭球的形状比如把一个扁平的椭球拉长或者旋转一个椭球让它对齐某个平面。球谐函数用来表示颜色这是为了处理视角相关的外观变化。比如金属表面在不同角度下颜色不一样用球谐函数可以表示这种变化。球谐函数的阶数越高能表示的视角相关效果越复杂。3DGS默认用三阶球谐函数每个颜色通道有16个系数三个通道一共48个系数。如果你不需要视角相关效果可以用零阶球谐函数每个通道只有一个系数参数数量大幅减少。3.2 可微光栅化管线的实现细节3DGS的渲染管线是整个方法里最核心的工程贡献。它把三维高斯椭球投影到屏幕上的过程做成了可微的这样才能通过反向传播来优化参数。具体来说渲染一张图分这几步第一步视锥剔除。把那些在相机视锥之外的高斯椭球直接扔掉减少计算量。这一步能过滤掉大概一半到三分之二的高斯椭球取决于相机朝向。第二步投影到屏幕空间。把每个三维高斯椭球的协方差矩阵投影到二维屏幕空间得到一个二维协方差矩阵。这个投影过程用到了雅可比矩阵因为透视投影是非线性的需要用局部线性近似。投影之后每个高斯椭球在屏幕上就是一个二维高斯分布。第三步按tile分块。把屏幕分成16x16的tile每个tile独立处理。对每个tile找出所有和这个tile有重叠的高斯椭球按深度排序。这一步是并行的每个tile可以独立计算充分利用GPU的并行能力。第四步alpha混合。对每个像素按照从后往前的顺序把覆盖这个像素的高斯椭球做alpha混合。混合公式和传统的体渲染类似但因为是显式表示不需要采样直接按排序后的顺序累加就行。这套管线的关键优化在于tile分块和排序。因为每个tile只处理和自己相关的高斯椭球计算量大幅减少。而且排序是在tile级别做的比全局排序快很多。官方实现里这一步是用CUDA写的自定义光栅化器速度非常快。3.3 自适应密度控制的策略3DGS的另一个核心创新是自适应密度控制。训练过程中高斯椭球的分布会动态调整让它们更好地覆盖场景的细节。具体来说每隔一定迭代次数默认是100次会做一次密度控制对于重建不好的区域梯度大的高斯椭球如果椭球太小就克隆一个相同大小的椭球如果椭球太大就分裂成两个更小的椭球。克隆和分裂的区别在于克隆是在原位置复制一个椭球适合那些需要更多细节但位置已经对了的区域分裂是把一个大的椭球拆成两个小的适合那些覆盖范围太大导致细节丢失的区域。对于过度重建的区域不透明度太低的高斯椭球直接删除。不透明度太低意味着这个椭球对最终图像的贡献很小留着只是浪费计算资源。这套机制让高斯椭球的数量能自动适应场景复杂度。简单场景可能只需要几十万个椭球复杂场景可能需要几百万个。而且椭球的分布会集中在细节丰富的区域比如物体的边缘、纹理复杂的表面而平坦区域只需要少量大椭球就能覆盖。实操心得密度控制的参数对最终效果影响很大。默认的densify_grad_threshold是0.0002如果你发现重建结果在细节区域有模糊可以把这个值调小让更多椭球被克隆或分裂。但调太小会导致椭球数量爆炸训练变慢显存占用增加。我一般会先跑默认参数看效果再微调。4. 实操流程从图片到实时渲染的完整链路4.1 环境准备与依赖安装3DGS的官方实现依赖CUDA所以你需要一张NVIDIA显卡。官方推荐CUDA 11.8或更高版本我实测CUDA 12.x也能跑但需要对应版本的PyTorch。显卡方面RTX 3060 12GB就能跑中等场景RTX 4090或者A100跑大场景更从容。显存建议至少8GB复杂场景建议12GB以上。安装步骤大概是这样# 创建conda环境 conda create -n gaussian_splatting python3.10 conda activate gaussian_splatting # 安装PyTorch根据你的CUDA版本选择 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装其他依赖 pip install plyfile tqdm opencv-python # 克隆官方仓库 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive # 编译CUDA扩展 cd gaussian-splatting pip install submodules/diff-gaussian-rasterization pip install submodules/simple-knn编译CUDA扩展的时候最容易出问题。常见错误是CUDA版本和PyTorch版本不匹配或者gcc版本太新导致编译失败。如果你用的是Ubuntu 20.04默认gcc是9.4一般没问题。Ubuntu 22.04默认gcc是11可能需要降级到10或者9。另外如果你在WSL2里跑需要确保WSL2的CUDA驱动装好了nvidia-smi能正常输出。注意编译diff-gaussian-rasterization的时候如果报错说找不到cuda_runtime.h检查一下CUDA_HOME环境变量有没有设对。一般是/usr/local/cuda-11.8或者/usr/local/cuda-12.x。设好之后重新编译。4.2 数据准备与COLMAP位姿估计3DGS需要输入一组图片和对应的相机位姿。相机位姿通常用COLMAP做SfM来估计。如果你有自己的数据集比如用手机拍的视频可以抽帧成图片然后跑COLMAP。COLMAP的安装可以用aptsudo apt install colmap跑COLMAP的流程是先做特征提取然后做特征匹配最后做增量式SfM。命令行大概是这样# 特征提取 colmap feature_extractor --database_path database.db --image_path images # 特征匹配 colmap exhaustive_matcher --database_path database.db # 稀疏重建 mkdir sparse colmap mapper --database_path database.db --image_path images --output_path sparse跑完之后sparse/0/目录下会有cameras.bin、images.bin、points3D.bin三个文件。3DGS的官方代码里有一个convert.py脚本可以把COLMAP的输出转成3DGS需要的格式。转换之后数据目录下会有images/和sparse/0/两个子目录。如果你没有自己的数据可以用官方提供的示例数据集比如Mip-NeRF 360或者Tanks and Temples。这些数据集已经做好了COLMAP直接下载就能用。实操心得COLMAP的位姿估计质量直接影响3DGS的重建效果。如果COLMAP跑出来的位姿不准3DGS训练出来的结果会模糊或者有鬼影。我一般会检查COLMAP的reprojection error如果平均误差超过1个像素就要考虑重新跑或者调整COLMAP的参数。另外拍摄的时候尽量保证图片有足够的重叠相邻图片之间至少要有60%的重叠区域。4.3 训练参数配置与启动3DGS的训练脚本是train.py基本用法python train.py -s /path/to/data -m /path/to/output其中-s指定数据目录-m指定输出目录。训练过程中每7000次迭代会保存一次checkpoint最终输出是point_cloud/iteration_30000/point_cloud.ply这个文件包含了所有高斯椭球的参数。关键参数有几个--iterations总迭代次数默认30000。降到7000可以快速预览质量会差一些。--densify_grad_threshold密度控制的梯度阈值默认0.0002。调小会让更多椭球被克隆或分裂。--densify_until_iter在多少次迭代之前做密度控制默认15000。之后不再增加椭球数量只优化参数。--position_lr_init位置的学习率默认0.00016。如果训练不稳定可以调小。--sh_degree球谐函数阶数默认3。降到0可以大幅减少参数数量但会丢失视角相关效果。训练过程中可以用TensorBoard监控loss曲线tensorboard --logdir /path/to/outputloss曲线一般会在前几千次迭代快速下降然后逐渐趋于平稳。如果loss震荡很厉害可能是学习率太大如果loss下降很慢可能是学习率太小或者密度控制参数不合适。4.4 渲染与可视化训练完之后可以用官方提供的render.py来渲染测试视角python render.py -m /path/to/output渲染结果会保存在output目录下的train/和test/子目录里。如果你想实时交互式查看可以用SIBR Viewer这是官方提供的一个实时查看器支持Windows和Linux。编译SIBR Viewer需要CMake和OpenGL编译过程稍微麻烦一点但编译好之后用起来很爽可以实时旋转、缩放、平移视角帧率能跑到100以上。如果你不想编译SIBR Viewer也可以用一些第三方的查看器比如antimatter15的splat viewer是一个基于WebGL的网页查看器直接把ply文件拖进去就能看。不过网页查看器的性能不如原生查看器复杂场景可能会卡。注意渲染的时候如果发现某些视角下有明显的伪影或者漂浮物可能是训练不充分或者密度控制没做好。可以尝试增加迭代次数或者调整densify_grad_threshold。另外如果场景里有大面积的无纹理区域比如白墙3DGS可能会在这些区域产生一些漂浮的高斯椭球这是正常现象可以通过后处理过滤掉。5. 常见问题与排查技巧实录5.1 训练不收敛或者loss震荡这是最常见的问题之一。表现是loss曲线上下震荡或者loss下降很慢最终重建结果模糊。原因可能有几个学习率太大。3DGS的位置学习率默认是0.00016如果场景尺度比较大这个学习率可能偏大。可以尝试降到0.0001或者0.00008。另外位置学习率有一个指数衰减策略默认每1000次迭代衰减到原来的0.01倍这个衰减策略对训练稳定性很重要不要随便改。密度控制太激进。如果densify_grad_threshold设得太小大量椭球被克隆或分裂参数数量爆炸训练会变得不稳定。建议先用默认值0.0002跑一遍看效果再调。COLMAP位姿不准。如果COLMAP的位姿有较大误差3DGS训练的时候会试图用高斯椭球去补偿位姿误差导致重建结果模糊。检查COLMAP的reprojection error如果太大就重新跑COLMAP。5.2 显存不足OOM3DGS训练的时候显存占用和场景复杂度、图片分辨率、椭球数量都有关系。如果显存不够可以尝试这些方法降低图片分辨率。3DGS默认会把图片降采样到1600像素宽你可以改成1200或者800。在train.py里有一个--resolution参数设成-1表示用原始分辨率设成1表示降采样到1/2设成2表示降采样到1/4。减少椭球数量。把densify_grad_threshold调大比如从0.0002调到0.0004让更少的椭球被克隆或分裂。或者把densify_until_iter调小比如从15000调到10000提前停止密度控制。用更小的球谐函数阶数。把sh_degree从3降到1或者0参数数量大幅减少。零阶球谐函数每个颜色通道只有一个系数相比三阶的16个系数参数数量减少了90%以上。5.3 渲染结果有漂浮物或伪影漂浮物是3DGS的一个常见问题尤其是在场景边缘或者无纹理区域。这些漂浮的高斯椭球通常是因为训练不充分或者密度控制不合理产生的。解决方法增加训练迭代次数。默认30000次可能不够可以加到40000或者50000。但要注意迭代次数太多可能会导致过拟合测试视角的效果反而变差。调整密度控制参数。把densify_grad_threshold调大减少不必要的克隆和分裂。或者把densify_until_iter调小让椭球数量早点稳定下来。后处理过滤。训练完之后可以写一个脚本过滤掉那些不透明度太低或者尺寸异常的高斯椭球。官方代码里有一个filter.py的示例可以参考。5.4 CUDA版本兼容性问题CUDA版本兼容性是3DGS部署中最头疼的问题之一。官方代码是在CUDA 11.8下开发的如果你用CUDA 12.x可能会遇到编译错误或者运行时错误。常见问题和解决方法编译diff-gaussian-rasterization时报错。检查PyTorch的CUDA版本和系统CUDA版本是否一致。用python -c import torch; print(torch.version.cuda)查看PyTorch的CUDA版本用nvcc --version查看系统CUDA版本。如果不一致重新安装对应版本的PyTorch。运行时提示CUDA error: no kernel image is available for execution on the device。这是因为编译的时候用的CUDA架构和你的显卡架构不匹配。在setup.py里有一个compute_capability参数需要设成你显卡的架构。比如RTX 4090是8.9RTX 3090是8.6RTX 2080是7.5。设好之后重新编译。WSL2下CUDA不可用。确保WSL2的CUDA驱动装好了nvidia-smi能正常输出。如果nvidia-smi报错可能需要更新Windows端的NVIDIA驱动或者重新安装WSL2的CUDA toolkit。5.5 常见问题速查表问题现象可能原因解决方法训练loss震荡学习率太大降低position_lr_init到0.0001重建结果模糊COLMAP位姿不准检查reprojection error重新跑COLMAP显存不足椭球数量太多降低分辨率调大densify_grad_threshold渲染有漂浮物训练不充分增加迭代次数后处理过滤CUDA编译报错版本不匹配检查PyTorch和系统CUDA版本渲染帧率低椭球数量太多降低sh_degree过滤不透明度低的椭球场景边缘有伪影密度控制太激进调大densify_grad_threshold训练时间太长迭代次数太多降到7000次快速预览6. 3DGS在SLAM和机器人领域的落地思考6.1 3DGS与SLAM的结合点SLAM同步定位与建图和3DGS的结合是最近的一个热门方向。传统的视觉SLAM用稀疏点云或者稠密点云来建图地图的表示能力有限渲染出来的效果比较粗糙。3DGS的显式表示和实时渲染能力让SLAM系统可以构建出高质量、可实时渲染的稠密地图。具体来说3DGS可以用在SLAM的几个环节一是建图用3DGS替代传统的点云地图构建出更逼真的三维场景二是渲染用3DGS的实时渲染能力做AR/VR应用把虚拟物体叠加到真实场景里三是重定位用3DGS渲染出来的图像做特征匹配提高重定位的鲁棒性。不过3DGS和SLAM的结合还面临一些挑战。3DGS的训练需要已知的相机位姿而SLAM的位姿估计是在线的两者需要联合优化。另外3DGS的训练速度虽然比NeRF快很多但要做到在线增量式训练还需要进一步优化。目前有一些工作在做这方面的探索比如用滑动窗口的方式增量式地更新高斯椭球或者用因子图把位姿估计和3DGS训练联合起来优化。6.2 在机器人导航中的应用潜力机器人导航需要实时的环境感知和地图构建。传统的激光雷达SLAM或者视觉SLAM构建的地图通常是栅格地图或者点云地图对于路径规划和避障够用但对于人机交互或者远程操作来说地图的可视化效果不够直观。3DGS构建的高质量三维地图可以让操作员通过VR头显沉浸式地查看机器人周围的环境提高远程操作的效率和安全性。另外3DGS的实时渲染能力也可以用在机器人的仿真环境里。传统的机器人仿真用CAD模型或者网格模型构建成本高而且和真实环境的差距大。用3DGS重建真实环境可以快速构建出高保真的仿真场景用于强化学习训练或者算法验证。不过3DGS在机器人上的部署还面临算力限制。机器人的计算平台通常是嵌入式GPU或者NPU算力有限。3DGS的渲染虽然比NeRF快很多但在嵌入式平台上跑实时渲染还是有压力。目前有一些工作在优化3DGS的渲染效率比如用更紧凑的高斯表示、更高效的光栅化算法或者用模型压缩技术减少椭球数量。6.3 自己制作数据集的实操建议如果你想用自己的数据跑3DGS比如用手机拍一段视频然后重建有几个实操建议拍摄的时候尽量保持相机稳定避免剧烈晃动。3DGS对位姿误差比较敏感晃动太厉害会导致COLMAP位姿估计不准。可以用手机稳定器或者手持云台。拍摄轨迹尽量覆盖场景的各个角度。3DGS需要从多个视角观察同一个区域才能重建出好的效果。如果只从一个方向拍背面的区域重建质量会很差。光线尽量均匀避免强烈的阴影或者高光。3DGS对光照变化比较敏感如果拍摄过程中光照变化太大重建结果会有颜色不一致的问题。图片数量控制在100到300张之间。太少会导致覆盖不足太多会导致COLMAP和3DGS的训练时间变长。如果场景比较大可以分区域拍摄然后分别重建再合并。抽帧的时候相邻帧之间要有足够的重叠。一般建议每秒钟抽2到5帧具体取决于相机的移动速度。移动快就多抽几帧移动慢就少抽几帧。实操心得我自己用iPhone拍过几个场景发现用4K 60fps拍摄然后每0.5秒抽一帧效果比较好。抽帧之后用COLMAP跑SfM一般能跑到0.5到1个像素的reprojection error。如果error太大可以尝试用COLMAP的bundle adjustment重新优化或者手动剔除一些质量差的图片。7. 我踩过的坑和最后分享的几个技巧7.1 那些让我熬夜的坑第一个坑是CUDA版本。我第一次装3DGS的时候系统里装的是CUDA 12.1PyTorch装的是CUDA 11.8的版本编译diff-gaussian-rasterization的时候一直报错。折腾了大半天才发现是版本不匹配。后来把PyTorch换成CUDA 12.1的版本重新编译就好了。所以一定要确保PyTorch的CUDA版本和系统CUDA版本一致。第二个坑是COLMAP的位姿质量。有一次我用手机拍了一个房间跑完COLMAP之后直接扔给3DGS训练结果重建出来全是模糊的。后来检查COLMAP的reprojection error发现平均误差有2.3个像素明显偏大。重新跑了一遍COLMAP把一些模糊的图片剔除了error降到0.8个像素3DGS的重建效果就好了很多。第三个坑是显存不足。有一次跑一个比较大的场景图片分辨率是4000x3000椭球数量涨到八百万24GB的RTX 3090都爆显存了。后来把分辨率降到1600x1200椭球数量控制在三百万以内就顺利跑完了。所以分辨率不是越高越好要根据显存和场景复杂度权衡。7.2 几个提升效果的小技巧第一个技巧是分阶段训练。先用低分辨率比如800x600快速跑7000次迭代得到一个粗略的场景结构然后再用高分辨率1600x1200跑30000次迭代做精细优化。这样比直接跑高分辨率快很多而且最终效果差不多。第二个技巧是手动调整密度控制参数。默认的densify_grad_threshold是0.0002对于细节丰富的场景可以降到0.0001让更多椭球被克隆或分裂。对于大面积平坦的场景可以升到0.0004减少不必要的椭球。我一般会先跑默认参数看重建结果如果细节区域模糊就调小如果椭球数量太多就调大。第三个技巧是后处理过滤漂浮物。训练完之后可以写一个简单的脚本读取point_cloud.ply过滤掉那些不透明度低于0.05或者尺寸异常比如某个轴的缩放因子大于场景尺度的10%的高斯椭球。过滤之后重新保存渲染效果会干净很多。第四个技巧是用TensorBoard监控训练过程。除了loss曲线还可以监控椭球数量的变化。正常情况下椭球数量会在前15000次迭代逐渐增加然后趋于稳定。如果椭球数量一直增长不收敛说明密度控制参数太激进需要调大densify_grad_threshold。7.3 后续可以扩展的方向3DGS本身还有很多可以优化的地方。比如动态场景的重建目前3DGS主要针对静态场景如果要处理动态场景需要引入时间维度让高斯椭球的位置和形状随时间变化。已经有一些工作在探索这个方向比如用变形场或者时间条件的高斯椭球。另一个方向是压缩。3DGS的模型文件通常比较大一个中等场景的point_cloud.ply可能有几百MB到几GB。如果要部署到移动端或者网页端需要压缩。目前有一些工作在用量化、剪枝、熵编码等方法来压缩3DGS模型可以把模型大小压缩到原来的十分之一甚至更小。还有一个方向是和SLAM的深度融合。目前3DGS和SLAM的结合还比较初步大部分工作是把SLAM的位姿输出给3DGS做离线重建。未来如果能把3DGS的训练嵌入到SLAM的在线流程里实现实时的增量式重建那对于AR/VR和机器人应用来说会非常有价值。我个人在实际操作中的体会是3DGS最大的价值在于它把高质量三维重建的门槛降到了普通开发者也能接受的程度。以前做三维重建要么用昂贵的激光扫描设备要么用复杂的多视图立体视觉管线要么用训练慢到让人崩溃的NeRF。3DGS用一张消费级显卡、几十分钟的训练时间就能得到一个可以实时渲染的高质量三维场景。这个效率提升是革命性的它让三维重建从实验室走向了实际应用。如果你还没试过3DGS强烈建议找一个周末跑一遍官方示例感受一下从图片到实时三维场景的完整流程。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →