尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

3D高斯泼溅(3DGS)实战指南:从原理到部署,快速实现三维重建与实时渲染

3D高斯泼溅(3DGS)实战指南:从原理到部署,快速实现三维重建与实时渲染 1. 高斯泼溅到底是个什么东西1.1 从“拍一圈照片就能建模”说起如果你接触过三维重建大概率听过这样一个说法拿手机绕着一个物体拍几十张照片就能在电脑里生成一个可以旋转、缩放、甚至漫游的三维模型。这个愿景听起来很美好但真正上手过的人都知道传统摄影测量或者早期的神经辐射场方案要么慢得让人抓狂要么对硬件要求高得离谱。高斯泼溅英文叫 3D Gaussian Splatting圈内一般简称 3DGS是 2023 年 SIGGRAPH 上冒出来的一套三维重建与实时渲染方案。它的核心卖点非常直接把原本需要几个小时甚至十几个小时才能完成的重建和渲染流程压缩到几分钟级别同时在画质上还能跟当时最火的 NeRF 掰手腕。这个“速度提升一个数量级”的说法不是营销话术而是实打实的工程结果。我第一次跑通 3DGS 的官方代码时用的是一张 RTX 3060 12G 的卡。训练一个中等复杂度的场景大概十几分钟就出了可交互的结果而同样场景用 NeRF 系的方案我前一天晚上挂机跑了一整夜。这种体感上的差距是让我决定认真研究它的直接原因。那么它到底适合谁如果你是做三维重建、数字孪生、游戏资产、虚拟拍摄、电商展示、文物数字化这类工作的3DGS 基本是绕不开的一个工具。哪怕你只是对三维视觉感兴趣想自己动手做一个能实时旋转的小场景它也是目前门槛相对友好、反馈最快的一条路。1.2 一句话讲清它的本质用一堆“会发光的椭球”拼出场景要理解 3DGS先得放下传统网格模型的概念。传统三维模型是由三角面片组成的表面是硬的、有明确边界的。而 3DGS 完全不是这个路子。它把整个场景表示成一大堆三维高斯分布你可以把它们想象成一个个半透明的、会发光的椭球。每个椭球有自己的位置、大小、旋转方向、颜色和不透明度。当你要渲染某个视角时就把这些椭球按照深度排序然后像画水彩一样一层层“泼”到屏幕上混合出最终的画面。这也是“泼溅”这个名字的由来——它不是画线框也不是贴纹理而是把一堆带颜色的椭球投影到二维平面上叠加。这个表示方式有几个非常关键的好处。第一它天然是显式的不像 NeRF 那样把场景藏在神经网络的权重里你想看哪个椭球、想改哪个椭球直接操作数据就行。第二它的渲染可以用 GPU 的光栅化管线来做速度极快这也是它能做到实时交互的根本原因。第三它的训练过程本质上是可微的也就是说可以通过梯度下降去优化每个椭球的参数让最终渲染出来的画面和真实照片越来越像。提示很多人第一次听到“高斯”会以为是统计学里的正态分布其实在 3DGS 里三维高斯就是一个空间中的椭球形状的概率密度函数用来描述一个“点”在空间中的影响范围。理解成椭球就够了不必纠结数学细节。2. 为什么它能把速度提升一个数量级2.1 NeRF 的瓶颈在哪里要讲清楚 3DGS 为什么快必须先说清楚 NeRF 为什么慢。NeRF全称神经辐射场它的思路是训练一个多层感知机输入是空间中的一个三维坐标加一个观察方向输出是这个点的颜色和密度。渲染一张图的时候需要从相机出发对每个像素发射一条光线沿着光线采样几百个点每个点都送进神经网络算一遍最后积分出像素颜色。这个过程的计算量是恐怖的。一张 800x600 的图有 48 万个像素每个像素采样 128 个点那就是六千多万次神经网络前向推理。训练的时候还要反向传播计算量再翻几倍。所以 NeRF 训练一个场景动辄十几个小时渲染一帧也要好几秒根本谈不上实时。后来出现了一些加速方案比如把场景切成网格预计算、用哈希编码降低网络规模速度确实提升了不少但本质上还是“逐像素采样神经网络查询”的框架天花板摆在那里。2.2 3DGS 的三板斧显式表示、光栅化、自适应密度控制3DGS 的快来自三个层面的设计缺一不可。第一板斧是显式表示。场景不再藏在神经网络里而是一组实实在在的参数每个高斯有 59 个参数包括位置 xyz、缩放 xyz、旋转四元数 wxyz、不透明度 alpha、球谐系数用来表示不同视角下的颜色。这些参数直接存在显存里渲染时不需要任何神经网络推理只是查表加计算。第二板斧是光栅化渲染。它借用了游戏显卡最擅长的光栅化管线。把每个三维高斯投影到屏幕上变成一个二维椭圆然后按深度排序用 alpha 混合叠加。这个过程 GPU 做起来飞快因为光栅化本来就是显卡的本职工作。实测下来一个训练好的场景在 1080p 分辨率下跑到 100 帧以上是很轻松的。第三板斧是自适应密度控制。训练过程中系统会根据梯度信息自动决定在哪里增加高斯、在哪里删除高斯、哪些高斯需要分裂成更小的。场景细节多的地方高斯就密集空旷的地方高斯就稀疏。这个机制让高斯数量能自动匹配场景复杂度既不会浪费算力也不会丢失细节。这三者叠加起来训练时间从小时级降到分钟级渲染从秒级降到毫秒级说提升一个数量级其实是保守的。2.3 一张表看清 NeRF 和 3DGS 的差异对比维度NeRF 系方案3DGS场景表示神经网络隐式表示显式高斯点云渲染方式逐像素光线采样GPU 光栅化训练时间数小时到数十小时几分钟到几十分钟渲染速度秒级到分钟级实时100 FPS显存占用中等较高高斯数量大时编辑难度难需重新训练易可直接操作高斯画质优秀优秀细节略胜硬件门槛中高端 GPU中高端 GPU显存要求更高这张表是我自己在几个项目里实测总结的具体数字会随场景复杂度和硬件配置浮动但大方向不会错。3. 自己动手跑通一个 3DGS 项目3.1 硬件和环境的准备先说硬件。3DGS 对 GPU 的依赖很重官方代码是基于 CUDA 写的所以必须是 NVIDIA 的卡。显存方面我建议至少 12G 起步8G 也能跑但场景一大就爆显存。我用过 RTX 3060 12G、RTX 4070 Ti 16G 和 RTX 4090 24G体验差距非常明显。4090 上跑一个中等场景训练五分钟出头就收敛了3060 大概要十五到二十分钟。CPU 和内存相对没那么关键但内存建议 32G 以上因为数据加载和预处理阶段会吃不少内存。硬盘最好是 NVMe 固态因为要频繁读写图像和中间结果。软件环境这块官方推荐的是 Ubuntu 20.04 或 22.04CUDA 11.8 以上Python 3.8 到 3.10。Windows 也能跑但坑会多一些尤其是编译 CUDA 扩展的时候。如果你在 Windows 上折腾建议直接用 WSL2能省掉很多麻烦。# 创建虚拟环境 conda create -n gs python3.10 conda activate gs # 安装 PyTorch注意 CUDA 版本要匹配 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 克隆官方仓库 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive cd gaussian-splatting # 安装依赖 pip install -r requirements.txt # 编译 CUDA 扩展这一步最容易出错 pip install submodules/diff-gaussian-rasterization pip install submodules/simple-knn注意编译 CUDA 扩展时一定要确保nvcc --version显示的版本和 PyTorch 用的 CUDA 版本一致。我踩过好几次坑都是版本对不上导致编译失败。另外如果你的卡是比较新的架构比如 sm_89 或 sm_90可能需要手动指定编译架构。3.2 数据集的制作自己拍还是用现成的3DGS 需要的数据输入是一组围绕场景拍摄的照片加上每张照片的相机位姿。相机位姿通常用 COLMAP 这个工具来估计它是摄影测量领域的标准工具。如果你只是想快速体验官方提供了几个预置数据集比如 Mip-NeRF 360 和 Tanks and Temples直接下载就能跑。但如果你想用自己的数据就得走完整的采集和标定流程。拍摄的时候有几个要点。第一照片要有足够的重叠相邻两张至少重叠 70% 以上否则 COLMAP 匹配不上。第二尽量保持光照一致不要一张在阴影里一张在阳光下3DGS 对光照变化比较敏感。第三避免拍摄纯色、反光、透明的物体这些区域 COLMAP 很难提取特征点。第四拍摄路径最好是环绕式的不要只从一个方向拍。我自己拍过一个小雕塑大概拍了 120 张照片用手机拍的分辨率 4000x3000。COLMAP 跑位姿估计花了大概二十分钟然后 3DGS 训练用了十二分钟出来的效果相当不错连雕塑表面的纹理细节都还原出来了。# 用 COLMAP 估计位姿 python convert.py -s /path/to/your/images # 开始训练 python train.py -s /path/to/your/images -m /path/to/output3.3 训练过程中的关键参数3DGS 的训练参数不算多但有几个直接影响结果质量。第一个是迭代次数。官方默认是 30000 次一般场景跑到这个数就收敛了。如果你追求极致画质可以加到 50000但时间会翻倍。我实测下来30000 和 50000 的差距在肉眼层面已经很小了除非你做的是高精度数字化存档。第二个是高斯数量上限。默认没有硬上限但显存会限制你。一个中等场景大概会生成 100 万到 300 万个高斯显存占用在 8G 到 16G 之间。如果你的显存不够可以调低--densify_until_iter参数让高斯提前停止增长。第三个是学习率。位置学习率默认是 0.00016缩放是 0.005旋转是 0.001。这些参数官方调得已经比较稳了一般不建议大改。如果你发现训练结果模糊可以适当降低位置学习率让高斯收敛得更精细。# 一个我常用的训练命令 python train.py \ -s /path/to/data \ -m /path/to/output \ --iterations 30000 \ --densify_until_iter 15000 \ --position_lr_init 0.00016 \ --save_iterations 7000 15000 30000提示训练过程中会定期保存中间结果建议至少保存三个检查点。有时候后期过拟合反而会让画质变差中间检查点可能效果更好。4. 实际使用中会遇到的那些坑4.1 显存爆炸的几种典型情况显存不够是 3DGS 最常见的报错。我总结了几种典型场景。第一种是图像分辨率太高。官方代码默认会把图像降采样到 1600 像素宽但如果你手动关了降采样4000x3000 的原图直接进去显存瞬间就满了。解决办法是保留降采样或者手动把图像缩到 2000 像素以内。第二种是场景太大。比如你拍了一整栋楼高斯数量会爆炸式增长。这时候可以调低--densify_grad_threshold让高斯增长更保守或者用--cap_max直接设一个上限。第三种是 batch 太大。3DGS 本身没有 batch 的概念但如果你同时跑多个训练任务显存会叠加。建议一次只跑一个。4.2 重建结果有空洞或者漂浮物怎么办这是新手最常问的问题。空洞通常是因为拍摄时某些角度覆盖不足COLMAP 没能估计出那些区域的位姿导致 3DGS 没有足够信息去填充。解决办法是补拍或者用 COLMAP 的--Mapper.ba_global_function_tolerance参数放宽优化容差。漂浮物则是另一种情况通常是背景中的一些噪点被错误地拟合成高斯或者深度估计不准导致高斯飘在空中。可以在训练后手动删除用官方提供的查看器选中那些高斯然后删掉。也可以在训练时调高--opacity_cull_threshold让低不透明度的高斯提前被剔除。4.3 常见问题速查表问题现象可能原因解决办法训练报 CUDA out of memory显存不足降低分辨率、减少高斯上限、关闭其他占显存程序COLMAP 匹配失败照片重叠不足或纹理太少补拍、增加重叠、避免纯色物体渲染画面模糊高斯过大或学习率不当降低位置学习率、增加迭代次数出现大量漂浮物深度估计错误调高不透明度剔除阈值、手动删除训练速度异常慢GPU 未正确调用检查 CUDA 版本、确认 PyTorch 用的是 GPU 版颜色偏暗或偏亮曝光不一致拍摄时锁定曝光、后期统一调色5. 3DGS 能用在哪些实际场景5.1 电商和展示类应用这是目前商业化落地最快的方向。传统电商展示要么是静态图片要么是预先做好的 3D 模型制作成本高、周期长。用 3DGS商家只需要拿手机绕商品拍一圈几十分钟后就能得到一个可以 360 度旋转、可以缩放看细节的三维展示。我见过一个做鞋类电商的团队他们把整个拍摄到上线的流程压缩到了一小时以内效率提升非常明显。5.2 数字孪生和场景重建对于建筑、园区、工厂这类场景3DGS 能快速生成高保真的三维副本。相比传统的激光扫描它的设备成本低得多一部手机或者一台普通相机就能搞定。而且生成的结果可以直接在网页端实时浏览不需要安装专业软件。我参与过一个小型园区的重建项目用无人机拍了大概 500 张照片训练出来的场景在浏览器里跑得很流畅连树木的枝叶都能看清。5.3 虚拟拍摄和影视预览影视行业对三维重建的需求一直很大尤其是虚拟拍摄和前期预览。3DGS 的实时渲染能力让它可以直接接入虚幻引擎或者 Unity作为背景环境使用。虽然目前在高精度工业级应用上还不如传统方案成熟但在快速预览和概念验证阶段它的效率优势是压倒性的。5.4 文物和艺术品数字化这个方向我觉得特别有意义。很多文物和艺术品不适合长期展出或者运输成本极高。用 3DGS 做数字化存档既能保留高精度的几何和纹理信息又能让观众在线上自由浏览。我见过一个博物馆的项目他们把一批瓷器做了 3DGS 重建观众可以在网页上把瓷器“拿”起来旋转连釉面的反光都能看到。6. 关于硬件和 GPU 的一些实操经验6.1 显卡怎么选如果你只是学习和体验RTX 3060 12G 是性价比很高的选择二手价格也不贵。如果你要正经做项目建议至少 RTX 4070 Ti 16G 起步显存大意味着能跑更大的场景。如果预算充足RTX 4090 24G 是目前消费级里最舒服的训练速度快、显存大基本不会遇到爆显存的问题。专业卡方面A 系列和 H 系列当然更好但价格不是个人能承受的。如果你只是偶尔跑一下租用云 GPU 也是不错的选择按小时计费用完就释放成本可控。6.2 怎么确认 GPU 真的在干活很多人跑训练的时候发现速度很慢第一反应是代码有问题其实往往是 GPU 根本没被调用。最直接的检查方法是在另一个终端跑nvidia-smi看 GPU 利用率和显存占用。如果利用率长期低于 30%那大概率是数据加载或者 CPU 预处理成了瓶颈。另一个常见问题是 PyTorch 装成了 CPU 版。用torch.cuda.is_available()检查一下返回 False 就说明装错了。重装的时候注意指定 CUDA 版本的 index-url。6.3 多卡和显存优化3DGS 官方代码对多卡支持一般如果你有多张卡最简单的办法是跑多个独立任务而不是指望它自动并行。显存优化方面可以开启混合精度训练能省大概 30% 的显存。另外把图像预加载到内存而不是每次从硬盘读也能提升不少速度。注意混合精度训练有时候会导致数值不稳定如果发现训练过程中 loss 突然变成 NaN先关掉混合精度试试。7. 我对 3DGS 的一些个人看法7.1 它不是万能的3DGS 很强但不是什么场景都适合。它对光照一致性要求高对反光和透明物体处理不好对动态场景基本无能为力。如果你要重建的是一个在风中摇摆的树或者一个表面全是镜面的物体3DGS 出来的结果可能会让你失望。这时候可能需要结合其他方案或者等后续的研究进展。7.2 生态还在快速演进3DGS 从 2023 年出来到现在社区发展非常快。各种改进版本层出不穷有的专注于压缩高斯数量有的专注于动态场景有的专注于编辑和交互。如果你现在入手建议保持关注官方仓库和几个主流的衍生项目每隔几个月就会有新东西出来。7.3 学习路径的建议如果你是零基础我建议先跑通官方代码用一个预置数据集体验完整流程。然后自己拍一组照片走一遍 COLMAP 加训练的全流程。最后再去看论文和代码细节理解每个参数背后的原理。这个顺序比一上来就啃论文要高效得多因为 3DGS 的很多设计是工程导向的先看到效果再理解原理会顺畅很多。我在实际使用中发现3DGS 最大的价值不是它某一项指标有多强而是它把三维重建这件事的门槛拉低了一个档次。以前需要专业设备和团队才能做的事现在一个人一台电脑就能搞定。这种效率的提升才是它真正让人兴奋的地方。
返回列表