三维空间的表示方法

http://t.csdnimg.cn/PauoT

显示表示

体素Voxel,点云Point Cloud,三角面片Mesh等。

隐式表达

符号距离函数Signed Distance Funciton(SDF),占用场Occupancy Field,神经辐射场Neural Radiance Field(NeRF),TSDF截断符号距离。TSDF截断符号距离 | CJH’s blog (cjh0220.github.io)

函数function与场field

先回顾一下函数和场的概念,我认为函数和场实际上都是代表了一种映射关系。

函数 f(x)=y 是自变量 x 的集合到因变量 y 集合的映射,也就是每个x对应一个y

场的定义是向量到向量或数的映射,空间中的场可以认为是 “空间中点”到“点的属性”的映射,也就是每个点对应这个点的属性。以磁场为例,磁场就是空间中每个点都具有一个磁感应矢量B,也就是点到向量的映射,即空间中每个点都对应到一个特定的向量B。在其他情况下,点不一定对应到向量,也可以对应到标量或者其他属性,只要是空间中点到属性的映射都是空间场。( 一般用坐标 (x,y,z)表示空间中的点,所以点到属性的映射实际上是(x,y,z)对应属性s,如场F: (x,y,z)→s,这里的s可以是向量也可以是标量)
本文讲的三种隐式表示都可以看做是一种映射关系,而且我们都可以用神经网络去拟合这种映射关系,达到用神经网络去表示三维空间的目的。

Signed Distance Funciton(SDF)

Signed Distance Funciton对应的中文是“符号距离函数”,我们更常见到的是它的缩写SDF。

SDF表示一个点到一个曲面的最小距离,同时用正负来区分点在曲面内外。点在曲面内部则规定距离为负值,点在曲面外部则规定距离为正值,点在曲面上则距离为0.

SDF的映射关系如下:

$ SDF(x) = s:x \in R^3,s \in R .$

这里x是个三维向量,代表三维空间中的点,s是一个值。也就是说SDF实际上是空间中的点到对应的值的映射,也就是每个x都对应一个值s,这里s表示一个点到一个曲面的最小距离。

相应的, s < 0 则表示 x在曲面内,s > 0 表示 x 在曲面外,s = 0 表示 x xx 在曲面上。我们就可以 用 SDF ( x ) = 0 来表示一个曲面。

Occupancy Field (占用场)

占用场表示一个点被曲面占用的概率(占用就是在曲面内部),用神经网络表示的占用场又叫做Neural Surface Field。

占用场p和s的对应关系如下:
F(p)=s:pR3,sRF(p) = s:p \in R^3,s \in R

这里的p 是空间中的点,s 表示p 被曲面占用的概率。可以看到占用场的映射关系的维度和SDF是一致的,它和SDF的区别在于,SDF中s 没有取值范围限制,而占用场的s 的取值是[0,1] ,即必须在0,1之间,所以占用场是将一个三维空间映射到[0,1],即:
FR3[0,1]F:R^3 \mapsto [0,1]

占用概率s 通常以0.5为标准,即s 大于0.5我们倾向于认为点被曲面占用,s 小于0.5我们倾向于认为点没有被曲面占用,s 等于0.5我们认为点在曲面上。所以我们可以用 s 等于0.5,即 F ( p ) = 0.5 ,在连续的三维占用场中表示一个曲面

Neural Radiance Field (神经辐射场)

Neural Radiance Field 神经辐射场是这几年很火的概念,主要是由于NeRF以及后续系列工作的优异表现。

辐射场 Radiance Field 就是将“空间中的点+点发出的一条射线”映射到“点的密度值+射线的方向对应的颜色值”,映射关系如下:

F:(x,y,z,d)(R,G,B,σ)F:(x,y,z,d) \to (R,G,B,\sigma)

x,y,z表示点坐标,d 表示从这个点发出的一条射线的方向,R , G , B 表示从这个射线的方向去看这个点的颜色值,σ 表示这个点的密度值(比如烟雾的密度比较低,固体点的密度就很高)。
而神经辐射场,就是用神经网络去拟合辐射场的映射关系

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,就可以类推到三维的SDF,可以想象一个空间,空间中有正值和负值的点,而正负点的交界处就可以认为是空间曲面

这里展示一张《DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation》 (CVPR2019) 中直观表示SDF的图像,是那个大家熟悉的兔子:

可以看到有一部分点(蓝色)的SDF值小于0,另一部分点(红色)的SDF值大于0,而大于0和小于0的点之间的边界,也就是我们需要表示的曲面,也就是说,曲面可以用函数S D F = 0 S表示。

对于一些我们熟悉的曲面,也可以用SDF的形式来表示,比如球体和“甜甜圈”:

这两个物体的隐式表示函数是相对简单的。而通常需要我们隐式表示的物体的隐式函数会复杂的多,但都是一个三维空间到SDF值的映射,即每一个三维空间点x 对应一个SDF值s ,这里 s 表示点到曲面的最小距离。可以写成:
SDF(x)=s:xR3,sR.SDF(x) = s:x \in R^3,s \in R.

在使用深度学习表示隐式函数的方法中,我们用神经网络拟合SDF函数,就可以利用神经网络表示一个三维模型。

Occupancy field (占用场)

之前讲到,场实际上就是“空间中的点”到“点的属性”的映射,而占用场就是 “空间中的点”到“点是否被曲面占用的概率”的映射, 占用场给空间中每个点都赋一个是否被曲面占用的概率,相当于表示了一个点在曲面内部的概率,即:

F(p)=sF(p) = s

这里p 表示空间中的点,s 表示占用概率。F 在这里我们叫做占用概率函数,它表示了占用场中p 和s 的关系。

对于占用场所表示的映射关系,也就很容易理解了。对于三维空间中的点p ,有:
pR3p \in R^3

s表示p 被曲面占用的概率,它的取值范围是[ 0 , 1 ] ,所以占用场就可以看做是三维空间到[ 0 , 1 ]的映射:
$ F : R^3 \mapsto [0,1]$

这里s = 0 表示点非常不可能被曲面占用,s = 1 表示点极大可能被曲面占用,那么s = 0.5 也就是很难判断这个点是否被曲面占用。我们说过被曲面占用就是在曲面内部,那么什么时候我们很难判断一个点是在曲面内部还是外部呢?你肯定已经想到了,那就是当这个点很接近曲面表面的时候,我们就很难判断它在曲面内部或者外部了。所以 F ( p ) = 0.5 代表了这个点在曲面的表面。
于是 F ( p ) = 0.5 也就可以表示连续的3D占用场中的一个曲面。与SDF 类似,占用概率函数 F 可以用神经网络拟合,这样我们就可以用神经网络表示曲面。

现在F ( p ) = 0.5 只能表示某个特定的曲面,而在实际的重建任务中,我们希望自己的网络根据不同的文字/图像或者其他条件信息来构建该条件对应的曲面,于是我们需要引入 “条件变量c ” 作为占用场的输入,即:
cXc \in X

这样占用场所表示的映射也就变形成了:

F(p,c):R3×X[0,1]F(p,c):R^3 \times X \mapsto [0,1]

这里的c 表示了一个条件变量,比如图像特征,c 相当于编码了一个特定曲面的形状,我们可以训练占用场神经网络 F 还原出c 编码的形状
占用场除了可以表示曲面,还可以表示点的颜色值。在单目三维人体重建《PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization》(ICCV 2019) 文章中,除了利用占用场表示曲面外,还利用占用场来表示点的颜色值。也就是将 F ( p , c ) = s 中的占用概率s ,替换为颜色值( R , G , B ) ,即:
$ F(p,c) = (R,G,B)$

这样通过预测每个点的颜色值,也就得到了曲面的纹理。于是可以通过占用场即得到模型的几何信息,又得到模型的纹理信息。

我们可以将它进一步进行变换,因为在实际使用中,我们会用空间中的点 p 的坐标 x , y , z 来表示 p ,于是我们将p pp替换为x , y , z ,同时将其写为映射关系,即:
F:(x,y,z,c)(R,G,B)F:(x,y,z,c) \to (R,G,B)

不知道看到这里,你有没有觉得有点眼熟呢,它和下面这个映射关系是不是有些相似?

F:(x,y,z,c)(R,G,B,σ)F:(x,y,z,c) \to (R,G,B,\sigma)

上面两个映射关系是不是还有点像?至少左右两边有很多相同的量。你这时肯定已经注意到,第二个式子实际上就是辐射场 Radiance Field 的映射关系

Neural Radiance Field (神经辐射场)

我们之前说过,神经辐射场,其实就是用神经网络去拟合辐射场的映射关系。所以理解神经辐射场主要需要理解辐射场这个概念。(当然NeRF还涉及到体渲染的概念,我这里只提及辐射场相关的)

现在我们知道场实际上就是一种映射关系,辐射场也是如此的,它是将“空间中的点+点发出的一条射线”映射到“点的密度值+射线的方向对应的颜色值”

我们可以从辐射场的用途理解它建立这种映射关系的意义。我们需要表示一个三维空间,使得从任何角度去观察,我们都可以得到该视角的观察结果(对于每个视角来说,观察结果其实就是一幅RGB图像)。

于是对于一个点来说,这个点只需要保证,在每个角度,都能呈现出一定的颜色,就可以让任何观察视角对这个点都有观察结果了。

也就是说,从这个点发出的每一个角度的射线,都应该能呈现出一种特定的颜色(你可以想象一个长满五颜六色的刺的海胆)。

现在将这个特定的点推广到空间中的每一个点,于是空间中每一个点的每一个角度,都需要一个对应的颜色值,也就是:

F:(x,y,z,d)(R,G,B)F:(x,y,z,d) \to (R,G,B)

这里( x , y , z ) 用三维空间中的位置表示点,d 表示射线的角度,( R , G , B ) 表示颜色值。
在实际中,不同的点的颜色透明度会不同,比如烟雾或者彩色的玻璃,虽然它们有颜色,但是我们也可以透过它们看到之后的物体,于是我们还需要给点增加一个新的属性,透明度σ ,最后得到完整的辐射场的映射关系:
F:(x,y,z,c)(R,G,B,σ)F:(x,y,z,c) \to (R,G,B,\sigma)

就是空间中每一个点的每一个角度,都对应的一个颜色值和一个透明度,这其实也就是辐射场的表示内容。而神经辐射场,就是用神经网络去拟合辐射场的映射关系

总结

我们可以看出来,三种3D隐式表示虽然表示的内容不同,但具有其相似性与关联。比如SDF和占用场都是三维映射到一维,甚至SDF值可以直接线性映射到占用概率。再比如文章中特地比较的“用来表示颜色值的占用场”和“辐射场”二者的映射关系,可以直观的看出辐射场相对于占用场多了一个视角射线d dd作为输入,也就是由于增加了一个视角射线d dd,使得辐射场在渲染层面获得了独特的优势。而在渲染方面的广泛应用,使得NeRF成为了近几年炽手可热的明星技术。