
概念
3D Gaussian splatting 是一种基于辐射场的新的渲染技术, 使用 3D Gaussian 表示3D场景, 通过 Splatting 技术渲染, 能使用较少的训练时间实现高还原度的视觉效果.
技术特点
- 实时高清渲染: 能够通过少量稀疏图像,快速迭代训练(需要有足够的硬件算力)渲染出高还原度的场景
- 高斯函数建模: 该方法利用3D高斯球表示场景中的点,并通过优化其参数实现较好的视觉保真度
- 高效训练与渲染: 依托快速, 可微分的光栅化技术, 提升了训练和渲染效率
- 超越传统方法的优势: 相比其它渲染技术, 该技术还原度高, 并且速度更快
该方法包括几个关键步骤:
- 数据输入: 一组静态场景的图像以及摄像机位置, 表示为稀疏的点云, 论文项目中通过colmap处理得到
- 3D高斯: 确定每个高斯的均值, 协方差矩阵和不透明度
- 颜色表示: 使用球面调和来模拟视图相关的外观
- 优化算法: 使用随机梯度下降优化参数, 以最小化结合L1损失和D-SSIM的损失函数
- 光栅化器: 实现一个基于图块的光栅化器, 用于快速排序和反向传递, 支持高斯分量的高效混合
论文资料
- 论文 https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_low.pdf
- 资料 https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
- GitHub https://github.com/graphdeco-inria/gaussian-splatting
相关阅读
- 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人物动画头像, 包含安装步骤
知识和相关视频
- SIFT https://www.youtube.com/playlist?list=PL2zRqk16wsdqXEMpHrc4Qnb5rA1Cylrhx
- SFM, Structure From Motion https://www.youtube.com/playlist?list=PL2zRqk16wsdoYzrWStffqBAoUY8XdvatV
- Colmap https://colmap.github.io/tutorial.html
B站中文
- https://space.bilibili.com/623475709
详细的3D高斯说明 - https://www.bilibili.com/video/BV11e411n79b
3D高斯介绍 - https://www.bilibili.com/video/BV1bJ4m1b7qW/
3D高斯与其他两种重建方法的效果对比
安装步骤
安装必要的库和依赖
Ubuntu
Ubuntu 22.04 的 GCC 版本是 11, Ubuntu 24.04 的 GCC 版本是 13, gaussian-splatting 这个项目在 GCC 13 下 pip install submodules 时会报编译错误. 如果用 24.04 需要将系统 GCC 版本换成 11
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, 可以将下面的命令存为env文件, 每次通过source命令加载
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, 安装命令会随版本变化, 所以请以网站上生成的命令为准. 如果直接使用官方源很慢, 可以用-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.csdn.net/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
# p104-100对应61, 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渲染.
训练中可以使用的参数
--antialiasing: 抗锯齿, 2024年8月在核心模块 diff-gaussian-rasterization 的 dr_aa 分支加入的. 实测使用这个参数后效果反而变差, 边缘尖刺增加--optimizer_type, 可以指定default,sparse_adam两种加速方式, 2024年7月在核心模块 diff-gaussian-rasterization 的 3dgs_accel 分支加入的, 使用sparse_adam实测速度提升明显, 训练时间只有未开启加速的一半. 从显卡功耗看, 比未开启加速功耗增加20%.
View 查看
第三方网页工具
快速查看可以用第三方的网页工具, 例如 https://poly.cam/tools/gaussian-splatting, 可以注册后免费上传 ply 文件.
SIBR Viewer
用项目自带的 SIBR Viewer 需要编译安装, 编译过程需要nvcc, 如果是不支持CUDA的显卡, 这部分就不用尝试了. 代码对显卡CUDA架构版本也有要求, 要 CUDA_ARCHITECTURE >= 7.x, 所以在 RTX10xx, P104-100, P106 上不能正常运行, 需要的显卡型号最低为 GTX16xx, RTX20xx.
在 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/input'
target_height = 720
imgpath = Path(work_path)
imgpath.mkdir(exist_ok = True)
cap = cv2.VideoCapture('/home/milton/temp/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:
original_height, original_width = frame.shape[:2]
scaling_factor = target_height / original_height
target_width = int(original_width * scaling_factor)
resized_frame = cv2.resize(
frame,
(target_width, target_height),
interpolation=cv2.INTER_AREA)
# {:0>5}是固定5位, 左边填充0
target = work_path + '/{:0>5}.jpg'.format((int)(frame_no / 20))
print(target)
cv2.imwrite(target, resized_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
重建实例
访问下面的链接会下载几十MB的文件, 如果带宽较小需要耐心等待. 有时候页面资源在墙内会被拦截, 需要梯子上网.
原创作者: milton 转载于: https://www.cnblogs.com/milton/p/18799695


所有评论(0)