【AI数学】NeRF中的球面谐波函数(Spherical Harmonics)

木盏 2024-08-26 10:31:01 阅读 80

球面谐波(SH)因为其良好的性质活跃在NeRF、Plenoxels、3DGS等显隐式场景表示的方法中。

问:球面谐波是什么?

答:一组函数。可以理解为傅里叶分解的一种特殊形式,即“任何函数都可以用这组基的算术组合来近似”。

先描述一种通用情况:

假设我们有一组基数为3的完备基函数:

[

e

1

(

x

)

,

e

2

(

x

)

,

e

3

(

x

)

]

[e_1(x), e_2(x),e_3(x)]

[e1​(x),e2​(x),e3​(x)]

我们存在一个目标函数

f

(

x

)

f(x)

f(x),那么

f

(

x

)

f(x)

f(x)可以用这组基函数来表达:

f

(

x

)

=

a

1

e

1

(

x

)

+

a

2

e

2

(

x

)

+

a

3

e

3

(

x

)

(1)

f(x)=a_1e_1(x)+a_2e_2(x)+a_3e_3(x)\tag{1}

f(x)=a1​e1​(x)+a2​e2​(x)+a3​e3​(x)(1)这里的

[

a

1

,

a

2

,

a

3

]

[a_1,a_2,a_3]

[a1​,a2​,a3​]就是这组基的系数了。当然,我们可以用更“细致”的正交基来拟合目标函数,一般对应着更多的基数。我们可以浅看一张图:

在这里插入图片描述

这里的n表示基数,用的是球面谐波基。由此可见,基数越多,拟合效果越佳

如果对数学不那么苛求的人,只需要了解SH在NeRF中的使用,本文大概能满足这一需求。


球面谐波

球面谐波基,顾名思义,跟球面有关。

首先,我们来回顾一下极坐标的概念:用半径和角度的组合

(

r

,

θ

)

(r,\theta)

(r,θ)来代替笛卡尔坐标系下的

(

x

,

y

)

(x,y)

(x,y)。

r

(

θ

)

=

1

r(\theta) = 1

r(θ)=1表示半径为1的圆。

极坐标

跟传统的笛卡尔坐标相比,极坐标天然适合处理圆的场景那么三维极坐标就天然适合处理球面场景。

那么极坐标和球面谐波有什么关系呢?答:SH就是在极坐标下的基函数

我们先看一下,三维极坐标是什么样子:

r

=

f

(

θ

,

ϕ

)

(2)

r = f(\theta, \phi)\tag{2}

r=f(θ,ϕ)(2)

球面坐标

r(即图中的

ρ

\rho

ρ)表示半径,

θ

\theta

θ和

ϕ

\phi

ϕ表示观测角度。

我们通过

r

=

f

(

θ

,

ϕ

)

r = f(\theta, \phi)

r=f(θ,ϕ)来可视化SH基:

在这里插入图片描述

图3 球谐基可视化1

看起来像细胞或者某种外星生物,这也是让人觉得很不直观的地方。但换一种表达,可能大家就容易理解了(将距离用颜色来表达):

在这里插入图片描述

图4 球谐基可视化2

往往在三维重建里用的多的就是图4这一种。应用场景为:对空间中一个点的颜色表达与观测它的角度有关。那么,构建出函数

c

=

f

(

θ

,

ϕ

)

(3)

\bold{c}=f(\theta, \phi)\tag{3}

c=f(θ,ϕ)(3)

这里不存在半径的变化,所以SH基函数也是保持球体的几何结构,不像图3中那么多异形。那么任意一个球形表面的颜色表达,可以用球谐基来分解

在这里插入图片描述

我们看一下球谐基的数学表示

SH

Y

l

m

Y_l^m

Ylm​表示

l

l

l阶的第

m

m

m个球谐基,在NeRF中

l

l

l的最大值通常取2或者3,而对应阶的

m

m

m取值范围为

[

l

,

l

]

[-l,l]

[−l,l]。上面的公式群就表示2阶球谐基的一共9个球谐基,只需拟合9个系数就可以完成函数的分解。对于最近火热的3DGS,默认采用3阶球谐基,有16个球谐基。通常,RGB这3个通道都会用一组球谐基,所以通常球谐系数还要

×

3

\times{3}

×3。

在工程实现中,会把上面的常数部分都计算出来先保存,我们观察代码可以发现。


球面谐波与NeRF

首次将SH引入NeRF的工作是PlenOctrees。论文中较详细地描述了SH的使用。

NeRF原本的数学表达为:

f

Θ

(

x

,

y

,

z

;

θ

,

ϕ

)

=

(

c

,

σ

)

(4)

f_\Theta(x,y,z;\theta,\phi)=(\bold{c},\sigma)\tag{4}

fΘ​(x,y,z;θ,ϕ)=(c,σ)(4)

这里的

f

Θ

f_\Theta

fΘ​表示MLP。而经过SH编码以后的表达式变为:

f

Θ

(

x

,

y

,

z

)

=

(

k

,

σ

)

(5)

f_\Theta(x,y,z)=(\bold{k},\sigma)\tag{5}

fΘ​(x,y,z)=(k,σ)(5)

这里的

k

\bold{k}

k表示球谐系数。颜色可以由球鞋系数进一步得到:

c

=

f

(

d

;

k

)

(6)

\bold{c}=f(\bold{d};\bold{k})\tag{6}

c=f(d;k)(6)

请添加图片描述

这里的k代表球谐系数,l和m分别代表球谐基的阶数和对应的基数:

l和m示意图


总结

在NeRF或者3DGS等三维重建技术的背后,需要对空间点(或者高斯球)的空间位置

(

x

,

y

,

z

)

(x,y,z)

(x,y,z)和观测方向

(

ϕ

,

θ

)

(\phi,\theta)

(ϕ,θ)进行合理表示。我们发现,空间位置

(

x

,

y

,

z

)

(x,y,z)

(x,y,z)是笛卡尔坐标系下,而观测方向

(

ϕ

,

θ

)

(\phi, \theta)

(ϕ,θ)是球形坐标系下,不同坐标系可以选择不同的编码方式。

对空间坐标系的编码方式常见的有多分辨率哈希编码、频率编码;

对球形坐标系的编码方式最常见的就是球谐函数编码了~(频率编码不实用的原因是编码不紧凑);

球面谐波函数是最紧凑的球面坐标编码方式(至少是之一),任何关于

(

ϕ

,

θ

)

(\phi,\theta)

(ϕ,θ)的函数都可以由球谐基的组合来表示(即公式(1)的形式)。

参考:https://www.ti.uni-bielefeld.de/html/people/ddiffert/libShc/manual/fouriertransform.html



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。