找回密码
 立即注册
首页 业界区 业界 A_Survey_on_Neural_Radiance_Field

A_Survey_on_Neural_Radiance_Field

胆饬 昨天 19:00
@
目录

  • Plenoxels: Radiance Fields without Neural Networks

    • Voxel Grid with Spherical Harmonics
    • Optimization

  • NeuS: Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction

    • Signed Distance Field Representation
    • Classical Volume Rendering
    • Volume Rendering with SDF
    • Training

  • Instant Neural Graphics Primitives with a Multiresolution Hash Encoding

    • Multiresolution Hash Encoding

      • hash collision


  • Mip-NeRF: A Multiscale Representation for Anti-Aliasing Neural Radiance Fields

    • Cone Tracing
    • Positional Encoding
    • Architecture

  • Mip-Splatting: Alias-free 3D Gaussian Splatting

Plenoxels: Radiance Fields without Neural Networks

传统的nerf具有训练时间太长的缺点,因为nerf使用Position Encoding把大量信息存储在网络权重中,信息完全储存在网络中会导致计算很慢,网络表达能力也会受到限制。Plenoxels提出将场景表示为稀疏3D网络,在网络的格点上存储σ和球谐系数,并通过三线性插值的方法计算任意采样点的σ和球谐系数,从而取代了原本nerf中MLP的部分,实现了在渲染质量没有损失的情况下,比nerf优化速度快两个数量级。
1.png

Voxel Grid with Spherical Harmonics

Plenoxels在空间中建立一个这样的网络,网络的格点存储球谐系数和σ。对于空间中的一个样本点,Plenoxels寻找到最近的八个顶点,然后进行三线性插值,计算出这个采样点的对应球谐系数和σ。后续的体渲染过程与nerf相同。
稀疏3D网络是完全显式的方法,不含任何神经网络的成分,所有系数均直接优化,无需任何特殊的初始化或神经网络预训练。Plenoxels对每个格点使用2阶的球谐函数,也就是说,每个颜色通道有9个球谐系数。
Plenoxels比较了三线性插值和最近邻差值的性能差异,它认为三线性插值明显由于最近邻差值,以下是消融实验:
MethodPSNR ↑SSIM ↑LPIPS ↓Trilinear, 256^330.570.9500.065Trilinear, 128^328.460.9260.100Nearest Neighbor, 256^327.170.9140.119Nearest Neighbor, 128^323.730.8660.1762563和1283是网格的分辨率。
Optimization

Plenoxels提出了自己的针对grid的Coarse-to-fine策略,即,在训练到一定阶段后,对grid进行上采样,例如,2563的grid,每个网格一分八,变为5123,在细分之后,网格的初始化值同样由三线性插值方法得到。
此外,Plenoxels也提及了剪枝操作。Plenoxels会根据grid的参数进行剪枝,仅关注非空的grid,剪枝策略是通过设定阈值实现的,阈值针对每个体素的:
$$
T_i \left( 1- \exp(- \sigma_i \delta_i) \right).
$$
文献还提出,直接进行修剪可能会最外层的参数造成不利影响,因为grid在后续的上采样时,这些参数还需要直接与外部的体素进行三线性插值。因此,Plenoxels使用膨胀操作,以确保仅在体素本身及其邻居都被视为未被占用时才对体素进行修剪。
Plenoxels根据均方误差(mean squared error, MSE)和全变分正则化(total variation regularization, TV)来优化grid的参数,前者很好理解,就是一个常规的loss,后者需要解释一下:
由于grid参数的优化是完全独立的,这很可能会导致训练过程中因为视角分布导致失真问题。譬如,某部分网格的参数能够很好的应付训练集视角的渲染,而另一部分网格由于前面的这些网格承担了大部分的渲染任务,使得它只存了较少的参数。在进行新视角合成的时候,这两部分网格参数的割裂感就会以伪影的形式展示出来。
2.png

因此,Plenoxel使用全变分正则化使相邻网格的参数变得平滑。
$$
\begin{aligned}
\mathcal{L}&=\mathcal{L}{recon}+\lambda\mathcal{L}{TV} ,\
\mathcal{L}
& =\frac1{|\mathcal{R}|}\sum_{\mathbf{r}\in\mathcal{R}} \left | C(\mathbf{r})-\hat{C}(\mathbf{r})\right |2^2 ,\
\mathcal{L}
& =\frac{1}{|\mathcal{V}|}\sum_{\underset{d\in[D]}{\mathbf{v}\in\mathcal{V}}}\sqrt{\Delta_x2(\mathbf{v},d)+\Delta_y2(\mathbf{v},d)+\Delta_z^2(\mathbf{v},d)} .
\end{aligned}
$$
$$
\Delta_x^2表示(i, j, k)处体素的第d个值和(i+1, j, k)处体素的第d个值的误差的平方。
$$
对于无边界场景,Plenoxel的处理方法和NeRF++相似。Plenoxel用多球体图像(multi-sphere)表示外部空间,使用ERP投影(equirectangular Projction)将体素扭曲成球体,并在外部区域分为64层球壳,Plenoxel会预先缩放内部场景使其大致在单位球体中,越往外的球壳越大,最外一层球壳接近无穷,不同层之间可以进行插值,从而实现了外部的三线性插值。此外,外部区域的体素使用0阶的球谐函数,仅保留了RGB值,也就是说,背景部分的RGB不再依赖于视角。
在优化背景参数时,Plenoxel定义了一种基于柯西损失的稀疏先验来减少上采样时的质量损失:
$$
\mathcal{L}s=\lambda_s\sum\log\left(1+2\sigma(\mathbf{r}_i(t_k))^2\right), \
\sigma(\mathbf{r}_i(t_k))表示样本k沿着射线i的不透明度。
$$
在360°场景中,Plenoxel还使用beta分布的正则化器来优化σ:
$$
\mathcal{L}\beta=\lambda\beta\sum_\mathbf{r}\left(\log(T_{FG}(\mathbf{r}))+\log(1-T_{FG}(\mathbf{r}))\right) ,\
\mathbf{r}是训练光线,T_{FG}(\mathbf{r})是累计前景透射率,值在0与1之间。 \
很直观,一条光线要么只看到前景,要么只看到背景。
$$
NeuS: Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction

NeuS的目标是从多视角图像中重建高保真的物体表面,其本质是nerf的一种变体。NeuS首先说明了它的motivation:

  • 基于Surface Rendering的神经隐式场景的重建方法无法应对物体表面深度突然变化的情况。
  • 基于Volume Rendering的神经隐式场景的重建方法可以学习到物体表面深度突变的特征,但噪声很明显。
3.png

Neus解释说:

  • Surface Rendering方法只是考虑每条射线与物体表面相交的单个交点(如a所示),从而无法重建具有复杂结构的物体表面(如b所示)。具体原因是,梯度只存在于射线与表面相交的这个单点,这对于有效的反向传播来说太局部了,并且当物体表面的深度发生突变时,优化会陷入不良的局部最小值。此外,Surface Rendering方法还需要前景掩膜作为收敛到有效表面的监督。
  • Volume Rendering方法可以沿着射线的方向采样多个点(如a所示),因此可以应对物体表面突发的深度变化,所有的采样点,无论是表面附近还是远离表面,都会产生用于反向传播的梯度信号。然而,nerf的目的是新视角生成而不是表面重建,因此nerf只学习体积密度场,很难从中提取高质量的表面,如b所示,nerf学习的密度场尽管正确地解释了突然的深度变化,但它在某些平面区域中包含明显的噪声。
NeuS的贡献是在nerf的基础上修改了体渲染的策略,解决了nerf对表面重建不良的问题。
Signed Distance Field Representation

有符号距离场用f表示:
$$
f:\mathbb{R}^3 \rightarrow \mathbb{R}, \
f(\mathbf{x})表示空间中任意一点与最近表面的距离,\mathbf{x} \in \mathbb{R}^3,\
若\mathbf{x}在物体内部则为负数,\mathbf{x}在物体外部则为正数。
$$
那么,可以用一个集合表示一个物体的表面:
$$
\mathcal{S}=\left{\mathrm{x}\in\mathbb{R}^3|f(\mathbf{x})=0\right}.
$$
4.png

Classical Volume Rendering

经典的体渲染公式如下:
$$
C(\mathbf{o},\mathbf{v})=\int_0^{+\infty}w(t)c(\mathbf{p}(t),\mathbf{v})\mathrm{d}t ,\
{\mathbf{p}(t)=\mathbf{o}+t\mathbf{v}|t\geq0} .
$$
其中,o 是相机光心位置,v 是光线方向的单位向量,w(t)是点 p(t)处的权重,c(p(t),v)是点 p(t)处的颜色,C(o,v)是由相机光心位置和光线方向确定的像素坐标上的颜色输出值。
在nerf中,这个公式变成:
$$
C(\mathbf{o},\mathbf{v})=\sum_{i=1}^{N}T_i\sigma_i\mathbf{c}i, \
\sigma_i=(1-\exp(-\sigma_i\delta_i)),T_i=\exp\left(-\sum
^{i-1}\sigma_j \delta_j \right) ,\
\delta_j = t_{i+1}-t_i,表示采样点之间的欧氏距离,\
\sigma_i和c_i由多层感知机推出。
$$
以上式子是体渲染公式的离散化形式,所以会多出一个变量δ。可以看到,在nerf中,权重函数被设置为:
$$
w(t)=T(t)\sigma(t),T(t)=\exp(-\int_0^t\sigma(u)\mathrm{d}u).
$$
Volume Rendering with SDF

那么,SDF如何介入体渲染呢?直观上,我们认为σ应该在物体表面具有极大值,而物体表面S有具有f(x)=0的性质,我们自然想到使用最常用的logistics:
$$
\sigma=\Phi_s(x)=\frac{1}{1+e^{-sx}},\
对于物体表面的点\mathbf{x} \in \mathcal{S},\Phi_s(f(\mathbf{x}))处于极大值。
$$
但是,这样又会导致一些问题,被称为"Naive Solution"。NeuS提出了关于权重函数w(t)的两个原则:
$$
1.无偏性(unbiased):当f(\mathbf{p}(t))=0,w(t)应处于极大值 。\
2.遮挡感知(Occlusion-aware):给定t_0和t_1,\
且f(\mathbf{p}(t_0))=f(\mathbf{p}(t_1)),t_0 w(t_1)。
$$
关于第二点,翻译一下,就是如果出现一条光线上两个点SDF值相同时,距离相机更近的点应该具有更大的权重。
NeuS证明了如果使用Naive Solution,就不满足无偏性,于是NeuS提出了自己的w(t),并通过一些数学推导(本文从略),得到了σ(t)的表达式,为了与原式区分,文献中用ρ(t)表示:
$$
w(t)=\frac{\phi_s(f(\mathbf{p}(t)))}{\int_0^{+\infty}\phi_s(f(\mathbf{p}(u)))\mathrm{d}u} ,\
\rho(t)=\frac{-\frac{\mathrm{d}\Phi_s}{\mathrm{d}t}(f(\mathbf{p}(t)))}{\Phi_s(f(\mathbf{p}(t)))} .
$$
T(t)仍然遵循与先前类似的形式:
$$
T(t)=\exp(-\int_0^t\rho(u)\mathrm{d}u).
$$
5.png

另外,文章还提出,当光线出射(即f增大)时,ρ(t)会出现负值段,于是作者用最小值0截断,然后,ρ(t)变成:
$$
\rho(t)=\max\left(\frac{-\frac{\mathrm d\Phi_s}{\mathrm dt}(f(\mathbf p(t)))}{\Phi_s(f(\mathbf p(t)))},0\right) .
$$
w(t)效果如下,很直观地显示出了无偏性和遮挡感知:
6.png

Training

一条光线上采样点个数为n,批次数为m,损失函数定义为:
$$
\mathcal{L}=\mathcal{L}{color}+\lambda\mathcal{L}+\beta\mathcal{L}{mask} ,\
\mathcal{L}
=\frac{1}{m}\sum_k\mathcal{R}(\hat{C}k,C_k),R为L1损失 ,\
\mathcal{L}
=\frac1{nm}\sum_{k,i}(|\nabla f(\hat{\mathbf{p}}{k,i})|2-1)^2 ,\
\mathcal{L}
=\mathrm{BCE}(M_k,\hat{O}k),BCE为交叉熵损失,M_K \in {0,1} ,\
\hat{O}k=\sum^{n}T
\alpha
.
$$
其中,Lcolor项很好理解,就是渲染得到的图片与输入图片之间的loss。Lreg用来正则化SDF的梯度,使其尽可能保持为1,确保了重建表面的光滑性和几何准确性,避免了由于梯度不规则而导致的重建瑕疵。Lmask表示遮罩损失,可以增强模型对物体形状和位置的捕捉精度。
Instant Neural Graphics Primitives with a Multiresolution Hash Encoding

InstantNGP的思想和Plenoxels有异曲同工的地方,它们都从3d grid出发,然后对空间中任意的采样点,使用线性插值的方法获得这个采样点对应的值。不同之处在于,Plenoxels是直接在grid的格点中存储球谐系数和σ,没有使用任何神经网络,是完全显式的表达。
InstantNGP沿用了Plenoxels的这种思想,但是并没有摒弃神经网络的成分。诚然,Plenoxels凭借稀疏的3d grid,将nerf的训练时间缩短了2个数量级。但是,3d grid这种结构化数据其实是很浪费的,因为只有物体表面的采样点是有意义的,绝大多数cell是空的。因此,InstantNGP并没有直接在网络的格点处去存储参数,而是根据格点在网络中的位置,建立了哈希表(hash table)进行映射(hash encoding),然后把映射出来的feature送到MLP里面再去训。
InstantNGP通过这种改良,宣称能用5秒完成nerf的训练!
Multiresolution Hash Encoding

以上就是哈希编码的简略过程,原文中使用的多分辨率哈希编码要多一些步骤。Plenoxels中的Coarse-to-fine策略是在训练中对grid进行上采样,而InstantNGP直接在最初就并存多分辨率的grid。
7.png

相关参数含义:
ParameterSymbolValueNumber of levelsL16Max. entries per level (hash table size)T$$2^{14} to 2^{24}$$Number of feature dimensions per entryF2Coarsest resolution$$N_{min}$$16Finest resolution$$N_{max}$$512 to 524288具体操作可分为以下5步:

  • 划分出不同分辨率的L层grid。只需要确定最大分辨率和最小分辨率即可,中间的分辨率通过以下式子算出:
$$
\begin{aligned}
N_{l} & :=\left\lfloor N_{\min } \cdot b^{l}\right\rfloor,\lfloor \rfloor为向下取整。\
b & :=\exp \left(\frac{\ln N_{\max }-\ln N_{\min }}{L-1}\right).
\end{aligned}
$$

  • 使用网格角点index的xyz坐标,根据如下式子进行哈希映射,产生一个feature。至于为什么哈希函数长这个样子,这个空间哈希函数其实是另外一篇文献中提出的。
$$
h(\mathbf{x})=\left(\bigoplus_{i=1}^{d} x_{i} \pi_{i}\right) \quad \bmod T, \
\bigoplus表示按位异或。\pi_{1}=1,对应x;\pi_{2}=2 654 435 761,对应y;\
\pi_{3}=805 459 861,对应z。
$$
<ol start="3">根据输入坐标,在不同分辨率的网格下各自选取8个角点,进行d线性插值(
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册