最开始虽然设想一个高斯椭球可以影响多个像素,以至于高斯椭球数量可能比点云数量少一些,但实际上并没有少,因为他初始的时候就是用colmap生成的点云,所以说他并没有粒子上的减少,为什么就快了呢?实际上是因为GPU。
1. 3dgs为什么快
- cpu相当于一个老教授,GPU相当于一群小学生。
- GPU:
- 整个splatting部分是用cuda编写的,一个线程负责一个像素,每个像素去找它对应的3d高斯椭球去渲染颜色即可。
- 分区
- 把整张图拆成16*16块,然后在找自己对应的区域的时候,把高斯也分块了,算第一块的时候,只需要找跟这个快对应的几个高斯就行了,算第二块的时候只需要找跟第二块对应的几个高斯就行了;同时两个块之间也是并行的
- GPU的每个block负责一个区
- block之间可以共享内存
- 核心代码中其实只写了对一个像素的处理。
1 | import numpy as np |
2. 机器学习与参数评估
- 假设初始点云有10000个点,每个点膨胀乘3d高斯椭球,每个椭球的参数包括:
- 中心点位置:(x,y,z)
- 协方差矩阵:R,S (旋转和缩放矩阵)
- 球谐函数系数:16*3
- 透明度:$ \alpha $
然后进行变换过程(splatting过程)形成一张图片,然后跟GT算loss。
关于初始化的3d高斯:
- ~/gaussian-splatting/submodules
- diff-gaussian-rateriztion : 渲染部分
- simple-knn :
- ~/gaussian-splatting/submodules
为什么有一个simple-knn呢?
- 最开始的高斯椭球总要有一个形态,这个形态我们就使用一个各向同性的球,他的半径(缩放)如果初始化太小了,可能画面不能完全铺满,会有很多空白的地方;如果太大就会有大量的重叠部分,因此这里使用knn来算半径。
- 对于每个高斯点,寻找与他近邻的三个邻居,半径就是和三个邻居的距离的平均。