当前位置:   article > 正文

浅谈3D隐式表示(SDF,Occupancy field,NeRF)

隐式表示

本篇文章介绍了符号距离函数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的映射关系如下:
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

这里黑色的就是表示的形状,在Unsigned Distance Funciton下,形状内部的点的距离会被定义为0,而形状外部的点的值代表了这个点到形状的最短距离。

相对于Unsigned Distance Funciton,Signed Distance Funciton增加了正和负的概念,内部和外部的点的绝对值都代表了点到形状的距离,这时内部的点不再都是0,而是用负值表示,外部的点的值用正值表示。下图就是它的直观表示:

Signed Distance Funciton

这张图红色的表示在形状外部的点,绿色代表在形状内部的点,黑色代表边界,可以看到黑色两侧的点的值的正负发生了变化,也就是说 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映射
在使用深度学习表示隐式函数的方法中,我们用神经网络拟合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成为了近几年炽手可热的明星技术。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号