
搞图形学和三维重建的朋友最近肯定被3D Gaussian Splatting刷屏了。这个项目在GitHub开源之后直接把实时高保真三维重建的门槛往下拉了一大截你给它一组普通照片它不像NeRF那样动辄训练十几个小时而是十分钟级别跑出可交互的高质量结果渲染速度还快得离谱。很多人看到演示视频后的第一反应都是“这玩意在Windows上能跑吗”——实话说项目最初是Linux CUDA的开发环境Windows下虽然有社区支持但驱动、编译工具链、Python版本、子模块这东西层层叠叠坑是真的多。这篇文章就是我的完整踩坑记录和搭建流程目标只有一个从零开始把Windows上的3D Gaussian Splatting环境一步步配好跑通官方数据集看到自己的重建结果。内容会覆盖硬件规划、软件版本匹配、PyTorch与CUDA的对应关系、三个核心子模块的编译、COLMAP位姿估算、训练与渲染全流程以及我踩过的各种报错现场。无论你是刚接触这个领域的新手还是已经有一点点深度学习经验想复现效果的老手照着这套流程走基本都能顺利跑起来。1. 先搞懂3D Gaussian Splatting再动手不迟1.1 最简单的理解用几千个3D水彩椭圆拼一个场景很多人一上来就急着装环境其实花十分钟理解一下这个技术在做什么对后面排查问题帮助极大。3D Gaussian Splatting后面简称3DGS的核心思路特别直白它把一个真实场景表示成几千到几十万个“3D高斯函数”的集合。你可以把每个高斯函数想成一个有颜色、有透明度、有旋转方向的三维水滴或椭圆斑成千上万个这样的小水珠叠在一起就能组成一个完整的立体场景。渲染的时候3DGS会从当前视角把这些3D椭圆投影到2D画布上按照每个点的透明度和颜色做alpha混合也就是一层一层叠涂上去最终得到一张和真实照片几乎一样的图像。整个过程走的是经典光栅化管线而不是NeRF那种对每个像素都要做大量采样点积分的体渲染所以速度才能快出几个量级。训练阶段做的事情也很直观先给出一堆3D高斯通常是COLMAP算出的稀疏点云初始化的然后从不同角度渲染出图像把渲染图和真实拍摄的照片做比较用L1损失加上D-SSIM损失来指导参数更新。梯度回传时程序会不断调整每个高斯的位置、颜色、旋转、缩放和不透明度还会根据情况自动拆分、克隆或者删除某些高斯让整个点云逐渐逼近真实场景。理解了这套“初始化 → 渲染 → 对比 → 优化 → 自适应调整”的循环你后面看训练日志就不会一头雾水。1.2 为什么Windows搭建值得单独写一篇很多人会觉得既然是Python项目Windows上装个Python环境不就行了问题是3DGS的核心渲染器是用CUDA和C写的你需要把C代码编译成Python扩展而这一步在Windows上要同时满足CUDA Toolkit、MSVC编译器和Python三方版本互相兼容任何一环出了问题编译就会以一个非常不友好的报错收场。另外官方文档和大量教程都是以Ubuntu为主很多命令在Linux下跑得好好的到了Windows就报错。就拿最简单的pip install .来说Linux下一般直接成功Windows下很可能先报“找不到cl.exe”这就是因为缺少MSVC环境变量再走一步又可能报“CUDA_HOME没有设置”又是环境变量的问题。GitHub的issue区里Windows用户踩坑的讨论能翻几十页。所以这篇文章专门把所有Windows相关的坑集中起来处理。我采用的路线是Miniconda管理Python环境Visual Studio 2022提供C编译工具链CUDA Toolkit负责nvcc编译器PyTorch用匹配好CUDA版本的预编译wheel包最后分头编译三个子模块。这套方案在30系和40系显卡上都实测过属于目前社区里最稳妥的组合。2. 硬件与软件规划装到一半发现版本不对是最崩溃的2.1 硬件底线与显存分配先讲硬件因为这一关过不了后面软件装得再好也白搭。3DGS训练过程中的显存消耗主要来自三个方面输入图像的分辨率、3D高斯的数量尤其是自适应密度化之后点数会从几千涨到几十万甚至上百万、以及梯度计算时的中间缓存。官方默认配置在1080p左右分辨率下一个中等规模的场景大概需要6-8GB显存如果把分辨率拉满或者场景特别复杂显存需求会轻松突破10GB。给你一个大概的参考表显卡型号显存适合的场景GTX 1660 / RTX 20606GB极小数据集需降低分辨率建议用--resolution 2RTX 3060 / RTX 2060 Super8-12GB中等规模场景默认参数基本能跑RTX 4070 / RTX 408012-16GB高分辨率场景训练速度明显加快RTX 409024GB复杂大场景、高分辨率的理想选择内存方面建议16GB起步32GB更舒服。因为COLMAP做特征提取和匹配时如果图片数量多、分辨率高内存占用很容易冲到8GB以上。硬盘空间也要留够项目代码、COLMAP中间文件、训练输出的点云和渲染视频加起来一个场景吃掉20-30GB很常见。还有一个容易被忽略的点显卡驱动一定要去NVIDIA官网更新到最新版本。驱动不只是管显示的它本身就是CUDA运行时环境的载体新驱动对老版本的CUDA通常向下兼容但凑合的老驱动可能连新版驱动都装不上更别提跑训练了。2.2 软件清单一张表看明白下面这个表是按推荐安装顺序排列的每一项都有它的不可替代性别嫌麻烦跳过某一个软件版本建议作用NVIDIA显卡驱动最新稳定版提供CUDA运行环境基础Visual Studio 2022社区版需勾选“使用C的桌面开发”提供MSVC编译器和Windows SDKCUDA Toolkit11.6或11.8新卡可用12.x提供nvcc编译器和CUDA头文件、库Miniconda最新版Python环境隔离与管理Python3.8或3.93DGS官方开发时基于3.7-3.9不建议用3.11Git最新版克隆代码仓库COLMAP官方Release版exe从多视角图片估算相机位姿生成稀疏点云FFmpeg最新版视频抽帧成图片如果自己录视频Visual Studio 2022这一点要特别强调一下安装的时候一定记得勾选“使用C的桌面开发”工作负载里面包含MSVC C编译器和Windows 10/11 SDK。很多人在这一步偷懒只装了独立IDE结果编译子模块时系统找不到cl.exe整个流程直接卡死。装完之后建议把VS的C x64编译环境命令行工具留个快捷方式也就是“x64 Native Tools Command Prompt for VS 2022”后面编译子模块要在这个终端里操作。2.3 版本匹配原则CUDA/PyTorch/显卡驱动三者怎么对齐版本匹配是整个搭建过程中最容易出问题的环节我单独拿出来说。3DGS项目官方在开发时用的是CUDA 11.6 PyTorch 1.13.1 Python 3.8的组合这也是“最不容易报错”的黄金组合。但如果你手里是RTX 40系显卡或者等了很久才下载PyTorch就会遇到版本兼容性的选择题。PyTorch的轮子包是区分CUDA版本的比如torch1.13.1cu116表示这个包内嵌了CUDA 11.6的运行时。你安装的PyTorch版本决定了运行时使用的CUDA能力而编译子模块时用到的nvcc编译器则来自系统安装的CUDA Toolkit。这两者的版本最好保持在同一主版本范围内否则编译出来的扩展可能和PyTorch内部调用不一致轻则警告重则直接崩溃。NVIDIA驱动的兼容规则是从上往下兼容的驱动越新能支持的CUDA运行时版本范围越宽。所以只要驱动够新你用CUDA 11.6或者CUDA 12.1都没问题。但反过来就不行老驱动跑不了新CUDA。我自己遇到的最典型问题就是电脑上装了最新的CUDA 12.4PyTorch也装了默认的cu121版本编译子模块时却突然报CUDA版本不匹配的错。后来把方案统一成“PyTorch cu118 CUDA 11.8兼容 VS2022编译环境”问题立刻消失。所以我的建议是30系及更老的显卡直接用官方推荐的cu116组合40系新卡优先尝试cu118或cu121编译时要保证系统的CUDA Toolkit主版本和PyTorch的cu版本一致。3. 实操搭建从Miniconda到编译通过3.1 初始化Python开发环境先去Miniconda官网下载Windows安装包建议装到C盘默认路径或者一个没有空格的目录下比如D:\miniconda3。安装完成后打开Anaconda Prompt或者任意PowerShell确认conda命令可用conda --version然后创建一个独立环境我习惯用Python 3.9兼容性比3.8稍好一点也不会太新导致老代码出问题conda create -n gaussian_splatting python3.9 -y conda activate gaussian_splatting激活后你会看到命令行前缀变成了(gaussian_splatting)说明环境切换成功。用conda隔离环境的好处是你的系统Python和其他项目不会因为这个项目的依赖被搞乱而且以后想删掉这个环境重来一条conda remove -n gaussian_splatting --all就干净了。接下来把pip更新到最新版避免后续安装某些包时出现奇怪的元数据问题python -m pip install --upgrade pip setuptools wheel3.2 安装PyTorch这一步决定后续90%的运气PyTorch的安装命令不用去官网点点点直接用pip指定CUDA版本安装最省心。30系及更老的卡按官方推荐用cu116pip install torch1.13.1cu116 torchvision0.14.1cu116 --extra-index-url https://download.pytorch.org/whl/cu116如果是RTX 40系新卡建议跳过老版本直接上cu118pip install torch2.1.2cu118 torchvision0.16.2cu118 --extra-index-url https://download.pytorch.org/whl/cu118安装完必须验证一下CUDA是否可用这一步一定别偷懒python -c import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果你看到True和你的显卡型号说明PyTorch已经能正常调用GPU。如果输出False大概率是驱动太旧或PyTorch版本与驱动不匹配先更新驱动再重装。我在这里还要多说一句不要在“没验证PyTorch的CUDA可用性”的情况下急着往后走。这一步过了后面所有问题都可以聚焦在编译环节这一步没到后面训练时的报错会让你哭都哭不出来。3.3 克隆代码仓库注意--recursive参数3DGS的官方代码仓库是graphdeco-inria/gaussian-splatting。克隆命令看起来很简单但有一个非常关键的细节——后面要带--recursive参数git clone --recursive https://github.com/graphdeco-inria/gaussian-splatting.git cd gaussian-splatting--recursive的作用是把仓库依赖的三个子模块一并拉下来。这三个子模块分别是diff-gaussian-rasterization可微光栅化器3DGS的核心负责把3D高斯投影成2D图像并支持梯度反传simple-knn近似K近邻搜索用于高斯的密度初始化阶段fused-ssim基于CUDA的SSIM优化算子用来加速损失计算如果你下载后发现submodules里有文件夹是空的说明子模块没有拉全执行下面的命令补一下git submodule update --init --recursive不要试图从GitHub页面手动一个个下载子模块的zip再塞进去版本对不上会编译得一脸懵。用git管理最稳妥。3.4 编译三个核心扩展C与CUDA的“施工”环节子模块的安装是Windows下最大的分水岭。很多人卡住的地方就是这里而且报错五花八门。先说正确做法打开之前提到的那根“x64 Native Tools Command Prompt for VS 2022”命令行工具先激活conda环境conda activate gaussian_splatting cd D:\your_path\gaussian-splatting然后安装Python依赖pip install -r requirements.txt这里会装好tqdm、tensorboard、plyfile等辅助包。接着安装第一个子模块cd submodules\diff-gaussian-rasterization set DISTUTILS_USE_SDK1 pip install .注意每个子模块安装前都要设置DISTUTILS_USE_SDK1这个环境变量的作用是让Python的setuptools从Visual Studio的开发环境中自动获取MSVC编译器和SDK路径而不是去PATH里盲目地找cl.exe。少了这一句Windows下几乎百分百会报“cl.exe not found”或“Unable to find vcvarsall.bat”。接下来的两个子模块同样操作cd ..\simple-knn set DISTUTILS_USE_SDK1 pip install . cd ..\fused-ssim set DISTUTILS_USE_SDK1 pip install .整个编译过程会持续几分钟到十几分钟看你的CPU性能。编译时控制台会疯狂滚动一堆编译日志看到“Successfully installed diff-gaussian-rasterization”这样的字样就说明成功了。编译完成后回到项目根目录用一条命令验证所有核心扩展都能正常导入cd .. python -c import torch; import diff_gaussian_rasterization; from simple_knn import knn_function; print(all ok)没有报错就说明环境已经通了可以进入下一步跑数据。3.5 验证环境用一个小测试跑通前向渲染刚才的import测试只是验证模块装好了还不足以证明整个管线没问。更保险的做法是快速跑一下官方提供的演示脚本看看能不能生成一个正常图像。项目里自带一个测试脚本大概长这样python train.py --help如果这个命令能正常输出训练脚本的参数说明说明喂数据、读参数的逻辑没问题。你不需要真的现在就跑训练但至少确认脚本能正常加载。还有一个更高性价比的验证方式是新建一个简单的Python文件import torch from diff_gaussian_rasterization import GaussianRasterizationSettings, GaussianRasterizer这一步能提前暴露一些编译期兼容问题。比如如果你之前图省事用了官方推荐之外的PyTorch版本在这里可能就会出现符号不匹配的报错。早发现早解决别等到数据集都准备好了才发现环境有问题。4. 跑通示例数据从图片到3DGS模型4.1 准备输入没有相机位姿一切白搭3DGS训练和NeRF一样需要知道每张输入图片对应的相机内外参数。这些参数从哪里来答案是COLMAP。COLMAP是一个经典的3D重建工具它可以从一堆图片中匹配特征点估计相机的拍摄位置和朝向最终输出一个稀疏点云和相机参数文件。数据准备有两种方式用官方提供的小示例数据集网上搜3DGS official data即可找到下载或者自己拍一组照片来重建。拍摄时记住几个要点围绕目标物体走一圈保证相邻照片有足够的重叠区域光照均匀不要太逆光手机或相机固定焦距更好画面里不要有大量运动物体。一般来说20-100张照片就能出一个不错的小场景。如果觉得拍照麻烦也可以录一段环绕视频再用FFmpeg抽帧ffmpeg -i input.mp4 -vf fps2 images/%04d.pngfps2表示每秒抽2帧实际帧率可以根据视频长度和场景复杂度调整帧数太少会重建失败太多则训练时间暴涨。拿到图片后整理成下面的目录结构my_dataset/ ├── images/ │ ├── 0000.png │ ├── 0001.png │ └── ...4.2 用COLMAP估算相机位姿GUI或命令行都行COLMAP在Windows下有官方预编译的Release包文件名类似COLMAP-x-windows-no-cuda.zip下载解压后直接把bin目录加入PATH环境变量即可。这里要提醒一句如果只是做3DGS的前置数据不选CUDA版也完全够用CPU跑特征提取也一样能出结果只是慢一些。处理流程上新手可以用COLMAP的图形界面操作新建项目选择图片文件夹和数据库路径依次点击“Feature extraction”、“Feature matching”、“Reconstruction”完成后导出模型。但对于要反复重建多个数据集的人来说命令行要高效得多。官方仓库里其实已经附带了一个convert.py脚本它就是为3DGS定制的数据处理流程内部封装了COLMAP的调用可以把你整理好的图片文件夹直接转成符合3DGS训练格式的数据集。使用方式python convert.py -s my_dataset --colmap_executable C:\path\to\colmap.exe脚本会执行特征提取、特征匹配、SfM重建然后在my_dataset下生成sparse/0目录里面是相机参数和点云还会生成cameras.json和images的整理目录。转换完成后你应该看到类似这样的结构my_dataset/ ├── images/ ├── sparse/ │ └── 0/ │ ├── cameras.bin │ ├── images.bin │ └── points3D.bin ├── cameras.json ├── ...如果这一步执行失败多半是图片质量差、数量太少或路径里有中文。把路径改成纯英文再重新试一次。4.3 开始训练那些参数到底改不改数据准备好了训练就简单了。在项目根目录执行python train.py -s my_dataset -m output/my_dataset_run1 --iterations 30000-s指定数据集路径-m指定输出目录--iterations是迭代次数。官方默认训练3万次迭代但如果你只是想验证环境通了完全可以把迭代次数降到7000几分钟就能看到效果python train.py -s my_dataset -m output/quick_test --iterations 7000 --test_iterations 7000 --save_iterations 7000这里面有几个参数值得解释一下。--test_iterations表示每迭代多少步做一次测试集评估--save_iterations表示在哪些迭代步保存模型检查点。把这两个参数都设成7000意思就是在7000步时保存模型并做一次测试对于快速验证来说非常方便。训练过程中控制台会打印每个迭代步的损失值。3DGS的损失是L1损失和D-SSIM损失的加权和默认权重是0.8和0.2。刚开始看loss从几千降到几百很刺激但不用纠结数字具体多大重点看曲线是否稳定下降、TensorBoard里的渲染预览是否越来越清晰。如果在训练时显存不够有两个急救参数一个是--data_device cpu把图像的张量放在CPU内存上训练时再搬进GPU能省些显存另一个是--resolution 2表示把图像分辨率除以2来训练显存压力直线下降但重建细节也会损失一些。实测一个中等场景8G显存用默认分辨率勉强能跑6G就一定要开--resolution 2。4.4 渲染与质量评估看到成果的一步训练结束后输出目录里会有一个point_cloud.ply文件这就是你重建出来的3D Gaussian模型。接下来用渲染脚本把训练好的模型渲染成视频或逐帧图片python render.py -m output/my_dataset_run1 -s my_dataset脚本会遍历所有验证视角渲染出最终图像和深度图并在输出目录下生成视频文件。如果你想量化评估重建质量可以跑指标计算python metrics.py -m output/my_dataset_run1这条命令会计算测试视角下渲染图与真实图之间的PSNR、SSIM和LPIPS三个指标。PSNR越高越好一般30以上算不错SSIM越接近1越好LPIPS越低越好。这三个指标组合起来可以比较客观地衡量你的重建效果。如果想实时交互地看重建结果官方还有一个SIBR viewer但它在Windows下编译的依赖比较繁琐新手先不用碰。我个人的做法是直接把渲染出来的视频导入剪辑软件和原图做分屏对比效果一目了然省时又省事。5. 实操中遇到的坑与排查方法5.1 编译阶段的经典报错现场我见过太多人被编译这一步折磨到想放弃这里我把最常见的几类报错连带着解决思路一起整理出来第一类是“cl.exe找不到”或“Unable to find vcvarsall.bat”。这个基本可以断定是编译命令不在MSVC环境中执行的。解决办法就是用“x64 Native Tools Command Prompt for VS 2022”而不是普通的PowerShell或CMD进去后记得再conda activate gaussian_splatting。第二类是“CUDA_HOME not set”或“Could not find any CUDA toolkit”。这表示系统找不到CUDA的安装位置。安装CUDA Toolkit时它一般会自己写环境变量但有时候你用的是Ryzen平台或者绿色版驱动环境变量会缺失。手动检查一下CUDA_PATH和CUDA_TOOLKIT_ROOT_DIR是否指向了CUDA安装目录比如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8。第三类是“fatal error C1083: Cannot open include file: cuda_runtime.h”。这个报错说明编译器找不到CUDA头文件。检查PATH环境变量里有没有C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include如果没有就手动加进去。第四类是编译过程中的“C2059 / C2131”这类MSVC语法报错。通常是某些老代码对最新版VS过于挑剔比如在VS2022编译老PyTorch扩展时偶尔出现。这种问题一般通过换用较低版本的VS工作负载或者给编译加一个额外的标准合规开关解决。实际遇到时建议直接去GitHub issue区搜索报错原文基本都有对应方案。5.2 训练阶段的白屏、黑屏或显存不足训练时最常见的问题之一是渲染结果白屏或黑屏。白屏通常意味着损失爆炸了大多是由于相机位姿估算失败比如COLMAP输出的相机参数是错的导致某些视角和实际图像完全对不上。这时回到数据检查一下sparse/0里的相机数量是否和图像数量一致以及训练时的loss是否在断层跳变。黑屏则可能是输入像素值超出了模型预期范围或者图像数据没有正常读入先检查数据目录结构和cameras.json的内容。显存不足的报错长这样“CUDA out of memory”或“RuntimeError: [enforce fail at alloc_cpu.cpp]”。解决办法前面已经提过优先调整--resolution和--data_device cpu。另外还有一种小幅优化把training_batch_size保持默认的1一般不需要改因为3DGS默认就是逐视角训练的。训练很久但loss降不下去先别急着怀疑代码。检查是不是原始图片分辨率太大导致COLMAP匹配失败检查画面里是否有大量反光、玻璃这类难以重建的材质检查镜头有没有频繁变焦。还有很现实的一点如果拍摄时场景里风吹树叶之类的动态物体太多重建质量会明显下降这类场景对3DGS确实不友好。5.3 数据侧的坑路径、格式和数量路径里带中文算是Windows用户的老朋友了。COLMAP和3DGS的训练脚本对路径中的中文支持都很差轻则读取失败重则ANSI编码报错。强烈建议所有项目路径统一用英文和数字比如D:\3dgs_projects\garden。图片格式方面COLMAP对PNG和JPG支持最好直接用手机拍出来的HEIC格式必须先转成常规格式再喂给脚本。我一般用FFmpeg统一转码顺便把分辨率压一下ffmpeg -i input.heic output.png图片数量过少也是新手常见问题。少于20张图片时COLMAP很难恢复出足够的匹配特征稀疏点云会非常稀疏3DGS重建出来的模型就像是“糊成一团”。尽量拍30张以上把物体各个角度都覆盖到。反过来如果图片上千张训练时间会指数级上升可以先筛选出有代表性的200-300张再重建。5.4 版本升级带来的新坑最后聊聊升级的诱惑。很多人装完环境后看到新版PyTorch或者新版Python来了就想顺手升个级。我的建议是项目没跑通之前绝对别升级。3DGS的子模块是针对特定版本的PyTorch编译的你升级PyTorch之后之前的扩展模块很大概率要重新编译而那些老代码在新版本下不一定还编译得过。如果非要尝试新版本也务必保留一份能用的旧环境作为退路。我自己的习惯是在conda里保存多个环境gs_old和gs_new并存新的试成功再删旧的。这种“先备份再折腾”的思路让我的很多次实验都能快速回滚。还遇到过一种情况是Python 3.10及以上版本安装老版submodules时会报“Unknown distribution option”一类的警告或者错误这多半是setuptools太新导致的。把setuptools固定到比较老的版本比如58.0.4再重新pip install -e .通常能解决。不过这也从侧面说明老老实实用Python 3.8/3.9可以省掉很多无谓的折腾。我把这套流程从头到尾跑通之后最大的感觉是3DGS在Windows上的“难”难在基建而不是难在算法。只要把CUDA、MSVC、PyTorch这三个关键角色的版本协调好后面训练、渲染和调参反而是一马平川。另外还有个经验分享每完成一个步骤就做一次记录哪怕只是写几行“今天装了哪个版本、遇到什么报错、怎么解决的”也会在复现或帮助别人的时候发挥奇效。这个项目后续可以玩的扩展方向也很多动态场景、4D重建、和NeRF的结果对比、在自有数据上调整超参数每一样都值得花时间去折腾。