原文:https://arxiv.org/abs/2003.08934
1. Nerf的玩法
用已知视角的图像进行训练,inference未知视角的图像
2. Nerf 的结构设计
2.1 Nerf的物理模型
如图(a)中,假设相机在某个角度拍摄中间的物体,它的物理模型就是相机成像模型,即光线照射在三维空间中物体上的某一点,反射光线穿过相机光心,停止在成像平面上的某个像素点。Nerf把这个过程反过来看:从相机光心发射出射线,穿过图像上的每个像素点,落在空间上的三维物体上。假设图像分辨率是256*256的,那么每个图像上的射线的数量就是65536。在建模的时候,会围绕待建模对象在很多不同的位姿下进行拍摄,作为训练数据:
2.2 Nerf的pipeline
图(a)中,在每条射线上做离散的采样,每个采样点上的信息包含坐标值x,y,z以及它们的观测角度。网络的输入就是这些射线上全部离散点的x,y,z,θ,φ值。
图(b)是网络的输出,它包含每条射线上采样点的r,g,b信息(论文中用),和σ(论文中称之为density,不透明度,可以理解为该射线在当前采样点处终止的概率值)
图(c)是网络后面接的volumn blender渲染层,渲染的结果就是当前角度的图像,它是可微的。因此(d)中将渲染结果与当前角度图像GT计算Loss,而由于整个pipeline都是可微的,所以可以用SGD进行优化。
3 Nerf的网络
3.1 Density的预测
从上图的网络结构中可以看出,Density的预测仅依赖于射线上采样点的坐标值,而不依赖于当前观测的角度。因为Density表示不透明度,也就是表示这个位置上是否包含实际的物体,不管相机摆在什么位姿上,这个位置上有物体就是有,没有就是没有。
另外,在x,y,z每个坐标上,都增加了一个20维的位置编码,式中L=10:
增加位置编码相当于是一种特征增强,把原本的一个坐标数值升维到21维,作者的解释如下:
3.2 RGB的预测
RGB的预测与相机的位姿相关,因此在RGB的预测时,引入了射线上采样点的观测方向值,用一个三维的方向向量表示。它的position encoding是L=4,也就是每个方向上增加了8个维度,原本的(x,y,z)增强到了 27维的特征。
3.3 网络结构
就是全连接层,没什么可说的。。。
3.4 体渲染
- 连续的体渲染公式:
d表示射线上点的方向向量(观测方向)
r(t) 表示射线上点的坐标(位置)
σ(r(t))表示density,density只与射线上点的坐标有关
c(r(t), d)表示color,color与射线上点的坐标和观测方向都有关
对σ与c的乘积做积分,就可以得到渲染结果了。不过在前面还要加个透射率T,这个透射率的目的是处理遮挡,在射线遇到第一个物体后,这个值就变成0了,因为投射不过去了。类比于dehaze,也就是因为这个参数,导致Nerf重建出来的三维空间看上去有雾。
- 离散的体渲染公式(网络中射线上采样点是离散的):
式中σ后面那个参数表示的是采样间隔,它与σ相乘近似微分的效果。这里用了指数计算,增加非线性。综上,由于整个pipeline都是可微的,所以计算Loss用梯度下降的方法进行优化。