3DGS上手第二期:自制数据集跑通3DGS全流程

从手机视频到 3D 模型,手把手教你用自己的素材跑通 3DGS

目录

  1. 前言
  2. 数据集核心要求与拍摄建议
  3. 前置工具安装:COLMAP/FFmpeg/ImageMagick
  4. 第一步:视频转图片
  5. 第二步:COLMAP 稀疏重建(手动 UI 版)
  6. 第三步:数据集格式转换
  7. 第四步:小 GPU 极速训练(从 48s/it 到 100it/s)
  8. 训练后:3D 模型查看
  9. 总结与参考资料

前言

上一期我们搞定了 3DGS 的环境安装,解决了 Windows 下的各种兼容坑,这一期我们来实操:用自己手机拍的视频,制作属于自己的 3DGS 数据集,从拍摄、COLMAP 重建,到格式转换、小 GPU 极速训练,全流程手把手教你,让你不用再用官方的测试数据集,真正把 3DGS 用起来。


一、数据集核心要求与拍摄建议

在开始之前,我们先搞懂 3DGS 的数据集到底需要什么,还有拍摄的时候要注意什么,这直接决定了你最后重建的效果:

3DGS 数据集核心要求

3DGS 数据集需包含三大核心内容:

  1. 图像序列:多角度、无遮挡、均匀覆盖目标场景
  2. 相机内参:焦距、畸变系数等
  3. 相机外参:每个图像的位姿:旋转矩阵 + 平移向量
  4. 稠密点云:可选,用于初始化高斯分布

而 COLMAP 的核心作用,就是自动帮我们计算相机参数与位姿,生成 3DGS 兼容的格式,不用我们手动去算。

拍摄建议(直接影响重建质量)

拍摄的时候一定要注意这些,不然 COLMAP 可能重建失败,或者效果很差:

  • 相邻照片重叠区域足够:最好 > 60%,所以视频运镜要慢,别太快
  • 避免无纹理区域:别拍纯白墙、纯玻璃、强反光,这些地方特征点太少,COLMAP 匹配不上
  • 锁定曝光 / 对焦:减少跨帧亮度漂移,不然特征点匹配会出错
  • 绕一圈拍摄:不要只在一条线上拍,要把物体的所有面、所有细节都拍进去
  • 分辨率不用太高:3DGS 目标图像分辨率在 1~1.6K 像素范围内,所以 1080P 的视频就够了,太高了反而增加计算量

二、前置工具安装

我们需要先装三个工具:COLMAP(重建用)、FFmpeg(视频转图片用)、ImageMagick(可选,调整分辨率用)

1. 安装 COLMAP

COLMAP 是用来做三维重建的核心工具,直接下载预编译版本就行,不用自己编译:

  1. 下载地址: https://github.com/colmap/colmap/releases
  2. 下载对应 Windows 的安装包,安装好之后,把 COLMAP 的安装路径下的bin文件夹,加到系统的Path环境变量里

在这里插入图片描述

  1. 验证:打开终端,输入colmap.bat,如果能正常打开 COLMAP,说明安装成功了

在这里插入图片描述

2. 安装 FFmpeg

FFmpeg 用来把我们拍的视频,抽成一张张的图片,方便 COLMAP 处理:

  1. 下载地址: https://ffmpeg.org/download.html
  2. 下载对应 Windows 的版本,解压后,把里面的bin文件夹,加到系统的Path环境变量里

在这里插入图片描述

  1. 验证:打开终端,输入ffmpeg -version,如果能输出版本信息,说明安装成功了

3. 安装 ImageMagick(非必须)

如果你的视频 / 图片分辨率超过了 1.6K,或者你想自动调整分辨率,可以装这个工具,3DGS 的 convert.py 脚本会自动调用它:

  1. 下载地址: https://imagemagick.org/script/download.php
  2. 下载对应 Windows 的版本,默认安装就行

在这里插入图片描述

  1. 验证:打开终端,输入:
magick logo: logo.gif
magick identify logo.gif

如果没有报错,说明安装成功了

在这里插入图片描述


三、第一步:视频转图片

工具都装好了,接下来开始处理我们的视频:

  1. 用手机拍 1分钟左右的视频,注意前面的拍摄建议,另外,时间不宜过长,会极大影响COLMAP制作数据集和模型训练的时间,参考1分钟400张图片,数据集制作约两个半小时
  2. 把视频传到电脑上,重命名为简单的名字,比如input.mp4
  3. 在视频同目录下,创建一个input文件夹,用来放抽出来的图片
  4. 执行下面的命令,把视频转成图片:
ffmpeg -i input.mp4 -vf "setpts=0.2*PTS" input/image_%04d.jpg

在这里插入图片描述

这个命令会把视频的帧率提高,抽出来的图片会更密集,保证相邻图片的重叠度足够。

完成以上步骤后,3DGS提供的convert.py脚本可以根据图片文件夹,自行调用colmap和ImageMagick【非必须】对图片进行处理,生成数据集,执行指令如下(注意需要在3DGS根目录下运行):

conda activate gaussian_splatting
python convert.py -s <location> [--resize] #If not resizing, ImageMagick is not needed

参数位置填数据集的地址,即前面创建的data文件夹的地址,注意不是填input文件夹的地址

如果这里执行报错,显示找不到两个程序的位置,可以使用可选参数 --colmap_executable 和 --magick_executable 指向相应的路径

注意,如果这里选择使用convert自动生成数据集,那么后面的所有与生成数据集相关的内容都可以忽略了(四~六)

不过,这里我演示一下使用colmap的UI界面处理数据集的办法,如下:


四、第二步:COLMAP 稀疏重建(手动 UI 版)

接下来,我们用 COLMAP 来做稀疏重建,这里我演示一下手动 UI 版的步骤,比自动脚本更直观,方便你排查问题:

1. 准备数据集目录

首先,在 3DGS 的源码文件夹下,创建一个data文件夹,作为我们的数据集根目录:

  • 把刚才转好的input图片文件夹,移到data文件夹里
  • data文件夹里,创建一个distorted文件夹,用来放 COLMAP 的输出

2. 新建 COLMAP 项目

  1. 打开 COLMAP,点击左上角File -> New project

在这里插入图片描述

  1. 在弹窗里:

在这里插入图片描述

  • 点击New,在data/distorted文件夹下,创建database.db文件

在这里插入图片描述

  • 点击Select,选择我们的data/input图片文件夹
  • 点击Save

3. 特征提取

  1. 点击Processing -> Feature extraction

在这里插入图片描述

  1. 弹窗里直接点击Extract,开始提取图片的特征点,等待完成

在这里插入图片描述

4. 特征匹配

  1. 特征提取完成后,点击Processing -> Feature matching

在这里插入图片描述

  1. 弹窗里直接点击Run,开始匹配不同图片之间的特征点,等待完成

在这里插入图片描述

5. 稀疏重建

  1. 匹配完成后,点击Reconstruction -> Start reconstruction,开始稀疏重建

在这里插入图片描述

  1. ⚠️ 注意:这个过程非常耗时!我用的是 i5-13500H 的笔记本 CPU,测试了不同数量的图片:
  • 100 张 1080P 图:20 分钟以内
  • 300 张图:1 小时左右
  • 465 张图:花了整整 3 小时!

在这里插入图片描述

  • 而且时间是非线性的,越到后面越慢,所以大家要评估好时间,在图片数量和重建质量之间做取舍

五、第三步:整理数据集结构

COLMAP 重建完之后,我们要把它整理成 3DGS 要求的数据集结构,不然 3DGS 找不到文件:

标准数据集结构

3DGS 要求的 COLMAP 数据集结构是这样的:

<location> # 数据集根目录(就是我们的data文件夹)
|---input # 输入图像目录
| |---image_0001.jpg
| |---image_0002.jpg
| |---...
|---distorted
|---database.db
|---sparse # 稀疏重建结果
|---0
|---cameras.bin
|---images.bin
|---points3D.bin

导出 COLMAP 模型

  1. 首先,把之前的colmap_output文件夹改名为distorted(如果之前叫别的名字的话)
  2. distorted文件夹里,创建sparse/0这两级文件夹
  3. 回到 COLMAP 的界面,切换到点云最多的那个模型(注意:最新的模型不一定是最好的,要选点云最多的)

在这里插入图片描述

  1. 点击左上角File -> Export model,把模型导出到distorted/sparse/0文件夹下

在这里插入图片描述

  1. 检查一下,sparse/0文件夹里,是不是有这三个文件:cameras.binimages.binpoints3D.bin,有就说明对了

在这里插入图片描述

可选:稠密重建

如果觉得稀疏重建的效果不够好,你还可以做稠密重建,不过会更耗时:

  1. 点击Reconstruction -> Dense Reconstruction
  2. 选择我们的input图片文件夹
  3. 先做Undistortion图像校正
  4. 然后做Stereo视差图计算,这个会更慢,耐心等待就行

具体操作参考 colmap三维重建(自制数据集) - 知乎

六、第四步:数据集格式转换

COLMAP 的数据集,还需要转换成 3DGS 能直接用的格式,用官方的convert.py脚本就行:

  1. 打开终端,激活我们的 3DGS 的 conda 环境:
conda activate gaussian_splatting
  1. 执行转换命令,这里我们用--skip_matching参数,跳过 COLMAP 重建的部分,因为我们已经手动做完了:
python convert.py -s ./data --skip_matching [--resize]
  • -s后面填我们的数据集根目录,也就是data文件夹的路径
  • --resize是可选的,如果你装了 ImageMagick,就可以用它自动把图片缩到合适的分辨率
  • 如果之前找不到 COLMAP 的路径,可以加参数:--colmap_executable指向 COLMAP 的 exe 路径,--magick_executable指向 ImageMagick 的路径

执行完之后,格式就转换好了,接下来就可以训练了!


七、第五步:小 GPU 极速训练(从 48s/it 到 100it/s)

最开始我用默认参数训练,465 张图,速度居然是 48 秒一次迭代?3 万次迭代的话要快一个月?这谁受得了!

在这里插入图片描述

后来我装了加速的光栅化器,再优化了参数,直接把速度提到了 100 次每秒,差距太大了!

1. 安装加速光栅化器

首先,我们要把原来的 diff-gaussian-rasterization,换成加速的3dgs_accel分支:

# 卸载原来的版本
pip uninstall diff-gaussian-rasterization -y

# 切换到加速分支,重新编译
cd submodules/diff-gaussian-rasterization
rm -r build
git checkout 3dgs_accel
# 如果pip安装报错,就用python setup.py install
pip install .
# 或者 python setup.py install
cd ../..

2. 优化训练参数

然后,我们用优化后的训练命令,所有的加速参数都加好了:

python train.py -s ./data ^
--optimizer_type sparse_adam ^
--iterations 10000 ^
-r 2 ^
--sh_degree 1 ^
--densify_until_iter 7000 ^
--densification_interval 200 ^
--test_iterations 7000 10000 ^
--save_iterations 7000 10000

每个参数的提速原理

参数 作用 提速效果
--optimizer_type sparse_adam 核心! 加速优化器,官方直接带来 2.7 倍训练加速,这是最大的提速点 直接把 48s/it 砍到 17s/it 以内
--iterations 10000 总迭代从 3 万砍到 1 万,官方验证:1 万次已经足够 99% 的场景收敛,后面 2 万次都是微调到肉眼不可见 总时间直接省 2/3
-r 2 图像分辨率降到 1/2,大幅减少像素处理量,小 GPU 友好,视觉上几乎没差别 再提速 30%,同时节省显存
--sh_degree 1 球谐函数阶数从 3 降到 1,减少颜色计算,大部分场景视觉差别极小 再提速 20%
--densify_until_iter 7000 提前结束高斯点密集化,7000 次后就不再增加新的点,后面迭代速度越来越快 避免后期密集化拖慢速度
--densification_interval 200 密集化频率从 100 次一次改成 200 次一次,减少密集化耗时 再提速 15%
--test_iterations/save_iterations 减少测试和保存的次数,避免频繁渲染浪费时间 省掉大量额外的渲染耗时

优化完之后,速度直接起飞,我这里直接跑到了 100 次每秒,原来要一个月的训练,现在几分钟就跑完了!

在这里插入图片描述

⚠️ 注意:为了速度,我们牺牲了一点质量,所以最后出来的 3D 模型会有点模糊,不过大体的特征都能展现出来,如果你想要更高的质量,可以把参数调回去,在速度和质量之间做平衡就行。

在这里插入图片描述
)


八、训练后:3D 模型查看

训练完之后,就可以用查看器看我们的 3D 模型了,和上一期一样,用官方的预编译查看器就行:

  1. 下载预编译查看器: https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/binaries/viewers.zip
  2. 解压后,在终端执行:
./bin/SIBR_gaussianViewer_app.exe -m <path to trained model>
  • ,填你训练好的模型路径,一般在 ./output/下面的随机命名文件夹里

在这里插入图片描述

查看器快捷键

和之前一样,默认的 FPS 导航器:

  • W/A/S/D/Q/E:控制相机平移
  • I/K/J/L/U/O:控制相机旋转
  • 鼠标拖动:旋转视角,滚轮缩放

九、总结

到这里,我们就完成了从手机视频,到 3D 模型的全流程:

  1. 拍摄视频,转成图片
  2. 用 COLMAP 做稀疏重建,计算相机参数
  3. 整理数据集,转换成 3DGS 的格式
  4. 安装加速模块,优化参数,小 GPU 也能快速训练
  5. 查看训练好的 3D 模型

整个流程下来,只要几个小时,你就能得到自己的 3D 重建模型了,是不是很简单?


参考资料

  1. 3DGS 官方仓库: https://github.com/graphdeco-inria/gaussian-splatting
  2. COLMAP 官方文档: https://colmap.github.io/
  3. CSDN 教程: https://blog.csdn.net/qq_63521473/article/details/156314637
  4. CSDN 教程: https://blog.csdn.net/jingpide9527/article/details/154948030
  5. 知乎教程: https://zhuanlan.zhihu.com/p/708739737
  6. Youtube视频教程:https://www.youtube.com/watch?v=UXtuigy_wYc
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐