本文简单的介绍一下神经渲染中的NeRF技术。带来了三篇NeRF简介——NeRF,NeRF++,Mip-NeRF
Introduction
渲染是一个十分经典的图形学问题,严格来说,计算机通过一系列的程序语言、定义好的数据结构、光照变量、物体几何、视点等三维空间信息得到二维的数字图像。传统的渲染技术包括位姿校正、光栅化、着色等过程。而神经渲染不同于传统的渲染技术。其具体定义主要在于:给定一个场景的多视角图像,然后可以生成这个场景的新视角的图像。因此,这可以被定义为一个经典的深度学习问题。在NeRF被提出之前,神经渲染的基本架构主要是生成对抗网络(GAN),或者空间的三维卷积网络。然而,这类神经网络通常受限于不完备的假设空间,在优化的过程中经常陷入局部最优,导致无法合成高质量的新视角图像。
Methods
本篇文章主要介绍NeRF及其几个基本的版本:NeRF,NeRF++,Mip-NeRF。后面多数文章和工作都是基于这三篇文章的框架形成的,比如Block-NeRF,就是以Mip-NeRF为基础的模型,而Mega-NeRF则是基于NeRF++。当然一切的一切都离不开万源之源-NeRF。
NeRF
2020年,NeRF[2]于ECCV会议上被首次提出,同时获取了大量的关注。NeRF[2]基于三维场景的静态假设,给定一组输入图像与相机位姿。NeRF[2]将利用体渲染的方法求出场景的几何形状并存于MLP中,在文章中,相机的位姿作者通常使用MVS计算出来的结果作为可信的真值。在这里我们有必要简单的介绍一下NeRF的基本方程:
C
(
r
)
=
∫
t
n
t
f
T
(
t
)
σ
(
r
(
t
)
)
c
(
r
(
t
)
,
d
)
d
t
w
h
e
r
e
T
(
t
)
=
e
x
p
(
−
∫
t
n
t
σ
(
r
(
s
)
)
d
s
c
,
σ
=
f
(
x
,
d
)
\begin{align} &\ C(r) = \int_{t_n}^{t_f}T(t)\sigma(r(t))c(r(t),d)dt\ \\ &\ where\ T(t)=exp(-\int_{t_n}^t\sigma(r(s))ds\\ &\ c,\sigma = f(x,d) \end{align}
C(r)=∫tntfT(t)σ(r(t))c(r(t),d)dt where T(t)=exp(−∫tntσ(r(s))ds c,σ=f(x,d)
其中光线方程:
r
(
t
)
=
o
+
t
d
r(t)=o+td
r(t)=o+td,o代表这跟光线发出的原点,d代表着光线前进的方向。公式(1)就是著名的体渲染公式。对于光线上的每一个点,在给定o和d的情况下,由t唯一决定。根据该点的坐标和光线的方向代入神经网络求出颜色c和体密度
σ
\sigma
σ。体密度在这里可以一定程度上代表物体的不透明度。不透明度越高,
σ
\sigma
σ越接近于1.而
T
(
t
)
T(t)
T(t)的含义则是光线传输率,代表着光线在此处停止传播的概率。沿着一根光线上积分,就得到了这根光线投射出来之后的最终颜色。这样的体渲染方程完美的符合了空间的三维假设,也是NeRF能重建高质量场景的数学基础。与此之外,作者在实验中也发现仅仅对MLP输入点的坐标和方向并不能很好的重建三维场景的高频细节,因此作者采用了positional encoding的方法将坐标x和d映射到了一个高维空间当中。
NeRF的提出代表着三维重建、神经渲染的时代真正开始。然而,NeRF在训练的过程中还有很多限制。由于光线的传播距离是无限远,但是在计算积分的时候是无法求到无限远的距离的。因此在采样光线时必须界定光线的采样距离 t n e a r t_{near} tnear, t f a r t_{far} tfar,但是这样也比较依赖于整个场景的深度假设。所以NeRF初始只能用在可以被一个Bounding Box包围的场景当中,而NeRF++就解决了这个问题。
NeRF++
NeRF++[3]则采用了坐标变换的方法,将远距离的点通过逆变换映射到一个单位圆中,为无边界场景的三维重建提供了技术基础。在论文部分,NeRF++首先阐述了一下NeRF为什么能成功。
-
首先由于体渲染的假设,界定了物体必须属于三维空间的范畴,这是一个比较强的三维空间假设,而防止了模型在二维空间上过拟合,导致新视角合成的效果十分的差。从图1中可以说明,若真实的三维空间曲面是 S ∗ S^* S∗,而模型学到的假设空间是 S ^ \hat{S} S^,则从C0,C1投射出的两根光线在现实中虽然应该会与 S ∗ S^* S∗曲面相交,但模型的假设空间曲面—— S ^ \hat{S} S^仍然也可以渲染出正确的颜色。因此,在训练中,模型容易陷入Local Minima的状况。
-
BDRF方程的假设,在NeRF渲染过程中,作者对网络架构的设计也别出心裁。网络的输出体密度 σ \sigma σ和颜色值 c c c并不是在同一层输出的,而是先输出体密度再输出颜色值。这样就包含了一个假定——颜色C是体密度 σ \sigma σ的高维函数,要求模型先学得体密度的正确分布再进一步在体密度学习的基础上输出颜色值 c c c,这样的假设无疑是十分合理的。
而在NeRF++这篇论文中,作者主要提到了NeRF在训练中由于体渲染公式的问题,光线的采样必须是有近点和远点的,这就要求了NeRF必须在一个有边界的场景(bounded Scene)下训练,而对于无边界或者边界很远的场景,常常会由于对光线采样距离的错误估计,或是NeRF对体密度的错误学习导致了远处的背景部分出现了模糊的情况。作者在实验中阐述了NeRF训练中近景和远景的Trade off问题。
基于此,作者提出了一个warping的方法,也就是构建两个NeRF:近景NeRF和远景NeRF,而针对无边界场景(Unbounded Scene)的训练,作者提出了Inverse Transform的方法。即用单位圆包裹内景,而对单位圆外的场景使用反演变换,根据其离单位圆中心的距离将其映射到另一个单位圆中,而使用另一个NeRF进行渲染。
Mip-NeRF
然而,每一次过少的光线采集和空间中过多待训练的点为NeRF[2]的收敛造成了一定的困难,Mip-NeRF[4]则使用了投射光锥的方法代替投射光线,并使用了集成位置编码的方式代替普通的位置编码,从而具有较好的鲁棒性,并一定程度上加快了收敛速度。
在训练中,作者首先阐述了NeRF在渲染中容易存在OverFitting的问题。由于在光线采样的过程中并没有关注到相邻位置的点,导致在训练图片视角较少的时候OverFitting。基于此,作者将渲染过程中每次投射出一根光线改为每次投射出一根光锥,而为了计算的简便性,作者将光锥通过一个高斯函数来处理,而对于光锥内所有点的位置编码,作者则提出了集成位置编码(intergrated positional encoding),其整个编码和光线传播过程都是可导的.最终,颜色预测公式改写为:
[
γ
k
,
c
k
]
=
M
L
P
(
γ
(
r
(
t
k
)
)
,
θ
)
[\gamma_k,c_k]=MLP(\gamma(r(t_k)),\theta)
[γk,ck]=MLP(γ(r(tk)),θ)
含义便是:根据光线的前进距离位置t,作者直接取t周围一个圆的所有点,并且计算其IPE,得到结果后即为一个值,送入MLP中再计算结果。
作者注:**原以为论文的作者是先取所有点再通过MLP计算所有点的特征值再集成起来的,但仔细看论文发现是先取一系列点,经过一系列数学计算后得到一个 特征值再送入MLP,个人认为这两种方法有本质区别。**但是论文的方法也足以起到抗锯齿的效果,同时让NeRF的训练速度提升了7%,并结果更好。
Conclusion
当然,对于NeRF的应用还有很多变体,比如在无相机位姿上的场景重建、大规模场景重建、NeRF计算加速、动态场景重建。截止目前(2023.5),基于三维场景的实例分割、物体生成、场景物体编辑、基于各类先验驱动的人体动作变换等也起到了广泛的应用。
、