概念
3D Gaussian splatting 是一种基于辐射场的新的渲染技术, 使用 3D Gaussian 表示3D场景, 通过 Splatting 技术渲染, 能使用较少的训练时间实现高还原度的视觉效果.
技术特点
- 实时高清渲染: 能够通过少量稀疏图像,实时(需要有足够的硬件算力)渲染出高还原度的场景
- 高斯函数建模: 该方法利用3D高斯球表示场景中的点,并通过优化其参数实现较好的视觉保真度
- 高效训练与渲染: 依托快速, 可微分的高斯光栅化技术, 显著提升了训练和渲染效率
- 超越传统方法的优势: 相比传统渲染技术, 该技术以更快的速度处理复杂场景
- 局限性: 需大量显存和存储, 且与现有渲染管线的兼容性需要完善
方法
该方法包括几个关键步骤:
- 数据输入: 一组静态场景的图像以及摄像机位置, 表示为稀疏的点云
- 3D高斯: 确定每个高斯的均值, 协方差矩阵和不透明度
- 颜色表示: 使用球面调和来模拟视图相关的外观
- 优化算法: 使用随机梯度下降优化参数, 以最小化结合L1损失和D-SSIM的损失函数
- 光栅化器: 实现一个基于图块的光栅化器, 用于快速排序和反向传递, 支持高斯分量的高效混合
该方法使用可微分的3D高斯分布图, 其是非结构化和显式的, 允许快速渲染和投影到2D分布图. 高斯分布的协方差可以被认为是一个椭球的配置, 它可以在数学上分解成一个比例矩阵和一个旋转矩阵. 所有参数的梯度都是显式导出的, 以克服自动挖掘造成的任何开销. 该优化创建了一组尽可能精确地表示场景的密集的3D高斯分布, 每一步渲染之后都要与数据集中可用的训练视图进行比较.
论文资料
- (重要)论文 https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_low.pdf
- 相关论文
- https://arxiv.org/html/2406.18533v1
On Scaling Up 3D Gaussian Splatting Training
- https://arxiv.org/html/2406.18533v1
扩展阅读
- (重要)https://zhuanlan.zhihu.com/p/680669616
这篇讲的比较详细易懂 - https://metaschool.so/articles/gaussian-splatting
英文版的详细介绍, 比较通俗易懂 - https://www.magnopus.com/blog/the-rise-of-3d-gaussian-splatting
- Animatable Gaussian Avatar https://github.com/heawon-yoon/anim-gaussian
使用3D高斯制作3D人物动画头像, 包含安装步骤
知识基础
- Python语言入门: https://www.youtube.com/watch?v=K5KVEU3aaeQ&t=56s
- PyTorch入门: https://www.youtube.com/playlist?list=PLqnslRFeH2UrcDBWF5mfPGpqQDSta6VK4
- Colmap和计算机图形学 https://colmap.github.io/tutorial.html
视频
合集 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
其它
- Creating 3D Game Models from Video using Photogrammetry https://www.youtube.com/watch?v=bDHJM6nAKtc
7年前的3D重建技术 - 3D Gaussian Splatting Demo https://www.youtube.com/watch?v=c0VNckM21B0
用iPhone XR拍摄后, 使用3D高斯渲染的效果演示 - Turn Yourself into a 3D Gaussian Splat https://towardsdatascience.com/turn-yourself-into-a-3d-gaussian-splat-3a2bc59a770f/
使用3D高斯技术重建个人三维图像 - https://github.com/MrNeRF/awesome-3D-gaussian-splatting
B站中文
- (重要) https://www.bilibili.com/video/BV11e411n79b
3D高斯介绍 - (重要) https://www.bilibili.com/video/BV1bJ4m1b7qW/
3D高斯与其他两种重建方法的效果对比
安装步骤
安装必要的库和依赖
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
- https://github.com/colmap/colmap/issues/2366
- https://github.com/dberga/nerfstudio/blob/main/INSTALL.md
- https://blog.youkuaiyun.com/Gloamirror/article/details/132426070 问题处理
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
- https://www.youtube.com/watch?v=pvvnPib4lFA
- https://www.youtube.com/watch?v=mUDzWCuopBo
- https://www.youtube.com/watch?v=Zm1mkOi9_1c&pp=ygUGY29sbWFw
- https://zxl19.github.io/colmap-note/
导出项目仓库
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