3D高斯泼溅的基本使用

1 概述

3D高斯泼溅(3D Gaussian Splatting,简称3DGS)是近期热门的静态3D重建与渲染方案,只需要拍摄物体各个角度的照片,就能生成该物体的3D模型。它用无数个个会发光、会透明、会变形的3D高斯椭球来同时表示几何+外观,然后通过非常快的可微分光栅化(Splatting)直接渲染出画面。

本文尽量基于开源方案,介绍基本使用步骤。操作系统使用Ubuntu 24,主要软件包括Python、CUDA、COLMAP、gsplat。电脑硬件需要支持CUDA的独立显卡,我这里使用的是NVIDIA GTX 2080,8GB显存。

视频教程参考:《3D高斯第2期:无需梯子 免费 3D高斯训练环境,从图片到3D模型。》,文档和Python脚本也来自他的网站:重建世界LAB

2 安装WSL

虽然Windows系统也能使用这些开源软件,但考虑到一些编译环境和软件包管理的方便性,还是使用Ubuntu这个Linux系统。在Windows平台上,通过WSL创建Ubuntu系统的虚拟机即可。

打开powershell,执行:

wsl.exe --install

此命令将创建一个Ubuntu虚拟机,当前版本号是24.04.3 LTS。安装完成后,开始菜单搜索打开WSL,可以访问Ubuntu系统的终端提示符。文章之后的命令,没有特殊说明的话,就是在Ubuntu系统中执行。

我安装完成后遇到了无法解析域名的问题,解决方案在《WSL笔记》。

WSL虚拟机支持Windows系统已安装的NVIDIA的显卡驱动程序,不需要重复安装。在Ubuntu系统中可通过以下命令查看NVIDIA显卡驱动状态:

nvidia-smi

Ubuntu系统中的文件可以直接在Windows资源管理器中访问,如图:

另外,我更换了Ubuntu系统的软件源为国内阿里云的。编辑文件/etc/apt/sources.list.d/ubuntu.sources,替换内容为:

# 阿里云
Types: deb
URIs: http://mirrors.aliyun.com/ubuntu/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

3 素材来源

素材可以是视频、照片,也可以是3D游戏截图。

我这里使用了《无限暖暖》这个3D游戏,因为它的截图比较方便,能完全隐藏UI和人物。在一间屋子里,以大概每20度拍摄一张照片,覆盖屋内的所有家具。

4 生成模型

4.1 安装CUDA Toolkit

官网:https://developer.nvidia.com/cuda-downloads

按照页面提示,获取到用于Ubuntu 24版本的CUDA Toolkit下载路径,当前版本是13.1。

按照页面提示,通过wget下载到完整安装包,然后执行安装即可。

wget https://developer.download.nvidia.com/compute/cuda/13.1.1/local_installers/cuda_13.1.1_590.48.01_linux.run
sudo sh cuda_13.1.1_590.48.01_linux.run

编辑~/.bashrc,在文件的最后增加CUDA路径,需要注意CUDA的版本号,如下:

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

然后执行

source ~/.bashrc

通过执行nvcc -V,可以查看CUDA的驱动状态。

4.2 安装编译软件

有些软件需要通过源码编译,因此这里一次性的安装依赖软件

sudo apt-get update && sudo apt-get install -y git cmake build-essential ninja-build libboost-program-options-dev libboost-filesystem-dev libboost-graph-dev libboost-system-dev libboost-test-dev libeigen3-dev libfreeimage-dev libgoogle-glog-dev libgflags-dev libglew-dev libqt5opengl5-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libatlas-base-dev libsuitesparse-dev libcgal-dev libcgal-qt5-dev libceres-dev libflann-dev liblz4-dev libsqlite3-dev libmetis-dev

4.3 安装COLMAP

官方安装教程:https://colmap.github.io/install.html

这里通过源码编译安装,版本使用最新Release版本3.13

git clone https://github.com/colmap/colmap.git 
cd colmap
git checkout release/3.13 --force
mkdir build
cd build
cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=native
ninja
sudo ninja install

4.4 安装Python

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc
修改conda的源为国内清华大学的【可选】

编辑~/.condarc文件,改为:

channels:
    - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
    - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
    - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    - nodefaults
show_channel_urls: true

创建一个Python 3.13版本的虚拟环境,名字为gsplat

conda create -n gsplat python=3.13
conda activate gsplat
将 pip 源永久设置为清华源【可选】
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

4.5 安装pytorch

注意以下链接的最后cu130,这是对应CUDA版本,虽然当前CUDA是13.1,但pytorch最新的cu130是兼容的。

pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130

验证是否成功:

python
import torch 
torch.cuda.is_available()

输出True说明成功。

4.6 安装gsplat

pip install gsplat

为了获取一些生成模型所需要的python脚本,还需要将gsplat的源码下载下来:

git clone https://github.com/nerfstudio-project/gsplat.git
cd gsplat/examples
pip install -r requirements.txt --no-build-isolation

gsplat/examples目录下,有个simple_trainer.py文件,稍后将通过它生成模型。

5 生成3DGS模型

5.1 使用COLMAP处理图片

COLMAP 给 3DGS 提供“相机在哪里拍的”和“场景的大致 3D 骨架”,没有它 gsplat 无法知道相机位置和初始几何。

这里使用源自“重建世界LAB”网站提供的脚本,保存为mapping.sh文件。

#!/bin/bash

# 检查参数
if [ -z "$1" ]; then
  echo "❌ 用法: ./process_scene.sh <图片文件夹绝对路径> [可选: 输出目录名称]"
  echo "📝 示例: ./process_scene.sh /home/mz/photos/my_cat"
  exit 1
fi

# 1. 获取图片的绝对路径
IMAGE_PATH=$(realpath "$1")

# 2. 设定工作目录 (核心修改)
# 如果用户指定了第二个参数,就用那个;否则默认在当前目录下创建 "3dgs_project"
if [ -n "$2" ]; then
    WORK_DIR=$(realpath "$2")
else
    # 获取当前终端所在的路径
    CURRENT_RUN_DIR=$(pwd)
    WORK_DIR="$CURRENT_RUN_DIR/3dgs_project"
fi

# 创建工作目录
mkdir -p "$WORK_DIR"

# 设定 COLMAP 需要的文件路径
DB_PATH="$WORK_DIR/database.db"
SPARSE_PATH="$WORK_DIR/sparse"
OUTPUT_PATH="$WORK_DIR/output"

echo "========================================"
echo "📂 图片来源: $IMAGE_PATH"
echo "🎯 输出位置: $WORK_DIR"
echo "========================================"

# ---------------------------------------------------------
# 开始 COLMAP 流程
# ---------------------------------------------------------

# 1. 特征提取
echo "--> [1/4] 特征提取..."
colmap feature_extractor \
    --database_path "$DB_PATH" \
    --image_path "$IMAGE_PATH" \
    --ImageReader.camera_model SIMPLE_RADIAL \
    --ImageReader.single_camera 1

# 2. 特征匹配
echo "--> [2/4] 特征匹配..."
colmap exhaustive_matcher \
    --database_path "$DB_PATH"

# 3. 稀疏重建 (应用了之前的宽松参数)
echo "--> [3/4] 稀疏重建..."
mkdir -p "$SPARSE_PATH"
colmap mapper \
    --database_path "$DB_PATH" \
    --image_path "$IMAGE_PATH" \
    --output_path "$SPARSE_PATH" \
    --Mapper.min_num_matches 10 \
    --Mapper.init_min_num_inliers 50 \
    --Mapper.abs_pose_min_num_inliers 15 \
    --Mapper.abs_pose_min_inlier_ratio 0.1

# 4. 去畸变 (生成最终给 3DGS 的数据)
echo "--> [4/4] 图像去畸变与整理..."
mkdir -p "$OUTPUT_PATH"

# 检查是否生成了模型 0 (防止报错)
if [ ! -d "$SPARSE_PATH/0" ]; then
    echo "❌ 错误: 稀疏重建失败,没有生成 sparse/0 文件夹。"
    echo "   请检查图片是否有足够的重叠度。"
    exit 1
fi

colmap image_undistorter \
    --image_path "$IMAGE_PATH" \
    --input_path "$SPARSE_PATH/0" \
    --output_path "$OUTPUT_PATH" \
    --output_type COLMAP \
    --max_image_size 2000 

# ==========================================
# 🧹 清理多余文件 (关键修改)
# ==========================================
echo "--> 正在清理 MVS 多余文件..."

# 删除 stereo 文件夹 (MVS 稠密重建才需要,3DGS 不需要)
rm -rf "$OUTPUT_PATH/stereo"

# 删除自动生成的 .sh 脚本
rm -f "$OUTPUT_PATH/run-colmap-geometric.sh"
rm -f "$OUTPUT_PATH/run-colmap-photometric.sh"

echo "========================================"
echo "✅ 全部完成!"
echo "👉 给 3DGS 训练的路径是: $OUTPUT_PATH"
echo "========================================"

然后赋予这个脚本文件可执行权限:

sudo chmod +x mapping.sh

例如拍摄的图片位于~/code/data目录中,处理后的数据存放于~/code/data_colmap中,我们执行:

./mapping.sh ~/code/data ~/code/data_colmap

等待执行完成后,~/code/data_colmap中将包含这些目录和文件output、sparse、database.db。

5.2 使用gsplat生成3DGS模型

gsplat利用 COLMAP 提供的相机位姿和初始点云,训练出最终的 3D Gaussian Splatting 模型,并导出.ply文件。

gsplat提供了两种训练策略,一种是默认策略,一种是MCMC策略。其中MCMC策略能减少模型中的杂质。

例如上一步COLMAP处理后的数据存放于~/code/data_colmap中,gsplat将生成的数据存放于~/code/data_gsplat中。切换到之前下载的gsplat/examples目录中,执行

默认策略:

python simple_trainer.py default --data_dir ~/code/data_colmap --result_dir ~/code/data_gsplat --data_factor 1 --save_ply

MCMC策略:

python simple_trainer.py mcmc --data_dir ~/code/data_colmap --result_dir ~/code/data_gsplat --data_factor 1 --save_ply

执行完成后,在~/code/data_gsplat/ply目录中可以看到最终生成的point_cloud_29999.ply文件。可以通过https://superspl.at/editor这个在线编辑器打开。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注