目录
一、导言
该论文来自于ECCV2020,主要提到一种NeRF的方法来合成复杂场景下的新视角图像,通过将场景表示为连续的5D神经辐射场函数,通过输入5D坐标,输出场景中采样点的体密度和颜色信息,使用体渲染技术渲染出新的视角图像。
(1)提出了一种新的场景表示方法NeRF。
(2)通过使用位置编码来使得MLP理解更高频的函数
(3)采用分层采样来提高采样点的利用率,减少无用采样点的数量。
二、NeRF
1、渲染和反渲染
渲染: 将三维信息(包括几何形状、材质属性、光源信息、相机参数),转变为特定视角下的二维图像。
反渲染:通过大量二维图像推断出三维信息中的几何形状、材质属性、光源信息。这也是三维重建中的重要步骤。
下图为NeRF工作的图示:(通过输入同一物体的大量图片,生成该物体的一个隐式神经辐射场NeRF来存储相关信息,并渲染出不同视角下的新2维图像,NeRF并不懂得物体的真实三维结构,也不能估计出物体各表面的真实三维坐标,貌似有一个技术叫表面重建可以做)
2、NeRF的基本原理
NeRF通过已知视角的图片,提取采样点的位置和观测角度 作为输入,并通过神经网络输出所对应一组采样点 的颜色和不透明度,而三维模型的信息就隐式存储在了神经网络中,并且由于只能针对单一物体的图片作为输入,该神经网络(权重)就只能表示这个三维模型的信息。
对于分别为摄像机的俯仰角和偏航角,来自于极坐标系。
对于不透明度σ,或者叫做体密度,体密度与物体的材质有关,对于空气和物体的体密度一定是不同的,空气的不透明度几乎为0。
在论文中定义不透明度为,体密度为射线在位置x处无限小粒子处终止的微分概率。
3、采样点
从下图可以看到对于一张2维图像,经过一道光线(由人眼/相机发出的虚拟的射线,人眼视角)穿过整个物体,,按照一定的距离分段,可以得到若干采样点。
这些采样点有些还没有经过物体,所以他的不透明度σ几乎为0,有些点刚好穿过物体表面此时不透明度σ最大,但理论上一道光线会穿过物体两次,一次在正面一次在背面,那么就会产生两个不透明度的波峰,但由NeRF模型合成不同人眼视角下的图片过程中,我们不应该把这两个波峰都进行渲染,因为人眼看不到背面,所以在后续计算中通过指数函数的方法,指考虑第一个波峰,而尽量忽略第二个即以后的波峰。
采样点位置表示: ,其中代表光线初始点,也就是摄像机的位置,就是每一段的距离,代表第几个点。(其实就是个直线的参数方程)
4、位置编码
从transformer的位置编码类比看其实都是一样的,通过将采样点的三维坐标进行正弦余弦编码得到不同维数(正弦余弦各一半)的位置编码,在网络中使用了20维和8维的位置编码。通过位置编码的方式可以有效增加采样点和图片像素间的高频信息。
在实验中也对比了有无位置编码的效果,对于无位置编码情况下会出现模糊的效果。
5、NeRF网络结构
对于NeRF网络如下:
首先输入采样点位置,以及采样点位置三个坐标分别20维共60维的位置编码(总共63维通道)。
经过连续的5层全连接层(输出均256),与输入进行残差相连(此时319维通道)。
再经过3层全连接层(输出均256),分别经过一个全连接(输出为1)得到σ,另外残差连接观测角度(观测角度提前球坐标转变为三维)和8维采样点位置编码(共287维)经过两个全连接层最后输出三维RGB(第一个全连接输出128维,第二个全连接输出3维)。
代码如下:
6、体渲染
体渲染:视线r上所有的点投影到图像上形成像素颜色C的过程。
理想情况下体渲染计算公式:
其中,分别表示光线的近端和远端。
:不透光率,在光线距离方向,从近端到t方向对σ进行积分得到不透光率,通过指数函数衰减,可以保证尽量针对第一个波峰。
:采样点的颜色与采样点位置和观测角度有关。
:不透明度对于采样点位置有关,对于观测角度无关。
:理解为不透光率,透明度,采样点颜色的乘积在光线近端到远端的积分
真实情况下的体渲染计算公式:(使用求和来替代积分)
三、分层采样
1、均匀采样
对于一般的粗网络均匀采样64个点的方法,由于物体一般是在聚集在光线穿过的中心,而不是均匀分布,所以存在大量的点位浪费和欠采样的问题。
2、基于σ的采样
首先通过粗网络采样,并计算64个点的像素颜色。之后在光线方向计算颜色的加权和,权重为基于粗网络的σ下的分段常数概率密度,并进行归一化。最后通过逆变换采样,在这个概率密度上采样128个点,并带上之前的64个点,构成精细网络。
其中权重公式中的表示两个采样点之间的距离。
四、损失函数
损失函数有两个部分构成,粗网络下生成的像素对比和精细网络下的像素对比。对比函数使用L2 Loss。
论文参考:https://arxiv.org/abs/2003.08934
视频参考:NeRF原理进阶------体渲染概念_哔哩哔哩_bilibili
代码参考:nerf-pytorch