3D Gaussian Splatting 三维重建

概念

3D Gaussian splatting 是一种基于辐射场的新的渲染技术, 使用 3D Gaussian 表示3D场景, 通过 Splatting 技术渲染, 能使用较少的训练时间实现高还原度的视觉效果.

技术特点

  • 实时高清渲染: 能够通过少量稀疏图像,实时(需要有足够的硬件算力)渲染出高还原度的场景
  • 高斯函数建模: 该方法利用3D高斯球表示场景中的点,并通过优化其参数实现较好的视觉保真度
  • 高效训练与渲染: 依托快速, 可微分的高斯光栅化技术, 显著提升了训练和渲染效率
  • 超越传统方法的优势: 相比传统渲染技术, 该技术以更快的速度处理复杂场景
  • 局限性: 需大量显存和存储, 且与现有渲染管线的兼容性需要完善

方法

该方法包括几个关键步骤:

  • 数据输入: 一组静态场景的图像以及摄像机位置, 表示为稀疏的点云
  • 3D高斯: 确定每个高斯的均值, 协方差矩阵和不透明度
  • 颜色表示: 使用球面调和来模拟视图相关的外观
  • 优化算法: 使用随机梯度下降优化参数, 以最小化结合L1损失和D-SSIM的损失函数
  • 光栅化器: 实现一个基于图块的光栅化器, 用于快速排序和反向传递, 支持高斯分量的高效混合

该方法使用可微分的3D高斯分布图, 其是非结构化和显式的, 允许快速渲染和投影到2D分布图. 高斯分布的协方差可以被认为是一个椭球的配置, 它可以在数学上分解成一个比例矩阵和一个旋转矩阵. 所有参数的梯度都是显式导出的, 以克服自动挖掘造成的任何开销. 该优化创建了一组尽可能精确地表示场景的密集的3D高斯分布, 每一步渲染之后都要与数据集中可用的训练视图进行比较.

论文资料

扩展阅读

知识基础

视频

合集 https://www.youtube.com/playlist?list=PLAGyKNXhhw2l-OlYOvCxyQ2l29rypwIjW

  • (重要)3D高斯介绍 3D Gaussian Splatting for Beginners
  • (重要)模型数据说明 Understanding the Gaussian splatting model
  • 3D NeRF(另一种实现)和高斯的实际应用 Real World Applications for NeRFs and Gaussian Splatting - Simulation, Real Estate, Cinema, AR, VR!
  • 3D NeRF的介绍 NeRF: Neural Radiance Fields for Beginners
  • (重要)3D NeRF和高斯的对比 Novel View Rendering and 3D Reconstruction - NeRFs vs Gaussian Splatting
  • 代码讲解, 从35:00开始 https://www.youtube.com/watch?v=1buFrKUaqwM
  • 在Linux环境下的安装, 训练和渲染 3D Gaussian Splatting in Linux - Setup, Training and Rendering

其它

B站中文

安装步骤

安装必要的库和依赖

Ubuntu

注意要用 Ubuntu 22.04, 因为 Ubuntu 22.04 的 GCC 版本是 11, Ubuntu 24.04 的 GCC 版本是 13, gaussian-splatting 这个项目在 GCC 13 下 pip install submodules 时会报编译错误.


   
apt update
apt install build-essential ninja-build

安装显卡驱动和CUDA Toolkit


   
sudo apt install nvidia-driver-550
# 或者
sudo apt install cuda-drivers-550

nvidia-smi查看CUDA版本


   
(base) root@ubuntu22:~# nvidia-smi
Sun Mar 30 17:21:08 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.78 Driver Version: 550.78 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |

cuda-toolkit-archive, 选择安装对应当前CUDA版本的 CUDA Toolkit, 对应上面的 CUDA 版本为12.4, 因此下载 Cuda Toolkit 12.4.1

用 deb(local) 的方式安装


   
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda-repo-ubuntu2204-12-4-local_12.4.1-550.54.15-1_amd64.deb
dpkg -i cuda-repo-ubuntu2204-12-4-local_12.4.1-550.54.15-1_amd64.deb
cp /var/cuda-repo-ubuntu2204-12-4-local/cuda-*-keyring.gpg /usr/share/keyrings/
apt update
apt install cuda-toolkit-12-4

检查安装结果


   
(base) root@ubuntu22:~/Download# /usr/local/cuda/bin/nvcc -V

安装完成后, 需要将CUDA 可执行文件加入系统路径, 将CUDA链接库加入系统链接库. 编辑 ~/bashrc, 在最后添加


   
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64
export PATH=$PATH:$CUDA_HOME/bin

退出后重新进入命令行, 执行nvcc -V检查环境是否生效

安装 Conda

Conda 是当前常用的 Python 版本环境管理工具, 安装 Conda 的简化版 Miniconda, 安装说明: https://www.cnblogs.com/milton/p/18023969

启用conda


   
eval "$(/home/milton/miniconda3/bin/conda shell.bash hook)"

创建一个conda环境, python版本为 3.10.12


   
conda create --name 3dgs python=3.10.12
conda activate 3dgs

安装 Pytorch

保持上一步启用的 conda 环境不变, 在这个环境里安装 Pytorch. 访问 Pytorch 官网 https://pytorch.org/

从 2.6 开始, conda 方式安装不再可用, 并且 2.6 只支持 11.8 和 12.4, 安装2.6的命令


   
pip3 install torch torchvision torchaudio

如果直接使用官方源很慢, 可以用-i指定使用国内源


   
# 清华:https://pypi.tuna.tsinghua.edu.cn/simple
# 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
pip3 install torch torchvision torchaudio -i https://pypi.mirrors.ustc.edu.cn/simple

安装其它Python组件


   
pip install plyfile tqdm tensorboard six opencv-python

安装 Colmap

在 Ubuntu 22.04 下通过apt install colmap安装的貌似不支持 CUDA 加速, 需要编译安装 Colmap

Make sure you configure and compile from a consistent dev environment. It seems you are using anaconda. You probably want to start from a clean build folder and make sure you are not in a virtual anaconda environment.

编译步骤 (参考 https://github.com/dberga/nerfstudio/blob/main/INSTALL.md )


   
# 安装依赖
sudo apt-get install \
git \
cmake \
ninja-build \
build-essential \
libboost-program-options-dev \
libboost-filesystem-dev \
libboost-graph-dev \
libboost-system-dev \
libeigen3-dev \
libflann-dev \
libfreeimage-dev \
libmetis-dev \
libgoogle-glog-dev \
libgtest-dev \
libsqlite3-dev \
libglew-dev \
qtbase5-dev \
libqt5opengl5-dev \
libcgal-dev \
libceres-dev
git clone https://github.com/colmap/colmap.git
cd colmap
mkdir build
cd build
# rtx2080ti 对应75, rtx4060ti 对应89
cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=75
sudo chown -R $(whoami) .
ninja -j1
sudo ninja install

使用 Colmap

导出项目仓库


   
git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive

安装核心模块


   
#gaussian
pip install submodules/diff-gaussian-rasterization
pip install submodules/simple-knn

使用

使用默认数据集进行验证

下载示例数据 tandt_db.zip

在项目 GitHub 仓库 的首页找到 Running 部分, 能找到这个下载链接

You can find our SfM data sets for Tanks&Temples and Deep Blending here: https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip If you do not provide an output model directory (-m), trained models are written to folders with randomized unique names inside the output directory. At this point, the trained models may be viewed with the real-time viewer (see further below).

这个数据集里面带了4个场景, 两个室内的, 两个室外的, 都是两三百张图片, 图片比较小, 单图几百K到几千K, 适合验证测试.

Convert 提取特征和点云

数据集已经把相机特征和点云提取好了, 可以直接使用, 如果想直接训练可以跳过这一步

创建一个目录, 例如 source_data, 在下面创建一个子目录 input, 这个 input 的名称是固定的, 不能改. 然后将图片序列放到这个input目录下, 执行提取命令


   
python ./convert.py -s ~/work/source_data/

这一步执行是通过 colmap 实现的, 依次执行 feature extraction, exhaustive feature matching, reconstruction, 如果使用cpu处理, 需要加上--no_gpu参数, 例如


   
python ./convert.py --no_gpu -s ~/work/source_data/

可以打开 convert.py 查看其它的选项. 在 matching 阶段会使显卡满负荷, 这一阶段如果使用CPU, 比使用支持CUDA的显卡速度上慢一个数量级, 使用 RTX2080 TI 匹配一个block 6秒, 对应的在 E5 2673 V3 上需要差不多 60秒.

这一步结束后会在input同一级目录下, 产生 distored, images, sparse, stereo 等目录, 其中 images 和 sparse/0 目录是下一步训练要用到的文件.

Train 训练

使用示例自带的数据, 或者用上一步提取的数据进行训练


   
python train.py -s [素材路径]
# e.g.
python train.py -s ./data/tandt/truck

执行过程中可以通过 nvidia-smi 查看GPU的情况, 可以看到运行的功率, 显存的使用率

训练的过程会产生两个目录, iteration_7000 和 iteration_30000, 分别是迭代7000次和30000次的 point cloud 文件. 这个文件可以直接用于3D渲染.

View 查看

第三方网页工具

快速查看可以用第三方的网页工具, 例如 https://poly.cam/tools/gaussian-splatting, 可以注册后免费上传 ply 文件.

SIBR Viewer

用项目自带的 SIBR Viewer 需要编译安装, 编译过程需要nvcc, 如果是不支持CUDA的显卡, 这部分就不用尝试了. 在 Ubuntu 22.04 环境下先安装依赖


   
sudo apt install libglew-dev libassimp-dev libboost-all-dev libgtk-3-dev libopencv-dev libglfw3-dev libavdevice-dev libavcodec-dev libeigen3-dev libxxf86vm-dev libembree-dev

预编译, 这一步如果有错误, 检查上面的依赖是否已经安装


   
cmake -Bbuild . -DCMAKE_BUILD_TYPE=Release

编译并安装到项目路径下, -j24对应24核CPU, 设成和当前环境CPU核数一致


   
cmake --build build -j24 --target install

安装后, 可执行文件会安装到 SIBR_viewers/install/bin/ 目录下, 通过命令行启动 SIBR Viewer


   
./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m [训练结果目录]

例如


   
./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m ./output/0dbedfba-8/

界面需要双手操作, 左手 W, E, F, A, S, D 控制左右前后上下平移, 右手 U, I, O, J, K, L 控制左右上下顺时逆时旋转. 如果觉得平移速度慢, 可以在 Camera Point VIew 中, 勾选 Acceleration

渲染


   
python render.py -m [训练结果路径]

   
python metrics.py -m <path to trained model> # Compute error metrics on renderings

自采集数据测试

准备图片集

  • 采集方式
    用于训练的图片集采集有两种方式, 一种是手机顺序从不同角度拍照, 另一种是拍视频后逐帧提取. 两种方式各有利弊, 拍照可以更方便控制光圈,快门和白平衡, 用尽可能小的光圈和短时间的快门达到图像整体尽量清晰的结果, 但是拍照时较难控制好角度可能会造成部分交叠区域过小, 视频比较容易实现连续的画面移动, 保证交叠区域, 但是大多数手机没法手动控制视频录制过程的光圈和白平衡, 并且手机录制视频的分辨率大多数是通过后期插值填充的, 拍摄1080p视频时, 实际有效像素并没有1080p.
    我自己实际使用中, 用视频方式提取的帧训练出来的结果, 整体质量会更好一点.
  • 图片数量
    另外一方面是图片集的数量, 这个一般按角度每3度一帧比较合适, 也就是一个物体绕一周至少需要120张图计算. 如果物体较大绕了两圈, 则至少要240张图.
  • 图片分辨率
    图片分辨率跟你的显卡显存有关. 16G的显存, 训练 1920x1080分辨率大概率是不够的, 在 train.py 那一步会报torch.OutOfMemoryError: CUDA out of memory.错误. 如果出现这种错误, 就把分辨率适当降一点. 实际测试1366x768分辨率可以用16G显存的显卡跑通但是速度较慢, 1024x576分辨率训练速度较快且细节保留还不错.

方式一: 使用 python 代码提取


   
from pathlib import Path
import cv2
work_path = '/home/milton/temp'
image_path = '/input'
imgpath = Path(work_path + image_path)
imgpath.mkdir(exist_ok = True)
cap = cv2.VideoCapture(work_path + '/557 Marksbury Road Pickering Open House Video Tour.mp4')
frame_no = 0
while cap.isOpened():
ret, frame = cap.read()
if ret:
# 视频是 60fps, 每秒取3帧, 因此每20帧取一帧
if frame_no % 20 == 0:
# {:0>5}是固定5位, 左边填充0
target = work_path + image_path + '/{:0>5}.jpg'.format((int)(frame_no / 20))
print(target)
cv2.imwrite(target, frame)
frame_no += 1
else:
cap.release()
break
print('done')

方式二: 使用 ffmpeg 提取

使用 ffmpeg 将视频帧按固定间隔抽取为图片, 下面的命令将视频帧以较小的压缩率转换为jpg文件, FRAMES_PER_SEC是每秒抽取的帧数.


   
ffmpeg -i <PATH_VIDEO> -qscale:v 1 -qmin 1 -vf fps=<FRAMES_PER_SEC> <PATH_OUTPUT>/%04d.jpg

如果需要缩小图片(按比例缩小), 需要加上-vf scale=720:-1参数, 这个意思是将宽度变为720,高度按比例调整, 如果按固定高度调整, 则是-vf scale=-1:357, 例如


   
ffmpeg -i 557VideoTour.mp4 -vf fps=2,scale=720:-1 input/%05d.png

转换和训练

转换训练和前面使用默认数据集的处理方式是一样的. 图片必须在 input 子目录下, 执行命令


   
python ./convert.py -s [路径]

这一步结束后会在input同一级目录下, 产生 distored, images, sparse, stereo 等目录, 其中 images 和 sparse/0 目录是下一步训练要用到的文件. 可以直接用于训练


   
python train.py -s [路径]

问题处理

we could not find ninja or g++

没安装编译需要的依赖


   
sudo apt-get update
sudo apt install build-essential
sudo apt-get install ninja-build

No such file or directory: ‘:/usr/local/cuda-11.8/bin/nvcc

没有设置 CUDA_HOME


   
export CUDA_HOME=/usr/local/cuda

重建实例

访问下面的链接如果浏览器界面一直空白转圈的话, 用邮箱在 https://poly.cam 上注册登录后再刷新下就能打开了

原创作者: milton 转载于: https://www.cnblogs.com/milton/p/18799695
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值