NeRF(Neural Radiance Field)神经辐射场基本原理
NeRF的任务设定
NeRF全称神经辐射场(Neural Radiance Field),简单来说,就是通过神经网络直接对辐射场进行建模,从而可以通过查询的方式找到各个点的体密度与颜色值,然后通过对camera ray的方向进行体渲染(volume rendering)的方式得到特定视角下的渲染结果。NeRF的任务设定是:首先获取到一系列不同视角下的成像结果(包括对应的相机内外参),然后利用这些特定角度的成像结果作为约束,对一个MLP网络建模,模型训练好后,就可以将新的位置和角度输入到网络中,结合体渲染方式得到新视角下的图像。这个任务通常被称为新视角合成(new view synthesis)。具体如图所示。
基本思路与实现方式
NeRF将一个静态场景视为一个5D function,其自变量(也就是query)是3D位置+2D方向,表示为\((x,y,z,\phi,\theta)\),这里的位置\((x,y,z)\)就是场景中一点在3D空间中的坐标,而\((\phi,\theta)\)是从该点发出的射线的方向,3D空间的射线用两个角度即可表示(类似2D空间的极坐标角度表示射线),输出为该点的辐射密度(可以简单理解为不透明度,控制一条射线穿过该点的累积量)和视角相关的RGB值,表示为\((RGB, \sigma)\)。
如果采用一个MLP网络将上述的5D位置角度输入到\((RGB,\sigma)\)的计算过程隐式建构出来,那么这个MLP就可以作为该3D场景的一个隐式表示了,这就是NeRF的基本原理。由于密度值可以认为是方向无关的,而RGB是视角相关的(不同方向下看该点的颜色不同),为了强制密度只与3D位置有关,这个MLP实现方法如下:先输入3D位置\((x,y,z)\)得到feature后,直接预测密度\(\sigma\),然后将feature加上方向\((\phi,\theta)\)再过一层网络,得到RGB。这样就使得密度只和位置相关,而与视角无关,而RGB与两者都相关了。
建模完成后,下面一个重要的问题就是如何优化。由于从3D到2D相机成像平面的过程(即rendering)是一个比较容易的正演过程,同时又是可微的,因此可以对建模得到的隐式的3D场景取对应的射线,从而利用MLP输出得到对应的渲染结果,然后与已知角度的图像进行对比,minimize两者之间的差异。将这个loss反传,即可对MLP进行优化。
从3D到2D的渲染采用了volume rendering的方式,其计算如下: \[ C(r) = \int_{t_{near}}^{t_{far}}T(t)\sigma(r(t))c(r(t),d)dt \] 其中: \[ T(t) = \exp(-\int_{t_{near}}^t\sigma(r(s))ds) \] 这个\(T(t)\)可以视为从相机沿着一条射线观察场景的某一点,该点前面有多少遮挡。如果遮挡严重,这个值就很小,也就是说被遮挡的点对于最后渲染结果的贡献很小,vice versa。
NeRF的过程如下所示:
这个过程训练较为困难低效,因此还有两个重要的关键操作:
- 用position encoding对位置坐标进行编码;
- hierarchical sampling procedure减少对于高频信息的查询次数;
关键操作1:位置编码
神经网络偏向于学低频信息,将输入数据通过高频函数映射到高维空间有助于fit带有高频的信息。
具体做法: \[ \gamma(p) = (\sin(2^0\pi p), \cos(2^0\pi p), \cdots, \sin(2^{L-1}\pi p), \cos(2^{L-1}\pi p)) \] 与Transformer中的目的不同,Transformer中用于补充在token化之后的时序关系信息,而NeRF则是用来将连续的坐标信息映射到高维空间,补充高频信息,以便网络更好学习高频。
关键操作2:层次采样
Hierarchical volume sampling
先分层抽样,即分bins均匀抽样,得到coarse结果,用该结果估计一条ray上的渲染权重,以此确定该ray的点的重要性分布(哪些是visible的)。从而根据该分布的cdf进行逆变换采样(inverse transform sampling),得到fine的结果。最终的loss函数就是两者之和。
reference
https://arxiv.org/pdf/2003.08934.pdf