本文主要是介绍【Gaussian splatting系列学习】(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
3DGS系列(一)
Splatting 基本理解
定义:
- 一种体渲染的方法:从3D物体渲染到2D平面
- Ray-casting 是被动的(NeRF):计算出每个像素点受到发光粒子的影响来生成图像
- Splatting是主动的:计算出每个发光粒子如何影响像素点
3dgs 基于2001年的 EWA Volume Splatting
splatting的核心
- 选择雪球(捏雪球)
- 抛掷雪球:从3D投影到2D,得到足迹(footprint)
- 加以合成,形成最后的图像
STEP 1: 捏雪球
为什么使用核(雪球)?
- 点是没有体积的
- 需要给点一个核
- 高斯、圆、正方形……
为什么选择3D高斯椭球?
很好的数学性质:
- 仿射变换后高斯核仍然闭合
- 3D降维到2D后(沿着某个轴积分)仍然为高斯
定义:
- 椭球高斯 G ( x ) = 1 ( 2 π ) k ∣ Σ ∣ e − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) G(x)=\frac{1}{\sqrt{(2\pi)^k|\Sigma|}}e^{-\frac{1}{2}(x-\mu)^ T\Sigma^{-1}(x-\mu)} G(x)=(2π)k∣Σ∣1e−21(x−μ)TΣ−1(x−μ)
- Σ \Sigma Σ 表示协方差矩阵,半正定, ∣ Σ ∣ |\Sigma| ∣Σ∣是其行列式
3D gaussian 为什么是椭球?明明是一个分布啊!
椭球的定义:
x 2 a 2 + y 2 b 2 + z 2 c 2 = 1 \frac{x^2}{a^2}+\frac{y^2}{b^2}+\frac{z^2}{c^2}=1 a2x2+b2y2+c2z2=1
- A x 2 + B y 2 + C z 2 + 2 D x y + 2 E x z + 2 F y z = 1 Ax^2+By^2+Cz^2+2Dxy+2Exz+2Fyz=1 Ax2+By2+Cz2+2Dxy+2Exz+2Fyz=1
高斯分布:
- 一维:均值&方差
- 高维:均值&协方差矩阵
协方差矩阵:
- 是一个对称矩阵,决定了高斯分布形状
- 对角线上元素为x轴、y轴、z轴的方差
- 反斜对角线上的值为协方差:表示x和y,x和z,y和z之间的线性相关程度
当 − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) {-\frac{1}{2}(x-\mu)^ T\Sigma^{-1}(x-\mu)} −21(x−μ)TΣ−1(x−μ)是一个常数的时候, G ( x ; μ , Σ ) G(x;\mu,\Sigma) G(x;μ,Σ) 是一个常数。
一维: ( x − μ ) 2 σ 2 \frac{(x-\mu)^2}{\sigma^2} σ2(x−μ)2 = constant
二维: ( x − μ 1 ) 2 σ 1 2 + ( x − μ 2 ) 2 σ 2 2 − 2 σ x y ( x − μ 1 ) ( y − μ 2 ) σ 1 σ 2 \frac{(x-\mu_1)^2}{\sigma_1^2}+\frac{(x-\mu_2)^2}{\sigma_2^2}-\frac{2\sigma_{xy}(x-\mu_1)(y-\mu_2)}{\sigma_1\sigma_2} σ12(x−μ1)2+σ22(x−μ2)2−σ1σ22σxy(x−μ1)(y−μ2) = constant (椭圆)
三维: ( x − μ 1 ) 2 σ 1 2 + ( x − μ 2 ) 2 σ 2 2 + ( x − μ 3 ) 2 σ 3 2 − 2 σ x y ( x − μ 1 ) ( y − μ 2 ) σ 1 σ 2 − 2 σ x z ( x − μ 1 ) ( z − μ 3 ) σ 1 σ 3 − 2 σ y z ( x − μ 2 ) ( y − μ 3 ) σ 2 σ 3 \frac{(x-\mu_1)^2}{\sigma_1^2}+\frac{(x-\mu_2)^2}{\sigma_2^2}+\frac{(x-\mu_3)^2}{\sigma_3^2}-\frac{2\sigma_{xy}(x-\mu_1)(y-\mu_2)}{\sigma_1\sigma_2}-\frac{2\sigma_{xz}(x-\mu_1)(z-\mu_3)}{\sigma_1\sigma_3}-\frac{2\sigma_{yz}(x-\mu_2)(y-\mu_3)}{\sigma_2\sigma_3} σ12(x−μ1)2+σ22(x−μ2)2+σ32(x−μ3)2−σ1σ22σxy(x−μ1)(y−μ2)−σ1σ32σxz(x−μ1)(z−μ3)−σ2σ32σyz(x−μ2)(y−μ3) = constant
对各项进行提取,其实就是: A x 2 + B y 2 + C z 2 + 2 D x y + 2 E x z + 2 F y z = 1 Ax^2+By^2+Cz^2+2Dxy+2Exz+2Fyz=1 Ax2+By2+Cz2+2Dxy+2Exz+2Fyz=1,是一个椭球面。
说明:G的范围是[0,1],G是常数的时候是一个面,而高斯的G是从0-1的连续值,实际上是大椭球壳 套 小椭球壳。实心的椭球。
各向同性&各向异性
各项同性(Isotropic):
- 在所有方向具有相同的扩散程度(梯度)
- 球
- 3D高斯分布:协方差矩阵是对角矩阵, σ x = σ y = σ z , σ x y = σ x z = σ y z = 0 \sigma_x=\sigma_y=\sigma_z, \sigma_{xy}=\sigma_{xz}=\sigma_{yz}=0 σx=σy=σz,σxy=σxz=σyz=0
各向异性(Anisotropic):
- 在不同方向具有不同的扩散程度(梯度)
- 椭球
- 3D高斯分布:协方差矩阵是对角矩阵
协方差矩阵是如何控制椭球形状的?
高斯分布:
- x ∼ N ( μ , Σ ) \mathbf{x}\sim N(\mu, \Sigma) x∼N(μ,Σ)
- 均值 [ μ 1 , μ 2 , μ 3 ] [ \mu_1,\mu_2,\mu_3] [μ1,μ2,μ3]
- 协方差矩阵
高斯分布的仿射变换:
- w = A x + b \mathbf{w}=A\mathbf{x}+b w=Ax+b
- w ∼ N ( A μ + b , A Σ A T ) \mathbf{w}\sim N(A\mu+b,A\Sigma A^T) w∼N(Aμ+b,AΣAT)
标准的高斯分布:
- x ∼ N ( 0 , I ) \mathbf{x}\sim N(\mathbf{0},I) x∼N(0,I)
- 均值 [0, 0, 0]
- 协方差矩阵对角线为1,其余为0
任意高斯可以看做是标准高斯通过仿射变换得到。
协方差矩阵为什么能用旋转和缩放矩阵表达?
高斯分布的仿射变换:
-
w = A x + b \mathbf{w}=A\mathbf{x}+b w=Ax+b
-
w ∼ N ( A μ + b , A Σ A T ) \mathbf{w}\sim N(A\mu+b,A\Sigma A^T) w∼N(Aμ+b,AΣAT)
-
A = R S A=RS A=RS(仿射变换就是由旋转、缩放、平移来完成的)
因为任意高斯的协方差矩阵可以看做是标准高斯的协方差矩阵的仿射变换,所以可以写成:
Σ = A ⋅ I ⋅ A T = R ⋅ S ⋅ I ⋅ ( R ⋅ S ) T = R ⋅ S ⋅ S T ⋅ R T \Sigma=A\cdot I\cdot A^T=R\cdot S\cdot I \cdot(R\cdot S)^T=R\cdot S\cdot S^T \cdot R^T Σ=A⋅I⋅AT=R⋅S⋅I⋅(R⋅S)T=R⋅S⋅ST⋅RT
所以协方差矩阵可以用旋转和缩放矩阵来表示。
如果已经知道协方差矩阵,如何得到R和S:可以通过特征值分解求解。
Reference:B站UP主 SY_007 视频讲解内容
这篇关于【Gaussian splatting系列学习】(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!