NeRF原理

参考:[1]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
[2]NeRF及其发展https://zhuanlan.zhihu.com/p/512538748

1 NeRF的提出

NeRF是隐式表达进行三维重建的方法,不需要中间三维重建的过程,仅根据位姿内参和图像,直接合成新视角下的图像。
NeRF做到了利用”隐式表示“实现了照片级的视角合成效果,它选择了Volume作为中间3D场景表征,然后再通过Volume rendering实现了特定视角照片合成效果。可以说NeRF实现了从离散的照片集中学习出了一种隐式的Volume表达,然后在某个特定视角,利用该隐式Volume表达和体渲染得到该视角下的照片。

2 NeRF 工作的pipeline

NeRF的工作可简单分为两部分:1)三维重建;2)渲染。

2.1 三维重建

三维重建部分本质上是一个2D到3D的建模过程,利用3D点的位置(x,y,z)及方位视角(θ,φ)作为输入,通过多层感知机(MLP)建模该点对应的颜色color(c)及体素密度volume density(σ),形成了3D场景的”隐式表示“。(Neural Radiance Field Scene Representation部分,即下图的红框部分)
image.png
与直接使用x和d作为多层感知器 f θ ( . ) fθ(.) fθ(.)的输入相比,位置编码 γ ( ⋅ ) γ(\cdot) γ()能够更好地拟合高频信号。由于体积颜色c随观察方向的变化比随三维位置的变化更平稳,观察方向通常用较少的分量进行编码,即 L d < L x L_d < L_x Ld<Lx

2.png

2.1.1 Neural Radiance Field Scene Representation

该部分的输入是三维位置(x,y,z)和二维方位视角(θ,φ),输出是颜色c=(r,g,b)和体素密度σ,即利用一个MLP网络近似地表示这种映射F:(x,d) -> (c,σ),这个映射F就是一种3D场景的”隐式表示“。
该MLP网络先使用8个全连接层处理三维位置(x,y,z),输出体素密度σ和256维特征向量(因此体素密度σ仅是关于三维位置(x,y,z)的函数);然后将上面得到的256维特征向量与二维方位视角(θ,φ)concat,接着用4个全连接层处理,输出颜色c=(r,g,b)。
![6.png](https://img-blog.csdnimg.cn/img_convert/1390c87e70f888f355f11fb7d2c16325.png#averageHue=#f8f6f4&clientId=u1ff5de95-ade9-4&from=ui&id=ua7d6ca2a&name=6.png&originHeight=451&originWidth=924&originalType=binary&ratio=1&rotation=0&showTitle=true&size=43861&status=done&style=none&taskId=u05774b77-7174-4724-b163-e3415bdcb45&title=图 2 “图 2”)

2.1.2 positional Encoding

  尽管神经网络是通用的函数近似器,但是研究人员发现,让上图1的MLP网络(F:(x,d) -> (c,σ))直接操作 (x,y,z,θ,φ)输入会导致渲染在表示颜色和几何形状方面的高频变化方面表现不佳,表明深度网络偏向于学习低频函数。因此在将(x,y,z,θ,φ)输入传递给网络之前,使用高频函数将输入映射到更高维度的空间,可以更好地拟合包含高频变化的数据。该高频编码函数为:


这个高频编码函数有点类似傅里叶级数的方式,其中p就是(x,y,z,θ,φ)输入,并且输入均归一化于[-1,1],在实验中针对于(x,y,z)输入取L=10,针对于(θ,φ)输入取L=4,即:
image.png
7.png

2.2 渲染

渲染部分本质上是一个3D到2D的建模过程,渲染部分利用重建部分得到的3D点的颜色及不透明度沿着光线进行整合得到最终的2D图像像素值。(Volume Rendering with Radiance Fields部分,即下图的红框部分)
3.png

2.2.1 Volume Rendering with Radiance Fields

在有了3D空间的模型以后(即神经辐射场 F θ F_{\theta} Fθ),需要以神经辐射场为中间载体合成图像,这个过程就是渲染。Nerf使用Volume Rendering的方法来做渲染。具体过程为,假设当前相机光心的位置为 o ∈ R 3 o\in R^3 oR3,将图像上任意像素与光心连线,可得到视角方向 d ∈ R 3 d \in R^3 dR3,根据光心及视角方向可得到一条光线 r ( t ) = o + t d r(t)=o+td r(t)=o+td,根据体渲染公式,得到该像素上观测到的颜色为:
image.png
其中函数T(t)表示射线从tn到t沿射线累积透射率,即射线从tn到t不碰到任何粒子的概率。从2.1.1中建模的Neural Radiance Field中绘制视图,需要估计通过所需虚拟相机的每个像素跟踪的相机光线的积分C®,然而2.1.1中建模后选取了Volumn作为3D中间表示,势必会使用到离散求积法对这个连续积分进行数值估计,这会极大地限制表示的分辨率,因此可通过分层抽样方法(详细信息看2.2.2Hierarchical volume sampling部分)的方法,使得即使使用离散的样本估计积分,但是能够较好地表示一个连续的场景(类似重要性采样,对整个积分域进行非均匀离散化,较能还原原本的积分分布)。
其中离散化式子为:
image.png
数学推导:
参考:从零开始推导NeRF公式,看穿数学很重要 - 知乎
nerf数学推导.pdf
即下图红框中所示:
8.png

2.2.2 Hierarchical volume sampling

在实际应用中,我们并不可能用NeRF去估计连续的3D点信息(射线上的连续点),这就需要数值近似的方法。论文中先提出了使用求积法(Quadrature)近似连续积分的方法。
确定性求积(Deterministic Quadrature)通常用于渲染离散体素网格,一般在需要求积的区域均匀采样N个点进行近似计算,但这样做会使MLP只在一系列确定的离散点上学习,从而极大限制了神经辐射场的分辨率。
作者提出了一种分层抽样(Stratified Sampling)的方法:首先将射线需要积分的区域[tn,tf]均匀分为N份,再在每个小区域进行均匀随机采样:
image.png
这个方法实现了,在只采样离散点的前提下,使MLP可以在用一种连续的方式进行优化,从而保证了辐射场对场景表达的连续性,如下图所示:
image.png
基于这些采样点,可以将上面的积分简化为求和的形式:
image.png
其中,image.png δ i = t i + 1 − t i δ_i=t_i+1−t_i δi=ti+1ti为两个近邻采样点之间的距离,此处T(t)改写作:
image.png

使用体渲染积分遇到的问题:

  • 虽然可以离散的近似计算积分,采样点过多开销过大,采样点过少近似误差有太大。

解决办法: 最好尽可能的避免在空缺部分以及被遮挡了的部分进行过多的采样,因为这些部分对最好的颜色贡献是很少的。
NeRF 按照对最终渲染的贡献比例进行采样,设计了一种“coarse to fine”的多层级体素采样方法,同时优化coarse和fine两个网络。
首先,使用分层采样的方法先采集较为稀疏的Nc个点,在这些采样点上计算coarse网络的渲染结果,改写前述的离散求和函数:
image.png,其中image.png,并对 ω i \omega_i ωi进行归一化,image.png
归一化后的ωi可以看作是沿着射线方向的概率密度函数,如下左图所示。通过这个概率密度函数,我们可以粗略地得到射线方向上物体的分布情况:
image.png
接下来,基于这个概率密度函数,使用逆变换采样(inverse transform sampling)方法,再采样出Nf个点,如上右图所示。这个方法可以从包含更多可见内容的区域中得到更多的采样点,然后在Nc+Nf的采样点集合上,计算fine网络的渲染结果。这达到了类似按权重采样的效果,作者将采样点视为非均匀的离散化,而非对每个点进行独立的概率估计。

2.3 计算损失函数

在训练的时候,利用渲染部分得到的2D图像,通过与Ground Truth做L2损失函数(L2 Loss)进行网络优化。(即下图的红框部分)
4.png
损失函数:
image.png

3 三个坐标系

3D视觉中有三个坐标系:图像坐标系、相机坐标系、世界坐标系。它们之间的关系,可通过三个变换来表示:仿射变换、投影变换、刚体变换。这三个变换,是三维重建几何框架的基础,通过它们,可以将 空间 中的 点 (Xw, Yw, Zw),与 图像 中的 像素 (u, v) 对应起来。
image.png
image.png
image.png

image.png
(1)世界坐标系与相机坐标系
从世界坐标系到相机坐标系属于刚体变换,即物体不会发生形变,只需要进行旋转和平移(RT),此为相机的外参矩阵。
世界坐标系和相机坐标系的转换关系如下,具体见
[ X c Y c Z c ] = [ R T ] [ X w Y w Z w ] \begin{bmatrix} X_{c} \\ Y_{c} \\ Z_{c} \end{bmatrix} = \begin{bmatrix} R & T \end{bmatrix} \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \end{bmatrix} XcYcZc =[RT] XwYwZw
这样,就建立了图像中的 像素点 (u, v) 和 世界坐标中的 空间点 (Xw, Yw, Zw) 之间的对应关系。
世界坐标系,可根据运算的方便,来自由放置。若世界坐标系和相机坐标系重合,则 R为单位矩阵,T为零矩阵,即:
[ X c Y c Z c ] = [ 1 0 0 0 0 1 0 0 0 0 1 0 ] [ X w Y w Z w ] = [ X w Y w Z w ] \begin{bmatrix} X_{c} \\ Y_{c} \\ Z_{c} \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \end{bmatrix}=\begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \end{bmatrix} XcYcZc = 100010001000 XwYwZw = XwYwZw
image.png
在张正友标定法中,将世界坐标系的原点设定在棋盘格的左上角点,Z轴垂直于棋盘平面(XOY平面);相机坐标系的原点在相机光心,Z轴在光轴上,垂直于成像平面。
旋转矩阵 R R R,平移矩阵 T T T,下图是世界坐标系绕z轴旋转模型

从图中可知,对于世界坐标系中的一点 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw,Yw,Zw),其对应相机坐标系中 X c X_c Xc的坐标为 X w c o s α − Y w s i n α X_w cos \alpha - Y_wsin\alpha XwcosαYwsinα
image.png
(2)相机坐标系与图像坐标系:称为摄像机模型以及投影矩阵
相机是三维物体和所成二维图像之间的一种映射,常用的小孔成像模型,如下图所示:
image.png
设相机的焦距为 f,则根据小孔成像模型,可知相机坐标系下空间点 (Xc,Yc,Zc),与图像坐标系下的坐标 (x,y)的关系如下:
image.png
(3)图像坐标系与像素坐标系
当相机调整好焦距后,相机透镜中心点到像平面的距离是固定的,此时,像平面内每个像素的尺寸大小也变成了固定值。
假设每个像素在 x 轴和 y 轴 方向上的物理尺寸分别为 dx 和 dy,则在忽略相机成像畸变的情况下,像素坐标和图像坐标的转换关系如下:
image.png
(4)从世界坐标系到像素坐标系的转换方程
image.png
参考:

  1. https://www.cnblogs.com/ghjnwk/p/10852264.html
  2. https://www.jianshu.com/p/2341da36aa8e

猜你喜欢

转载自blog.csdn.net/KeepLearning1/article/details/129923446
今日推荐