本文是对论文的详解与项目实现。
Paper:2023.12.01_FSGS: Real-Time Few-Shot View Synthesis using Gaussian Splatting
arxiv.org/pdf/2312.00451.pdf
Code:VITA-Group/FSGS: "FSGS: Real-Time Few-Shot View Synthesis using Gaussian Splatting", Zehao Zhu, Zhiwen Fan, Yifan Jiang, Zhangyang Wang (github.com)
论文
介绍
最近已成为在密集的摄像机透视集合中建模 3D 场景的有效表示。场景是使用 3D 高斯与复杂形状和外观建模属性的组合进行渲染的,而 2D 图像则通过基于飞溅的光栅化进行渲染。通过用高效的可微分溅射取代体积渲染,3D 高斯溅射实现了实时渲染速度,同时保持了从新角度渲染逼真的图像的能力。但是,3D-GS 是在 Structure-fromMotion (SfM) 点上初始化的,其性能高度依赖于初始化点的数量和精度。随后的高斯致密化可以增加重建不足和重建过度区域的高斯数量,但这种简单的策略在少数镜头设置中是不够的。由于缺乏初始化,结果往往会过度平滑和过度拟合学习视图。
本文的目标是构建一个简洁有效的表示,同时在有限的观察中保持视觉保真度。为此,作者提出了FSGS,它使用3D高斯作为表示,从sparseed的视角输入对大型场景进行建模。
弥合稀疏输入和密集覆盖之间差距的第一个挑战是如何有效地移动高斯位置以覆盖和表示 3D 场景。因此,作者提出了邻近引导的高斯解池,它测量现有高斯及其邻居的接近程度,以发展新的高斯。通过将新高斯放在最具代表性的位置,并用旧高斯的信息对其进行初始化,可以有效地增加高斯的数量,以实现全面的场景覆盖。
下一个挑战是如何让成年高斯正确地表示场景的几何形状,即使多视图线索不足。因此,为了控制和归一化新高斯的优化,必须利用额外的先验。具体来说,作者建议在训练视图和增强伪视图中使用预训练的单目深度估计器,以利用丰富的深度先验。这指导高斯解池收敛到有理解,并确保场景的几何平滑性。通过实现可微分深度光栅器实现积分深度先验的反向传播。
FSGS 可以以 203 FPS 的速度运行,这是真实世界渲染的实际速度,同时实现 SOTA 渲染质量。
模型方法
FSGS框架的概述如上图所示。FSGS 接受在静态场景中捕获的有限数量的图像。相机姿态和稀疏点云在运动结构 (SfM) 中计算。用于进一步学习的初始 3D 高斯在 SfM 点使用颜色、位置和形状属性进行初始化。通过采用邻近引导高斯解池来增加高斯的密度,测量现有高斯之间的接近度,并战略性地将新高斯放置在最具代表性的位置,以填补空白,增加细节处理能力,从而解决了SfM点极度稀疏和观测不足的问题。利用 2D 深度估计器,确保针对正确的场景几何优化致密高斯。
1. 初步和问题表述
3D Gaussian Splatting(3D-GS)位置向量M和协方差矩阵S,使用 3D 通过高斯集合显式表示3D 场景。根据 3D 高斯分布,每个高斯都是 3D 空间中的一个点x.
3D-GS 采用启发式高斯致密化系统。在这里,高斯根据阈值上方的视空间位置斜率的平均大小进行致密化。此方法对于使用全面的 SfM 点进行初始化是有效的,但不足以用来自 sparseed 视图输入图像的极其稀疏的点云完全覆盖整个场景。此外,一些高斯倾向于以非常大的体积增长,导致过度拟合到学习视图并错误地用到新视图。
2. 接近引导高斯解池
建模场景的粒度很大程度上取决于表示场景的 3D 高斯的质量。因此,解决 3D 场景的有限范围对于有效的稀疏视图建模至关重要。
邻近分数和图构造
在高斯优化期间,计算欧几里得距离以确定每个现有的高斯距离对对为了与最近的邻居建立联系,构建了一个称为邻近图的方向图。将头部的高斯标记为“源”高斯,尾部的高斯作为源对对邻居之一,“目的地”高斯。分配给每个高斯的邻近分数为对对它计算为到最近的邻居的平均距离。在优化过程中,邻近图会根据致密化或修剪过程进行更新。
高斯解池
受计算机图形学中广泛使用的网格分割算法的顶点加法策略的启发,作者提出了基于邻近图和每个高斯的邻近分数的高斯解池。具体来说,如果高斯的邻近分数是阈值t代理,连接“源”高斯和“目标”高斯,在每个顶点的中心生长一个新的高斯,如上图所示。新创建的高斯不透明度设置为与“目的地”高斯不透明度相匹配。另一方面,其他属性(如旋转和 SH 系数)初始化为零。高斯解池策略鼓励新密集的高斯分布在最具代表性的位置周围,并在优化过程中逐渐填补观测空白。
3. 高斯优化的几何指导
在使用高斯解池实现密集覆盖后,将具有多视图线索的光度损失应用于高斯优化。但是,如果在稀疏视图设置中没有足够的观察值,学习一致几何的能力就会下降,这会增加训练视图过度拟合和向新视图泛化不良的风险。这需要结合额外的归一化或先验来指导高斯优化。特别是,从训练有素的单目深度估计器依赖于生成的深度先验中,以引导高斯几何得到合理的解。
从单目深度注入几何相干性
作者使用具有 140 万个图像深度对的预训练密集预测转换器 (DPT) 在训练视图中创建深度图。为了缓解实际场景比例尺与估计深度之间的比例模糊性,在估计深度图和渲染深度图中引入了 Pearson 相关性。Pearson 相关测量 2D 深度图之间的分布差异。
实验
- 数据
- LLFF:使用 3 个学习视图
- Mip-NeRF360:使用 24 个学习视图
- Blender:8 个学习视图
- 实施细节
- 使用 SfM 计算初始相机姿态和点云
- 100 Gaussian densify
- 完全优化步骤:10,000
- 经过 2,000 次迭代后,对伪视图进行采样
- 显卡:NVIDIA A6000
结果
项目
环境设置(env)
git clone https://github.com/VITA-Group/FSGS
cd FSGS
conda env create --file environment.yml
conda activate FSGS
# 如果使用yaml安装出错的话,可以新建一个req.txt文件
# pip install -r req.txt
# 值得一提的是,这里的submodules如果没有任何文件,可能需要单独设置,例如:
cd submodules
git clone https://github.com/graphdeco-inria/diff-gaussian-rasterization
cd diff-gaussian-rasterization
pip install .
cd ..
git clone https://github.com/YixunLiang/simple-knn
cd simple-knn
pip install .
cd ..
req.txt文件
# python版本必须大于等于3.8,要不然会出错
# torch1.13+cu117的版本
matplotlib==3.5.3
torchmetrics==1.2.0
timm==0.9.12
opencv_python==4.8.1.78
imageio==2.31.2
open3d==0.17.0
数据集设置
mkdir dataset
cd dataset
#下载 LLFF dataset
gdown 16VnMcF1KJYxN9QId6TClMsZRahHNMW5g
unzip nerf_llff_dataset.zip
# run colmap to obtain initial point clouds with limited viewpoints
# 得到数据集colmap文件
python tools/colmap_llff.py
# 下载 MipNeRF-360数据并压缩
wget http://storage.googleapis.com/gresearch/refraw360/360_v2.zip
unzip -d mipnerf360 360_v2.zip
# run colmap on MipNeRF-360 dataset
# 得到数据集colmap文件
python tools/colmap_360.py
训练(Train)
修改指定路径
#
python train.py --source_path dataset/nerf_llff_data/room --model_path output/room --eval --n_views 3 --sample_pseudo_interval 1
#
python train.py --source_path dataset/mipnerf360/garden --model_path output/garden --eval --n_views 24 --depth_pseudo_weight 0.03
渲染(Render)
# 指定llff数据集场景,渲染
python render.py --source_path dataset/nerf_llff_data/horns/ --model_path output/horns --iteration 10000
# NeRF
python render.py --source_path dataset/nerf_llff_data/horns/ --model_path output/horns --iteration 10000 --video --fps 30
# 指定mipnerf360数据集场景,进行渲染
python render.py --source_path dataset/mipnerf360/garden/ --model_path output/garden --iteration 10000
# NeRF
python render.py --source_path dataset/mipnerf360/garden/ --model_path outputgarden --iteration 10000 --video --fps 30
验证(Evaluation)
python metrics.py --source_path dataset/nerf_llff_data/horns/ --model_path output/horns --iteration 10000
遇到的问题及解决【PS】
[PS1]环境设置时遇到的问题cuda版本问题
计算机conda中的env环境与linux本地环境设置cuda版本相同,继承关系
而docker中的cuda版本和容器内的cuda版本不会有继承关系
附录
数学基本:缩放矩阵,旋转矩阵,协方差的激活函数,
读取.ply文件,将数据转换为torch.nn.Parameter等待优化,ply文件内包含x,y,z,
基础的点云定义
输入的是经过colmap/blender处理后的数据,也就是ply文件,从中读取场景信息到变量scene_info
模型没被训练过,就调用
GaussianModel.create_from_pcd
从scene_info.point_cloud
中建立模型。
COLMAP
的输出中有一个sparse/0
文件夹,其中有三个文件:
cameras.bin和images.bin分别是相机的内外参,points3D.bin是COLMAP产生的稀疏点云,由scene.colmap_loader.read_points3D_binary函数读取,它会返回各点的xyz、rgb和意义不明的error。我推测scene_info.point_cloud.points是稀疏点云中各点的3D坐标,scene_info.point_cloud.colors是各点的颜色。
如果是初次训练, 则从COLMAP创建的点云中初始化每个点对应的3D gaussian, 否则直接从之前保存的模型文件中读取3D gaussian。
参考文献
【1】FSGS (zehaozhu.github.io)
【2】FSGS:少视图输入的实时3D-GS新方法 - 知乎 (zhihu.com)
【3】FSGS: Real-Time Few-shot View Synthesis using Gaussian Splatting - 智源社区论文 (baai.ac.cn)
【4】【计算机视觉】Gaussian Splatting源码解读补充(三)-CSDN博客
【5】[논문 리뷰] NeRF 간단 설명 & 원리 이해하기 | 새로운 방향에서 바라본 view를 생성하는 기술 (tistory.com)【6】NeRF: 2D 이미지를 3D로 바꿔준다고요? - 모두의연구소 (modulabs.co.kr)
【7】awesome-NeRF/awesome-NeRF: A curated list of awesome neural radiance fields papers (github.com)