本篇文章介绍了符号距离函数Signed Distance Funciton(SDF),占用场Occupancy Field,神经辐射场Neural Radiance Field(NeRF)的概念、联系与区别。
显式表示与隐式表示
三维空间的表示形式可以分为显式和隐式。
比较常用的显式表示比如体素Voxel,点云Point Cloud,三角面片Mesh等。
比较常用的隐式表示有 符号距离函数Signed Distance Funciton(SDF),占用场Occupancy Field,神经辐射场Neural Radiance Field(NeRF) 等。
本文将对几种隐式表示进行介绍,并以我本人的理解讲一讲它们的联系和区别。
概述
首先,对这三种隐式表示进行概述,帮助大家对三种表示有一个大致的认识,这里看不懂没关系,后面有更加详细的介绍。
函数function与场field
先回顾一下函数和场的概念,我认为函数和场实际上都是代表了一种映射关系。
函数 f(x)=y 是自变量 x 的集合到因变量 y 集合的映射,也就是每个x对应一个y。
场的定义是向量到向量或数的映射,空间中的场可以认为是 “空间中点”到“点的属性”的映射,也就是每个点对应这个点的属性。以磁场为例,磁场就是空间中每个点都具有一个磁感应矢量B,也就是点到向量的映射,即空间中每个点都对应到一个特定的向量 B B B。在其他情况下,点不一定对应到向量,也可以对应到标量或者其他属性,只要是空间中点到属性的映射都是空间场。( 一般用坐标 ( x , y , z ) (x,y,z) (x,y,z)表示空间中的点,所以点到属性的映射实际上是 ( x , y , z ) (x,y,z) (x,y,z)对应属性 s s s,如场 F : ( x , y , z ) → s F: (x,y,z)→s F:(x,y,z)→s,这里的 s s s可以是向量也可以是标量)
本文讲的三种隐式表示都可以看做是一种映射关系,而且我们都可以用神经网络去拟合这种映射关系,达到用神经网络去表示三维空间的目的。
Signed Distance Funciton(SDF)
Signed Distance Funciton对应的中文是“符号距离函数”,我们更常见到的是它的缩写SDF。
SDF表示一个点到一个曲面的最小距离,同时用正负来区分点在曲面内外。点在曲面内部则规定距离为负值,点在曲面外部则规定距离为正值,点在曲面上则距离为0.
SDF的映射关系如下:
这里
x
x
x是个三维向量,代表三维空间中的点,
s
s
s是一个值。也就是说
S
D
F
SDF
SDF实际上是空间中的点到对应的值的映射,也就是每个x都对应一个值s,这里s表示一个点到一个曲面的最小距离。
相应的, s < 0 s<0 s<0 则表示 x x x 在曲面内, s > 0 s>0 s>0表示 x x x 在曲面外, s = 0 s=0 s=0表示 x x x 在曲面上。我们就可以 用 S D F ( x ) = 0 SDF(x)=0 SDF(x)=0 来表示一个曲面。
Occupancy Field (占用场)
占用场表示一个点被曲面占用的概率(占用就是在曲面内部),用神经网络表示的占用场又叫做Neural Surface Field。
占用场 p p p和 s s s的对应关系如下:
这里的 p p p是空间中的点, s s s表示 p p p被曲面占用的概率。可以看到占用场的映射关系的维度和SDF是一致的,它和SDF的区别在于,SDF中 s s s没有取值范围限制,而占用场的 s s s的取值是 [ 0 , 1 ] [0,1] [0,1],即必须在0,1之间,所以占用场是将一个三维空间映射到 [ 0 , 1 ] [0,1] [0,1],即:
占用概率 s s s通常以0.5为标准,即 s s s大于0.5我们倾向于认为点被曲面占用, s s s小于0.5我们倾向于认为点没有被曲面占用, s s s等于0.5我们认为点在曲面上。所以我们可以用 s s s等于0.5,即 F ( p ) = 0.5 F (p)=0.5 F(p)=0.5 ,在连续的三维占用场中表示一个曲面。
Neural Radiance Field (神经辐射场)
Neural Radiance Field 神经辐射场是这几年很火的概念,主要是由于NeRF以及后续系列工作的优异表现。
辐射场 Radiance Field 就是将“空间中的点+点发出的一条射线”映射到“点的密度值+射线的方向对应的颜色值”,映射关系如下:
x
,
y
,
z
x,y,z
x,y,z表示点坐标,
d
d
d表示从这个点发出的一条射线的方向,
R
,
G
,
B
R,G,B
R,G,B表示从这个射线的方向去看这个点的颜色值,
σ
\sigma
σ表示这个点的密度值(比如烟雾的密度比较低,固体点的密度就很高)。
而神经辐射场,就是用神经网络去拟合辐射场的映射关系。
下面将详细介绍每个隐式表示:
Signed Distance Funciton(SDF)
SDF在2D和3D中都有应用,我们可以先看一下SDF在2D中的形式,了解其在2D上的应用会对理解其在3D中的表示有帮助。
Signed Distance Funciton表示带符号的距离函数,其实还有不带符号的距离函数,也就是Unsigned Distance Funciton,2D中的Unsigned Distance Funciton可以直观表示如下:
这里黑色的就是表示的形状,在Unsigned Distance Funciton下,形状内部的点的距离会被定义为0,而形状外部的点的值代表了这个点到形状的最短距离。
相对于Unsigned Distance Funciton,Signed Distance Funciton增加了正和负的概念,内部和外部的点的绝对值都代表了点到形状的距离,这时内部的点不再都是0,而是用负值表示,外部的点的值用正值表示。下图就是它的直观表示:
这张图红色的表示在形状外部的点,绿色代表在形状内部的点,黑色代表边界,可以看到黑色两侧的点的值的正负发生了变化,也就是说 S D F = 0 SDF=0 SDF=0表示的曲线可以代表形状的边界。
理解了二维的SDF,就可以类推到三维的SDF,可以想象一个空间,空间中有正值和负值的点,而正负点的交界处就可以认为是空间曲面。
这里展示一张《DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation》 (CVPR2019) 中直观表示SDF的图像,是那个大家熟悉的兔子:
可以看到有一部分点(蓝色)的SDF值小于0,另一部分点(红色)的SDF值大于0,而大于0和小于0的点之间的边界,也就是我们需要表示的曲面,也就是说,曲面可以用函数 S D F = 0 SDF=0 SDF=0表示。
对于一些我们熟悉的曲面,也可以用SDF的形式来表示,比如球体和“甜甜圈”:
这两个物体的隐式表示函数是相对简单的。而通常需要我们用隐式函数表示的物体的隐式函数会复杂的多,但都是一个三维空间到SDF值的映射,即每一个三维空间点
x
x
x对应一个SDF值
s
s
s,这里
s
s
s表示点到曲面的最小距离。可以写成:
在使用深度学习表示隐式函数的方法中,我们用神经网络拟合SDF函数,就可以利用神经网络表示一个三维模型。
Occupancy field (占用场)
之前讲到,场实际上就是“空间中的点”到“点的属性”的映射,而占用场就是 “空间中的点”到“点是否被曲面占用的概率”的映射, 占用场给空间中每个点都赋一个是否被曲面占用的概率,相当于表示了一个点在曲面内部的概率,即:
这里
p
p
p表示空间中的点,
s
s
s表示占用概率。
F
F
F在这里我们叫做占用概率函数,它表示了占用场中
p
p
p和
s
s
s的关系。
对于占用场所表示的映射关系,也就很容易理解了。对于三维空间中的点
p
p
p,有:
s
s
s表示
p
p
p被曲面占用的概率,它的取值范围是
[
0
,
1
]
[0,1]
[0,1],所以占用场就可以看做是三维空间到
[
0
,
1
]
[0,1]
[0,1]的映射:
这里
s
=
0
s=0
s=0表示点非常不可能被曲面占用,
s
=
1
s=1
s=1表示点极大可能被曲面占用,那么
s
=
0.5
s=0.5
s=0.5也就是很难判断这个点都否被曲面占用。我们说过被曲面占用就是在曲面内部,那么什么时候我们很难判断一个点是在曲面内部还是外部呢?你肯定已经想到了,那就是当这个点很接近曲面表面的时候,我们就很难判断它去曲面内部或者外部了。所以
F
(
p
)
=
0.5
F(p)=0.5
F(p)=0.5 代表了这个点在曲面的表面。
于是 F ( p ) = 0.5 F(p)=0.5 F(p)=0.5 也就可以表示一个连续的3D占用场中的一个曲面。与 S D F SDF SDF类似,占用概率函数 F F F 可以用神经网络拟合,这样我们就可以用神经网络表示曲面。
现在 F ( p ) = 0.5 F(p)=0.5 F(p)=0.5只能表示一个特定的曲面,而在实际的重建任务中,我们希望自己的网络根据不同的文字/图像或者其他条件信息来构建该条件对应的曲面,于是我们需要引入 “条件变量 c c c” 作为占用场的输入,即:
这样占用场所表示的映射也就变形成了:
这里的
c
c
c表示了一个条件变量,比如图像特征,
c
c
c相当于编码了一个特定曲面的形状,我们可以训练你占用场神经网络
F
F
F 还原出
c
c
c编码的形状。
占用场除了可以表示曲面,还可以表示点的颜色值。在单目三维人体重建《PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization》(ICCV 2019) 文章中,除了利用占用场表示曲面外,还利用占用场来表示点的颜色值。也就是将 F ( p , c ) = s F(p,c)=s F(p,c)=s中的占用概率 s s s,替换为颜色值 ( R , G , B ) (R,G,B) (R,G,B),即:
这样通过预测每个点的颜色值,也就得到了曲面的纹理。于是可以通过占用场即得到模型的几何信息,又得到模型的纹理信息。
我们可以将它进一步进行变换,因为在实际使用中,我们会用空间中的点 p p p 的坐标 x , y , z x,y,z x,y,z 来表示 p p p ,于是我们将 p p p替换为 x , y , z x,y,z x,y,z,同时将其写为映射关系,即:
不知道看到这里,你有没有觉得有点眼熟呢,它和下面这个映射关系是不是有些相似?
上面两个映射关系是不是还有点像?至少左右两边有很多重复的量。你这时肯定已经注意到,第二个式子实际上就是辐射场 Radiance Field 的映射关系。
Neural Radiance Field (神经辐射场)
我们之前说过,神经辐射场,其实就是用神经网络去拟合辐射场的映射关系。所以理解神经辐射场主要需要理解辐射场这个概念。(当然NeRF还涉及到体渲染的概念,我这里只提及辐射场相关的)
现在我们知道场实际上就是一种映射关系,辐射场也是如此的,它是将“空间中的点+点发出的一条射线”映射到“点的密度值+射线的方向对应的颜色值”。
我们可以从辐射场的用途理解它建立这种映射关系的意义。我们需要表示一个三维空间,使得从任何角度去观察,我们都可以得到该视角的观察结果(对于每个视角来说,观察结果其实就是一副RGB图像)。
于是对于一个点来说,这个点只需要保证,在每个角度,都能呈现出一定的颜色,就可以让任何观察视角对这个点都有观察结果了。
也就是说,从这个点发出的每一个角度的射线,都应该能呈现出一种特定的颜色(你可以想象一个长满五颜六色的刺的海胆)。
现在将这个特定的点推广到空间中的每一个点,于是空间中每一个点的每一个角度,都需要一个对应的颜色值,也就是:
这里
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)用三维空间中的位置表示点,
d
d
d表示射线的角度,
(
R
,
G
,
B
)
(R,G,B)
(R,G,B)表示颜色值。
在实际中,不同的点的颜色透明度会不同,比如烟雾或者彩色的玻璃,虽然它们有颜色,但是我们也可以透过它们看到之后的物体,于是我们还需要给点增加一个新的属性,透明度 σ \sigma σ,最后得到完整的辐射场的映射关系:
也就是空间中每一个点的每一个角度,都对应的一个颜色值和一个透明度,这其实也就是辐射场的表示内容。而神经辐射场,就是用神经网络去拟合辐射场的映射关系。
总结
我们可以看出来,三种3D隐式表示虽然表示的内容不同,但具有其相似性与关联。比如SDF和占用场都是三维映射到一维,甚至SDF值可以直接线性映射到占用概率。再比如文章中特地比较的“用来表示颜色值的占用场”和“辐射场”二者的映射关系,可以直观的看出辐射场相对于占用场多了一个视角射线 d d d作为输入,也就是由于增加了一个视角射线 d d d,使得辐射场在渲染层面获得了独特的优势。而在渲染方面的广泛应用,使得NeRF成为了近几年炽手可热的明星技术。