【论文笔记】三维重建系列工作
Last updated
Last updated
@TOC
传统的nerf具有训练时间太长的缺点,Plenoxels提出将场景表示为具有球谐函数的稀疏3D网络,并通过三线性插值的方法计算任意位置的不透明度和球谐系数,从而取代了原本nerf中MLP的部分,实现了在渲染质量没有损失的情况下,比nerf优化速度快两个数量级。
Plenoxels在空间中建立一个这样的网络,网络的结点存储球谐系数和不透明度。对于空间中的一个样本点,Plenoxels寻找到最近的八个顶点,然后进行三线性插值,计算出这个采样点的对应球谐系数和不透明度。后续的体渲染过程与nerf相同。
稀疏3D网络是完全显式的方法,不含任何神经网络的成分,所有系数均直接优化,无需任何特殊的初始化或神经网络预训练。Plenoxels对每个结点使用2阶的球谐函数,也就是说,每个颜色通道有9个球谐系数。
Plenoxels比较了三线性插值和最近邻差值的性能差异,它认为三线性插值明显由于最近邻差值,以下是消融实验:
$256^3$和$128^3$是网格的分辨率。
Plenoxels提出了自己的针对grid的Coarse-to-fine策略,即,在训练到一定阶段后,对grid进行上采样,例如,$256^3$的grid,每个网格一分八,变为$512^3$,在细分之后,网格的初始化值同样由三线性插值方法得到。
此外,Plenoxels也提及了剪枝操作。Plenoxels会根据grid的参数进行剪枝,仅关注非空的grid,剪枝策略是通过设定阈值实现的,阈值针对每个体素的:
文献还提出,直接进行修剪可能会最外层的参数造成不利影响,因为grid在后续的上采样时,这些参数还需要直接与外部的体素进行三线性插值。因此,Plenoxels使用膨胀操作,以确保仅在体素本身及其邻居都被视为未被占用时才对体素进行修剪。
Plenoxels根据均方误差(mean squared error, MSE)和全变分正则化(total variation regularization, TV)来优化grid的参数,前者很好理解,就是一个常规的loss,后者需要解释一下:
由于grid参数的优化是完全独立的,这很可能会导致训练过程中因为视角分布导致失真问题。譬如,某部分网格的参数能够很好的应付训练集视角的渲染,而另一部分网格由于前面的这些网格承担了大部分的渲染任务,使得它只存了较少的参数。在进行新视角合成的时候,这两部分网格参数的割裂感就会以伪影的形式展示出来。
因此,Plenoxel使用全变分正则化使相邻网格的参数变得平滑。
对于无边界场景,Plenoxel的处理方法和NeRF++相似。Plenoxel用多球体图像(multi-sphere)表示外部空间,使用ERP投影(equirectangular Projction)将体素扭曲成球体,并在外部区域分为64层球壳,Plenoxel会预先缩放内部场景使其大致在单位球体中,越往外的球壳越大,最外一层球壳接近无穷,不同层之间可以进行插值,从而实现了外部的三线性插值。此外,外部区域的体素使用0阶的球谐函数,仅保留了RGB值,也就是说,背景部分的RGB不再依赖于视角。
在优化背景参数时,Plenoxel定义了一种基于柯西损失的稀疏先验来减少上采样时的质量损失:
在360°场景中,Plenoxel还使用beta分布的正则化器来优化σ:
NeuS的目标是从多视角图像中重建高保真的物体表面,其本质是nerf的一种变体。NeuS首先说明了它的motivation:
基于Surface Rendering的神经隐式场景的重建方法无法应对物体表面深度突然变化的情况。
基于Volume Rendering的神经隐式场景的重建方法可以学习到物体表面深度突变的特征,但噪声很明显。
Neus解释说:
Surface Rendering方法只是考虑每条射线与物体表面相交的单个交点(如a所示),从而无法重建具有复杂结构的物体表面(如b所示)。具体原因是,梯度只存在于射线与表面相交的这个单点,这对于有效的反向传播来说太局部了,并且当物体表面的深度发生突变时,优化会陷入不良的局部最小值。此外,Surface Rendering方法还需要前景掩膜作为收敛到有效表面的监督。
Volume Rendering方法可以沿着射线的方向采样多个点(如a所示),因此可以应对物体表面突发的深度变化,所有的采样点,无论是表面附近还是远离表面,都会产生用于反向传播的梯度信号。然而,nerf的目的是新视角生成而不是表面重建,因此nerf只学习体积密度场,很难从中提取高质量的表面,如b所示,nerf学习的密度场尽管正确地解释了突然的深度变化,但它在某些平面区域中包含明显的噪声。
NeuS的贡献是在nerf的基础上修改了体渲染的策略,解决了nerf对表面重建不良的问题。
有符号距离场用f表示:
那么,可以用一个集合表示一个物体的表面:
经典的体渲染公式如下:
在nerf中,这个公式变成:
以上式子是体渲染公式的离散化形式,所以会多出一个变量δ。可以看到,在nerf中,权重函数被设置为:
那么,SDF如何介入体渲染呢?直观上,我们认为σ应该在物体表面具有极大值,而物体表面S有具有f(x)=0的性质,我们自然想到使用最常用的logistics:
但是,这样又会导致一些问题。NeuS提出了关于权重函数w(t)的两个原则:
Method | PSNR ↑ | SSIM ↑ | LPIPS ↓ |
---|---|---|---|
Trilinear, 256^3
30.57
0.950
0.065
Trilinear, 128^3
28.46
0.926
0.100
Nearest Neighbor, 256^3
27.17
0.914
0.119
Nearest Neighbor, 128^3
23.73
0.866
0.176