本篇文章介绍了符号距离函数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成为了近几年炽手可热的明星技术。

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: