3DGS系列(一)
3DGS系列(二)
3DGS系列(三)
3D高斯球的颜色
基函数:
- 任何一个周期性函数可以分解为正弦和余弦的线性组合
球谐函数:
- 任何一个球面坐标的函数可以用多个球谐函数来近似
极坐标, ( θ , ϕ ) (\theta, \phi) (θ,ϕ)
f ( t ) ≈ ∑ l ∑ m = − l l c l m y l m ( θ , ϕ ) f(t)\approx \sum_l\sum_{m=-l}^{l}\ c_l^my_l^m(\theta,\phi) f(t)≈∑l∑m=−ll clmylm(θ,ϕ)
c是系数,y是基函数
l 是阶数,0、1、2、3阶。
- 对方向的函数
为什么球谐函数能够更好地表达颜色?
原因:
- 直觉上:数量多、维度高、存储信息更多
- CG: 环境贴图
- 常用的有球形环境贴图
在渲染中:
- 常用的有球形环境贴图
- 用球谐函数来重建亮度
- 1阶到6阶
- 当球谐函数的阶数越高,还原的效果越好
相关代码:
3DGS为什么效率高?
足迹合成:
直观上:
- 进行α-blending
sheets = []
for g in gaussians:sheets.append(g.footprint)
alpha_blending(sheets)
实际上:
G.footprint 依然对每个像素进行着色
footprint = np.zeros((H,W,3))
for i in range(H):for j in range(W):footprint[i,j]=...
像素的颜色
仍沿用NeRF中的计算公式:
C = T i α i c i = ∑ i = 1 N T i ( 1 − e − σ i δ i ) c i , w h e r e T i = e − ∑ j = 1 i − 1 σ j δ j C=T_i\alpha_ic_i=\sum_{i=1}^{N}T_i(1-e^{-\sigma_i\delta_i})c_i, where \ T_i=e^{-\sum_{j=1}^{i-1}\sigma_j\delta_j} C=Tiαici=∑i=1NTi(1−e−σiδi)ci,where Ti=e−∑j=1i−1σjδj
对光线上粒子颜色进行求和:
- T(s) :在s点之前光线没有被阻碍的概览
- σ ( s ) \sigma(s) σ(s)“”:在s点处,光线碰击粒子(光线被粒子阻碍)的概率密度
- C ( s ) C(s) C(s):在s点出粒子发出的颜色
特别地:
- splatting 没有找粒子的过程
- 需要对高斯球按照深度z排序
GPU:
- CUDA编程splatting部分
- 一个线程负责一个像素
分区:
- 将整张图分成16x16块
- 对每个高斯划分区块
- 这样GPU的每个block负责一个区
- block内可以共享内存
如何进行参数估计?
机器学习部分
参数:
- 假设初始点云有10000个点
- 每个点膨胀成3D高斯椭球
- 每个椭球的参数包括:
- 中心点位置 : (x, y, z)
- 协方差矩阵:R, S
- 球谐函数系数:16*3
- 透明度:α
关于初始化的3D高斯
椭球的初始形状:
- 是一个球
- 使用knn法,找到3近邻
- 半径是与3近邻的距离的平均
算法:
- 渲染 + SGD
- L = ( 1 − λ ) L 1 + λ L D − S S I M , λ = 0.2 L = (1- \lambda ) L_1+\lambda L_{D-SSIM},\lambda=0.2 L=(1−λ)L1+λLD−SSIM,λ=0.2
问题:
强依赖于SFM生成的初始点云
方案:
- 打补丁(Adaptive Control of Gaussians)
- 太大的拆分
- 太小的合并
- 存在感太低的剔除
Reference:B站UP主 SY_007 视频讲解内容
A u t h o r : C h i e r Author: Chier Author:Chier