【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)=a1e1(x)+a2e2(x)+a3e3(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中那么多异形。那么任意一个球形表面的颜色表达,可以用球谐基来分解:
我们看一下球谐基的数学表示:
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分别代表球谐基的阶数和对应的基数:
总结
在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
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。