3D Gaussian Splatting 真实场景的光场图像渲染
一、基本原理实现
3DGS 将稀疏的点云变成 3D 空间中的椭球体,每个椭球体拥有位置、颜色、不透明度、协方差(大小),当混合在一起时,可以产生从任何角度渲染的完整模型的可视化效果;
整体框架
- 通过 SfM 获取初始化稀疏点云(采样点);
- 基于初始化点云生成 3D 高斯椭球集;
- 利用投影矩阵将 3D 高斯椭球投影的 2D 平面;
- 进行场景渲染(分 tile 16*16);
- 计算 Loss 以及梯度回传;
- 基于梯度自适应改变点云的分布方式;
二、构建场景数据
针对实际场景重建需要获取场景各个角度的图片,并且每张照片尽量保持一致的曝光。由于也可以录制视频提取单帧来获取图片,因此构建场景数据集主要通过以下两种方式:
获取重建场景各个角度图片,尽量保持一致曝光,推荐100-1000张;
利用 FFMPEG工具构建真实场景数据集
使用的基本命令如下,
video_addr
指的是实际视频文件地址,FPS
主要影响每秒采多少帧的图像:
1 | ffmpeg -i {video_addr} -qscale:v 1 -qmin 1 -vf fps={FPS} %04d.jpg |
构建的场景数据集
数据集目录结构
1 | <dataset_name> |
三、获取相机位姿
3DGS 需要利用稀疏点云作为输入进行建模,因此我们需要针对场景数据集建立点云。本项目中我们可以利用 COLMAP 获取相机位姿建立点云,安装完成后在终端执行以下命令,完成相机位姿和点云的建立:
1 | python convert.py -s data/dataset_name |
可视化相机位姿与点云
借助 COLMAP 工具我们可以对真实场景建立稀疏点云以及对应的相机位姿。
- 数据集目录结构
1 | <dataset_name> |
四、3DGS训练模型
针对构建好的真实场景数据以及 COLMAP 估计出的相机位姿,利用 3DGS 训练场景数据集对应的模型:
1 | python train.py -s data/playroom |
- 模型训练损失
- 场景渲染对比
训练完成后,会得到如下目录结构,其中 point_cloud.ply
就是训练好的点云模型文件。
1 | output |
五、渲染真实场景
利用 SIBR Viewers 可以利用训练好的模型文件渲染实际场景,具体在终端执行以下命令:
1 | ./viewers/bin/SIBR_gaussianViewer_app -m <path to trained model> |
- 整体渲染效果
- 不同缩放系数的影响
直观地感受到,从最开始的稀疏点云建立的椭球形模型不断优化,逐渐的渲染出整个实际场景。
六、其他真实场景的渲染
从构建的数据集以及渲染结果得出,场景视角越多,渲染出的场景图像质量越高,对于最后一个教学楼数据集,仅从单个视角构建图像时,渲染的3D场景效果就非常差。因此,如果想要得到质量更高的渲染场景,可以从多个视角拍摄一段连续的视频,再从中提取帧构造场景数据集。
七、自定义数据集
采用手机并固定焦距和曝光得到的一组真实场景数据集,然后利用 3DGS 渲染,得到如下逼真的场景结果:
3D Gaussian Splatting 真实场景的光场图像渲染