【三维重建】【深度学习】windows11下3DGS代码Pytorch实现
提示:最近开始在【三维重建】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。
文章目录
- 【三维重建】【深度学习】windows11下3DGS代码Pytorch实现
- 前言
- 3DGS模型运行
- 总结
前言
3DGS(3D Gaussian Splatting )是由法国蔚蓝海岸大学的Kerbl, Bernhard等人在《3D Gaussian Splatting for Real-Time Radiance Field Rendering【SIGGRAPH 2023】》【论文地址】一文中提出了一种
极短训练时间呢就能达到最高视觉质量的方法,而且可以保证在高质量、实时、高分辨率的情况下新视角合成。
简单来说,首先,从摄像机校准过程中产生的稀疏点开始,用三维高斯来表示场景,既保留了用于场景优化的连续容积辐射场的理想特性,又避免了在空白空间进行不必要的计算;其次,对三维高斯进行交错优化/密度控制,特别是优化各向异性协方差,以实现对场景的精确呈现;最后,开发了一种快速可见性感知渲染算法,它支持各向异性拼接,既能加快训练速度,又能进行实时渲染。
在详细解析3DGS网络之前,首要任务是搭建3DGS【Pytorch-demo地址】所需的运行环境,并完成模型训练和测试工作,展开后续工作才有意义。
3DGS模型运行
win10环境下装anaconda环境,方便搭建专用于3DGS模型的虚拟环境作为参考。
安装CUDA
进行CUDA Toolkit Archive选择CUDA11.8.
博主测试的目前能够正常安装运行环境的版本为cuda11.8
version中win10系统选10,win11系统选11。
下载好以后,博主除了某个步骤选了自定义,其他都是选择默认选项;安装好以后需要配置环境变量。
系统属性-->环境变量-->系统变量path-->新增C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8目录下的bin和libnvvp即可,保存配置。
打开你cmd终端窗口,输入nvcc -V 验证是否安装成功,下图显示CUDA安装成功了。
安装 Visual Studio C++编译器
编译一部分c++代码作为调用的包需要要用到 MSVC,直接安装 Visual Studio 就行。
Visual Studio下载:下载完成后打开,勾选下图中所示"使用C++的桌面开发"。
这里非重点,博主只做了大致流程,可以在其他博客中学习安装Visual Studio
下载源码并安装环境
【pytorch代码推荐参考教程】,这里博主不在使用官方教程的environment.yml创建运行环境了,因为存在很多未知的错误和无法解决的问题。
安装GPU版本的pytorch教程,pytorch-gpu版本需要根据需求安装相应版本。
bash
# 下载githup源代码到合适文件夹,并cd到代码文件夹内(科学上网)
git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive
# 中途下载中断
git submodule update --init --recursive
# 创建虚拟环境
conda create -n 3d_gaussian_splatting python=3.10.6
# 查看新环境是否安装成功
conda env list
# 激活环境
activate 3d_gaussian_splatting
# 安装pytorch包
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 通过清华源,安装其他包(需要删除关于pytorch的部分)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple plyfile tqdm
# 安装额外的自定义包,要用到 MSVC,直接安装Visual Studio就行
pip install submodules/diff-gaussian-rasterization
pip install submodules/simple-knn
# 查看所有安装的包
pip list
conda list
最终的安装的所有包。
检查torch版,已经安装torch-gpu版本
bash
# 查看pytorch版本
import torch
print(torch.__version__)
# 查看cuda版本
print(torch.version.cuda)
# 查看cuda是否可用
print(torch.cuda.is_available())
# 查看可用cuda数量
print(torch.cuda.device_count())
git过程中可能存在的问题: fatal: clone of 'https://github.com/g-truc/glm.git' into submodule path 'D:/deeplean_demo/gaussian-splatting/submodules/diff-gaussian-rasterization/third_party/glm' failed.
解决方法: 下载glm c++源码库,把代码拷贝到目录gaussian-splatting\submodules\diff-gaussian-rasterization\third_party\glm下.
这里说明一下,假设源码全是手动下载,包括四份代码:3d Gaussian Splatting源码,3d Gaussian Splatting 中的 Submodules/diff-gaussian-rasterization,Diff-gaussian-rasterization 中 third_party/glm,3d Gaussian Splatting 中的 Submodules/simple-knn,下载完需要在对应位置解压。这里只是以glm为例。
安装环境过程中可能存在的问题: note: This error originates from a subprocess, and is likely not a problem with pip.ERROR: Failed building wheel for diff-gaussian-rasterization.
解决方法: 保证主机上装的cuda和虚拟环境下的cuda版本一致。
训练3DGS
官方源码提供的sfm数据集
【下载地址】,建议将数据集解压存放到工程目录的data下:
xml
| -- gaussian-splatting
| -- data
| -- tandt_db
| -- db
| -- ...
| -- ...
在训练前,只需要先了解以下主要参数的作用,读者可以根据需要自行修改。
以tandt_db/tandt/truck数据集为例开始训练
没有划分训练集和测试的数据集,添加 ---eval,代码运行时候会自动划分。
bash
# -s 数据集所在的路径; -m 训练输出数据保存路径,不提供默认在工程目录下的output/<random-随机序号名>;
python train.py -s data/tandt_db/tandt/truck -m data/tandt_db/tandt/truck/output
结果保存到tandt_db/tandt/truck/output
xml
| -- truck
| -- ...images
| -- output
| -- point_cloud # 训练过程中输出的点云效果
| -- cameras.json # 所有照片的名称、尺寸和位姿信息
| -- cfg_args # 类似日志信息,执行当前任务时指定的参数信息
| -- chkpnt30000.pth # 训练保存的权重文件
| -- input.ply # sfm重建出的点云
对比sfm重建的点云(input.ply,图上)和3dgs的重建的点云(point_cloud,图下):
可以发现3dgs的重建效果更加丰富和惊人。
nerf官方源码提供的sfm数据集
【下载地址】,建议同样将数据集解压存放到工程目录的data下。
fern数据集只需要images和sparse文件内容即可,它是SIMPLE_RADIAL的相机模型,需要再scene/dataset_readers.py代码中添加修改为以下内容,因为代码中并没有处理这种相机模式的方法,博主是个小白,因此粗暴的将SIMPLE_RADIAL和SIMPLE_PINHOLE完全等价了,忽略它们的差异,有更专业的读者有更好的方式的话欢迎评论指导。
在计算机视觉和摄影测量学中,相机模型是用来描述相机如何将三维空间中的点投影到二维图像平面上的数学模型。两种常见的相机模型是针孔(Pinhole)模型和径向畸变(Radial Distortion)模型.
bash
# 训练nerf_llff_data/fern数据集
python train.py -s data/nerf_llff_data/fern -m data/nerf_llff_data/fern/output
对比sfm重建的点云(input.ply,图上)和3dgs的重建的点云(point_cloud,图下):
lego数据集分为train、val以及test,和其他数据集的目录结构有些区别,但是训练时候的命令格式是一致的。
bash
# 训练nerf_synthetic/lego数据集 --eval 有train和test划分的数据集,训练模型并保留测试集进行评估
python train.py -s data/nerf_synthetic/lego -m data/nerf_synthetic/lego/output --eval
对比sfm重建的点云(input.ply,图上)和3dgs的重建的点云(point_cloud,图下):
这个比较特殊,不清楚是不是没进行sfm重建,单纯做了一个比较简单的初始化。
训练个人数据集
个人数据集的制作流程,可以参考博主的另一篇博文【基于COLMAP制作自己的NeRF(LLFF格式)数据集】,制作数据集所需要的图片是用手机拍摄视频后抽帧获取的。只需要images和sparse文件内容即可。
bash
# 训练个人数据集
python train.py -s data/nerf_llff_data/giraffe -m data/nerf_llff_data/giraffe/output
对比sfm重建的点云(input.ply,图上)和3dgs的重建的点云(point_cloud,图下):
渲染3DGS
经过上一个小节,读者也知道,按照数据集的格式大概就是以drjohnson、playroom、train、truck、fern和个人数据为一类,lego数据集为一类。下面的渲染的部分就只以前一类的truck和后一类的lego为例子演示,外加个人数据集演示。
假设在训练过程中没有添加 ---eval,数据集渲染test部分就是空的。
truck数据集的渲染
bash
python render.py -m data/tandt_db/tandt/truck/output -s data/tandt_db/tandt/truck
结果保存到tandt_db/tandt/truck/output
xml
| -- truck
| -- ...images
| -- output
| -- train # 训练集的渲染结果
| -- ours_30000 # 以最有一次训练次数为基准
| -- gt # 真实图片
| -- renders # 对应的渲染图片
| -- test # 测试集的渲染结果
对比真实图片(图上)和渲染图片(图下):
结果还是相当完美的。
lego 数据集的渲染
bash
python render.py -m data/nerf_synthetic/lego/output -s data/nerf_synthetic/lego
对比真实图片(图上)和渲染图片(图下):
渲染个人数据集
bash
python render.py -m data/nerf_llff_data/giraffe/output -s data/nerf_llff_data/giraffe
对比真实图片(图上)和渲染图片(图下):
总结
尽可能简单、详细的介绍3DGS的安装流程以及解决了安装过程中可能存在的问题。后续会根据自己学到的知识结合个人理解讲解NeRF的原理和代码。