本文旨在补充@gwpscut创作的博文学习笔记之——3D Gaussian Splatting源码解读。
Gaussian Splatting Github地址:https://github.com/graphdeco-inria/gaussian-splatting
论文地址:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf
目录
- 一、预备知识:球谐(Spherical Harmonics)
- 二、高斯场景类:`GaussianModel`
-
- 1. `def setup_functions(self)`
- 2. `def __init__(self, sh_degree : int)`
- 3. `def create_from_pcd(self, pcd : BasicPointCloud, spatial_lr_scale : float)`
- 4. `ply`文件相关:`def construct_list_of_attributes(self)`、`def save_ply(self, path)`和`def load_ply(self, path)`
- 5. 优化器和学习率相关
- 6. 重置不透明度:`def reset_opacity(self)`
- 7. Gaussian的删除和新增
一、预备知识:球谐(Spherical Harmonics)
这部分可以参考PlenOctrees论文的附录B。
有时候从不同的角度看同一个物体看到的景象是不一样的(比如激光笔,它只朝一个固定的方向发光),所以需要定义从一个三维单位球体上各点观察一个物体所得的颜色函数。记这样的一个函数为 L ( θ , φ ) L(\theta,\varphi) L(θ,φ),其中 θ ∈ [ 0 , π ] \theta\in[0,\pi] θ∈[0,π]是纬度, φ ∈ [ 0 , 2 π ) \varphi\in[0,2\pi) φ∈[0,2π)是经度。任何从 [ 0 , π ] × [ 0 , 2 π ) [0,\pi]\times [0,2\pi) [0,π]×[0,2π)映射到 C \mathbb{C} C的函数都可以经过傅里叶变换表达为一系列函数 Y l m Y^m_l Ylm的线性组合,其中 l ∈ N l\in\mathbb{N} l∈N称为度数(degree), m ∈ { − l , − l + 1 , ⋯ , 0 , ⋯ , l − 1 , l } m\in\{-l,-l+1,\cdots,0,\cdots,l-1,l\} m∈{ −l,−l+1,⋯,0,⋯,l−1,l}称为阶数(order)。 Y l m Y^m_l Ylm定义为 Y l m ( θ , φ ) = 2 l + 1 4 π ( l − m ) ! ( l + m ) ! P l m ( cos θ ) e i m φ Y^m_l(\theta,\varphi)=\sqrt{\frac{2l+1}{4\pi}\frac{(l-m)!}{(l+m)!}} P_l^m(\cos\theta)e^{im\varphi} Ylm(θ,φ)=4π2l+1(l+m)!(l−m)!Plm(cosθ)eimφ其中 P l m ( cos θ ) e i m φ P_l^m(\cos\theta)e^{im\varphi} Plm(cosθ)eimφ是勒让德多项式。当然这里的 Y l m Y^m_l Ylm是复数,我们可以定义对应的实数版本 Y l m ( θ , φ ) = { 2 ( − 1 ) m Im [ Y l ∣ m ∣ ] , m < 0 Y l 0 , m = 0 2 ( − 1 ) m Re [ Y l m ] , m > 0 Y^m_l(\theta,\varphi)=\begin{cases}\sqrt{2}(-1)^m\operatorname{Im}[Y_l^{|m|}],&m<0\\ Y_l^0,&m=0\\ \sqrt{2}(-1)^m\operatorname{Re}[Y_l^{m}],&m>0 \end{cases} Ylm(θ,φ)=⎩ ⎨ ⎧2(−1)mIm[Yl∣m∣],Yl0,2(−1)mRe[Ylm],m<0m=0m>0任何实的求函数 L : [ 0 , π ] × [ 0 , 2 π ) → R L:[0,\pi]\times [0,2\pi)\to\mathbb{R} L:[0,π]×[0,2π)→R都可以用球谐基来表达: L ( θ , φ ) = ∑ l = 0 ∞ ∑ m = − l l k l m Y l m ( θ , φ ) L(\theta,\varphi)=\sum\limits_{l=0}^\infty\sum\limits_{m=-l}^l k_l^m Y_l^m(\theta,\varphi) L(θ,φ)=l=0∑∞m=−l∑lklmYlm(θ,φ)其中 k l m k_l^m klm是对应的傅里叶系数。特别地,直流分量 Y 0 0 = 1 2 π Y_0^0=\frac{1}{2\sqrt\pi}

本文是3D Gaussian Splatting源码解读的补充笔记。先介绍球谐预备知识,包括颜色函数及傅里叶变换表达。接着分析高斯场景类,涉及类定义、函数激活设置、初始化方法,还探讨文件相关内容,如模型保存文件及数据,后续还将有第二部分解读。
最低0.47元/天 解锁文章
1万+





