本文基于github仓库-gaussian-splatting-Windows,分享本地实现3D高斯溅射的流程经验,包含遇到的问题和解决方案
环境配置
原文内容:
硬件要求:英伟达GPU,显存VRAM不低于24GB。最好是RTX 3090或更好
查看显存:
Win + R
打开运行对话框,输入dxdiag,回车,选择显示选项卡。
可以看到我这里是8GB的vram,但是问题不大,后面流程也可以正常实现,训练时间也没有过长训练前7000次时间没有过长,训练到30000次还是有点长!
接下来是软件环境配置,请按照本文提到的顺序依次配置。
Git,Conda是比较友好的,按照视频教程即可,只需要注意一下环境变量。
需要特别注意的有三个问题:
Visual Studio
一定要安装旧版本的 VS
!项目的要求版本是 2017-2022
,但并没有说明小版本号,2024年8月5日亲测最新版本的 VS 2022
不兼容。
如何安装旧版本 VS
:
网上各种教程提供的旧版本都是2019或者2017版本,但是如果没有订阅则无法安装,并且版本过旧。所以我的解决方案是安装 VS 2022
的旧版,即安装LTSC(长期服务)版本。
访问地址 https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-history
我这里选择的是17.8版本,没有社区版直接选择专业版,没有要求付费。
建议访问英文版本的网页,中文由于排版问题可能会导致内容显示不全,例如:
Cuda Toolkit
安装完 VS
就可以顺利安装 Cuda Toolkit
了。Github明确说明了不兼容 11.6
和 12
以上的版本,所以我们选择 11.8
即可。
下载链接: https://developer.nvidia.com/cuda-toolkit-archive
安装 Cuda Toolkit
时会提示选择精简安装还是自定义安装。其实这里是翻译问题,精简安装的意思是安装所有组件,下方解释中有说明。
其中某个组件涉及 VS
,所以一定要先安装 VS
,再安装 Cuda Toolkit
的精简安装,就可以成功安装了。
cl.exe
这是一个 Cuda
需要的编译器,安装 VS
时已经自动安装到了本地,但是没有添加到环境变量,需要手动添加一下。位置在 C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64
添加环境变量之后可以重启生效,也可以打开终端使用命令
echo %PATH%
输出环境变量使其更新,这样就不需要重启电脑了。
处理上述事项之后,才可以正确创建 conda
环境。
跑算法
数据准备
可以自己拍摄一段视频,使用 ffmpeg
和 convert.py
处理成符合输入要求的数据。
ffmpeg
用于从视频提取图像,在终端中运行:
FFMPEG -i {path to video} -qscale:v 1 -qmin 1 -vf fps=${frame extraction rate} %04d.jpg
其中 ${frame extraction rate}
为每秒钟提取出的图片数量。例如设置成2,一分钟的视频就会提取出120张图像。
convert.py
用于从原始图片生成未失真的图像和SfM信息
python convert.py -s ${path to data}
可以
也可以直接使用 hugging face
提供的数据:
https://huggingface.co/camenduru/gaussian-splatting/resolve/main/tandt_db.zip
运行脚本
python train.py -s ${path to data}
我的笔记本4060上跑数据集中的 train
火车模型全程耗时30分钟左右。但后续训练发现速度会变得很慢甚至停滞,原因未知
脚本会存储训练到7000轮和30000轮的两个数据,算力资源有限情况下可以只训练到7000轮,因为到30000轮提升不大且耗时过长,指定训练次数:
python train.py -s ${path to data} --iterations 7000
输出结果会存储在 train.py
同位置下 output
文件夹中, 随机命名
展示结果
在Github仓库可以找到 pre-built
的查看器,下载到本地,通过命令行运行并且指定目标路径即可。
SIBR_gaussianViewer_app -m ${path to output}
通过colab训练:
训练完成后将结果保存到谷歌云盘,方便下载到本地:
from google.colab import drive
drive.mount('/content/drive')
!tar -czvf output.tar.gz output
!cp output.tar.gz ../content/drive/MyDrive