NeRF:神经辐射场论文原理讲解

一、新视角合成

       NeRF是开创了一种全新的视角合成方法。新视角合成任务指的是给定源图像(Source Image)及对应的源姿态(Source Pose)以及目标姿态(Target Pose),渲染生成目标姿态对应的图片(Target)。源姿态指的是从相机坐标转换为世界坐标的变换矩阵。 涉及2D和3D之间的坐标转换。

 

NeRF:神经辐射场论文原理讲解_第1张图片

 如上图所示,一共有三个坐标系:世界坐标系[X,Y,Z]、相机坐标系[Xc,Yc,Zc]T和图像坐标系[x,y]T

(一)、相机坐标系与世界坐标系的转换

           相机坐标系和三维世界坐标系之间的转换关系如下:

NeRF:神经辐射场论文原理讲解_第2张图片

NeRF:神经辐射场论文原理讲解_第3张图片叫做相机的外参矩阵,包含旋转信息:和平移信息:,用于从世界坐标转换到相机坐标。对于NeRF来说会提供从相机坐标系转换到世界坐标系的前述矩阵的逆矩阵。

(二)、图像坐标与相机坐标系的转换

      二维图像的坐标和相机坐标系中的坐标转换关系如下:

其中,矩阵指的是相机的内参,包含焦距以及图像中心点的坐标

坐标转换详细可见:新视角合成 (Novel View Synthesis) - (1) 任务定义 - 知乎

二、NeRF的作用

       NeRF即神经辐射场,就是将全连接神经网络(非卷积)引入到物体的3维场景表示中。只需要同一物体不同角度的若干张图片作为监督,神经网络可以隐式地对该物体进行三维场景建模,然后在新视角下通过体渲染(volume rendering)的方法渲染生成新的角度的二维图像。在3D重建,数据增强,AR/VR等领域有着广泛的应用。

三、NeRF的流程

       首先,是通过相机光线穿过场景,采样三维点集(x,y,z)。

       然后,将这些采样的三维点集和相关的2维视角(θ,Φ)作为输入,输入到神经网络(MLP)中,输出采样点对应的颜色(view-dependent)和体密度(volume density)。

       最后,用经典的体渲染方法将输出的颜色(c=(r,g,b))和体密度(σ)渲染成2维图片。

       通过最小化已知图片和通过渲染得到的图片之间的像素差值进行训练。方法的总体流程图如下所示:
NeRF:神经辐射场论文原理讲解_第4张图片

 

 

四、NeRF的实施细节

(一)、场景表示

       NeRF将一个连续的场景表示为一个5D的向量函数,它的输入包括空间点3D坐标X=(x,y,z)以及2D的视角方向d = (θ,Φ)。输出是与位置相关的体素密度σ和视角相关的该3D点颜色c=(r,g,b)。

神经网络表示为:

1、输入坐标表示

       根据光线追踪的基本只是,一条射线可以用公式rt=o+td 表示,其中o表示原点的坐标,d是方向向量,t是参数,射线上的每个点都可以由(x,y,z,θ,Φ)表示,即三维空间坐标和视角。

NeRF:神经辐射场论文原理讲解_第5张图片

        如上图所示,射线上的点可以用(x,y,z,theta,phi)来表示。详细可见        新视角合成 (Novel View Synthesis) - (2) Scene Representation - 知乎。

2MLP网络结构

        在训练过程中通过优化神经网络权重Θ,使输入的5D坐标与输出体密度、方向相关的颜色对应起来。体素密度σ只和x相关,c和x、d均相关。网络结构如下图所示:

         NeRF:神经辐射场论文原理讲解_第6张图片

        首先将3D位置坐标x输入到8层全连接层中,每一层有256个通道,输出为一维的体素密度σ(通过(256,1)的全连接层实现),以及一个256维的特征向量。将256维的中间特征向量与视角串联起来,组成一个256+24位的特征向量,再通过一个(256+24,128)全连接层,以及一个(128,3)的全连接层输出RGB颜色值。在第5层有一个跳跃链接,将位置信息直接串联到第五层的特征向量上,再进行前向传播。黑色箭头表示用ReLU做为激活函数,橙色箭头表示没有激活函数,黑色虚线箭头表示用sigmoid作为激活函数(实际作者在代码中并没有使用这个激活函数)。

 

(二)、体渲染

        一条有近端(tn)和远端边界(tf)的相机光线rt=o+td的颜色为:

       NeRF:神经辐射场论文原理讲解_第7张图片

 其中,NeRF:神经辐射场论文原理讲解_第8张图片

 

表示射线从tnt这一段路径上的累积透明度,可以理解为这条射线从tnt一路上没有击中任何粒子的概率。在实际运用中不可能用NeRF去估计连续的3D信息,因此就需要数值近似的方法。作者提出了一种均匀随机采样方法,第i个采样点如下式所示:

NeRF:神经辐射场论文原理讲解_第9张图片

       首先将射线需要积分的区域分为N份,然后在每一个小区域中进行均匀随机采样,这种方法可以保证采样位置的连续性。上式求颜色的积分公式可以简化为如下求和公式:

NeRF:神经辐射场论文原理讲解_第10张图片

 

其中,NeRF:神经辐射场论文原理讲解_第11张图片 是邻近两个采样点之间的距离。

(三)、位置编码

       NeRF函数的输入为位置和角度信息,作者发现直接将位置和角度作为网络的输入得到的结果相对模糊,而用position encoding的方式将位置信息映射到高频则能有效提升清晰度效果。作者提出的位置编码函数如下:

 

 

       P代表需要编码的位置,在NeRF中指的是X=(x,y,z),d = (θ,Φ),其中对X编码时L=10,对d编码时L=4。故对一个采样点中有60个数,在nerf-pytorch-master项目中,在给视角编码时多加了一个维度,详见run_nerf.py 文件第44行,故中有24个数。

项目代码详见:

GitHub - yenchenlin/nerf-pytorch: A PyTorch implementation of NeRF (Neural Radiance Fields) that reproduces the results.

  

(四)、分层体素采样

       NeRF的渲染过程计算量很大,每条射线上都要采样很多点,但实际上一条射线上的大部分区域都是空区域,或者被遮挡,对最终颜色的影响不大。作者提出了用coarse和fine两个网络同时优化的方法。首先用体渲染这一节中提出的采样方法,采样较为稀疏的Nc个点,优化coarse网络,NeRF中Nc=64

得到颜色累加公式重新表述如下:

NeRF:神经辐射场论文原理讲解_第12张图片

       然后对权重归一化如下:

 NeRF:神经辐射场论文原理讲解_第13张图片

       此处的可以看作是沿着射线的概率密度函数(PDF),如下图所示,通过这个概率密度函数,我们可以粗略地得到射线上的物体的分布情况。

NeRF:神经辐射场论文原理讲解_第14张图片

 

接下来基于得到的概率密度函数来采样Nf个点,并用这Nf个点和前面的Nc个点共同计算优化fine网络,光线最终的渲染颜色为,采样点如下图所示:

NeRF:神经辐射场论文原理讲解_第15张图片

 

       该采样算法的核心就是用coarse网络来生成概率密度函数,再基于概率密度函数采样更精细的点。具体可参考:【NeRF论文笔记】用于视图合成的神经辐射场技术 - 知乎

你可能感兴趣的:(pytorch,图形渲染,机器学习)