Advertisement

论文阅读:Sparse Voxels Rasterization: Real-time High-fidelity Radiance Field Rendering

阅读量:

目录

Abstract

3. Approach

3.1. 稀疏体素光栅化

3.1.1. 场景表示

3.1.2. 光栅化算法

3.2. 渐进式稀疏体素优化

3.2.1. 场景初始化

3.2.2. 自适应修剪和细分

3.2.3. 优化目标

3.2.4. 稀疏体素TSDF融合和移动立方体

Abstract

我们提出了一种有效的辐射场渲染算法,该算法在稀疏体素上结合了光栅化过程,而不需要神经网络或3D高斯。拟议的系统有两个关键贡献。首先是利用动态Morton排序,沿着像素射线以正确的深度顺序渲染稀疏体素。这避免了在高斯溅射中发现的众所周知的弹出伪影。其次,我们自适应地将稀疏体素与场景中的不同细节级别相匹配,忠实地再现场景细节,同时实现高渲染帧率。我们的方法将之前的无神经体素网格表示提高了4db以上的PSNR和超过10倍的渲染FPS加速,实现了最先进的可比较的新视图合成结果。此外,我们的无神经稀疏体素与基于网格的3D处理算法无缝兼容。通过将TSDF-Fusion和Marching Cubes集成到我们的稀疏网格系统中,我们获得了很好的网格重建精度。

3. Approach

我们提出的方法如下。首先,在3.1节中,我们介绍了稀疏体素场景表示和用于将稀疏体素渲染为像素的光栅化器。在后面的3.2节中,我们描述了渐进式场景优化策略,该策略旨在使用我们的稀疏体素从多视图图像忠实地重建场景。

图2。稀疏体素场景表示。(左)我们在八叉树布局下分配体素。每个体素都有自己的球面谐波系数,用于依赖于视图的外观。在渲染视图时,颜色场近似为体素内的常量,以提高效率。密度场在体素内呈三次线性变化,并由每个体素的角网格点(即黑点•)上的密度值建模。网格点密度在相邻体素之间共享。(右)我们在射线-体素交点段内均匀采样K个点,计算其对像素射线贡献的alpha值的体积分。详细信息请参见第3.1.1节。

3.1. 稀疏体素光栅化

近期的神经辐射场渲染方法,例如 NeRF 和 3DGS 变体,使用以下alpha合成方程来渲染像素的颜色C:

C = \sum_{i = 1}^{N} T_{i} \cdot \alpha_{i} \cdot c_{i}, \quad T_{i} = \prod_{j = 1}^{i - 1} (1 - \alpha_{j})

其中\alpha_{i} \in \mathbb{R}_{\in [0,1]}c_{i} \in \mathbb{R}_{\in [0,1]}^3分别是第i个采样点或像素射线上的基元的alpha值和与视角相关的颜色。T_{i}这个量被称为透射率。从高层次来看,每种方法之间的差异归结为:

  1. 它们如何找到N个点或基元来合成像素射线,
  2. 如何从它们的场景表示中确定rgb和alpha值。 我们的稀疏体素方法遵循相同的原理。

在3.1.1节中,我们将详细介绍我们的稀疏体素场景表示,以及如何从体素中计算出方程(1)中的lpha_{j}c_{j}。在3.1.2节中,我们将展示我们的光栅化器,它收集N个体素以合成每个像素。

3.1.1. 场景表示

我们首先描述用于分配稀疏体素的网格布局,然后推导出用于体素合成渲染所需的alpha值、与视角相关的颜色以及其他几何属性。

稀疏体素网格 我们的SV光栅化器(SV Raster)使用稀疏体素表示来构建3D场景。出于获得高质量结果所必需的两个原因,我们按照八叉树空间划分规则(即如图2a所示的八叉树布局)来分配体素。首先,它有助于对不同大小的体素进行正确的渲染顺序(见3.1.2节)。其次,我们能够自适应地使稀疏体素适应不同的场景细节层次(见3.2节)。请注意,我们的表示并没有复制带有父子指针或线性八叉树的传统八叉树数据结构。具体来说,我们只保留八叉树叶节点,而不保留任何祖先节点。基于排序的光栅化器将把体素投影到图像空间,并确保在渲染时所有体素都处于正确的顺序。总之,由于我们的光栅化器提供了灵活性,我们可以按任意顺序存储单个体素,而无需维护更复杂的数据结构。

我们选择一个最大细节级别L(在这项工作中L=16),它定义了最大网格分辨率为(2^L)^3。设w_snathbb{R}为八叉树宽度,w_cnathbb{R}^3为世界空间中的八叉树中心。体素索引v = i, j, k n ^3与八叉树级别lnl = 0表示根节点且不被使用)一起定义体素大小v_s和体素中心v_c如下:
v_s = w_sdot2^{-l}, uad v_c = w_c - 0.5dot w_s + v_sdot v.

在内部,我们使用一种在低级CUDA实现中众所周知的位交错操作将网格索引映射到其莫顿码。更多细节请参阅补充材料。

基于密度场的体素alpha值 接下来,我们将详细介绍每个体素基元的几何和外观建模。对于场景几何,我们使用八个参数对应于体素角点来对每个体素内部建模一个三线性密度场,表示为。相邻体素之间的共享会产生一个连续的密度场。 我们还需要一个激活函数来确保原始密度值v_{geo}的非负性。为此,我们使用指数 - 线性激活:
ext{explin} = egin{cases} x & ext{if } x > 1.1   xp eft & ext{otherwise} nd{cases}

它近似于softplus但计算效率更高。对于体素内部的尖锐密度场,我们在三线性插值后应用非线性激活[18, 37]。 为了推导出体素对公式(1)中alpha合成公式的贡献值,我们在射线 - 体素相交的射线段上均匀采样K个点,如图2b所示。该方程遵循与NeRF 中相同的体积渲染数值积分:
lpha = 1 - xp eft ight ight

其中l是射线段长度,是第k个采样点的局部体素坐标,ext{interp}表示三线性插值。

来自球谐函数的体素与视角相关的颜色 为了对与视角相关的场景外观进行建模,我们使用$N_{shd}$阶球谐函数(SH)。为了提高效率,我们假设球谐系数在体素内部保持恒定,表示为。 我们将体素颜色近似为从相机位置r_{o}到体素中心v_{c}方向的函数,而不是针对每个单独射线方向r_{d},以遵循3DGS提高效率: c = ax这是体素对像素合成公式(1)贡献的与视角相关的颜色强度。由于这种近似,一个体素的球谐颜色结果可以由图像中所有覆盖的像素共享,而不必对每个相交射线评估球谐函数。

体素法线 渲染其他特征或属性类似于通过将公式(1)中的颜色项c替换为目标模态(如体素密度场的法线)来渲染彩色图像。为了渲染效率,我们假设法线在体素内部保持恒定,这由体素中心处密度场的解析梯度表示:
at{n} = normalize

其中q_{c} = (0.5, 0.5, 0.5),前向和后向传递的闭式方程在补充材料中。与球谐颜色类似,可微的体素法线在预处理时计算一次,并由图像中所有相交射线共享。

体素深度 与颜色和法线不同,为了更精确地渲染深度,计算点深度来合成是高效的,所以我们对体素alpha值(公式(4))做同样的K个点采样。我们在CUDA实现中手动扩展和简化了少量K的前向和后向计算。详情请参考补充材料。

3.1.2. 光栅化算法

图3。光栅化过程。详细信息请参见第3.1.2节。

我们的稀疏体素光栅化过程的概述如图3所示。我们基于3DGS[19]的高效CUDA实现构建了基于排序的光栅化器。该过程如下所述。

投影到图像空间 光栅化的第一步是将稀疏体素投影到图像空间,并将体素分配给它们所覆盖的图块(即图像块)。在实际操作中,我们投影每个体素的八个角点。体素被分配给由投影的八个点形成的轴对齐包围盒所重叠的所有图块。

预处理体素 对于分配给目标视图图块的活动体素,我们从网格点收集它们的密度,利用公式(5)从它们的球谐系数计算与视角相关的颜色,并通过公式(6)推导出体素法线。在渲染过程中,预处理的体素属性在所有像素之间共享。

图4。渲染顺序的说明。(a)在这两种情况下,较小的体素应该首先渲染,但如果使用体素中心或最近的角作为排序顺序,它们将排列在较大的体素后面。(b)我们给出了二维世界下的四种Morton阶。八叉树节点下的体素渲染顺序取决于光线方向指向的世界象限。(c)一个简单的Morton顺序编码排序的例子。所有朝向右上角象限的光线方向都可以使用排序体素来获得正确的渲染顺序。详细信息请参见第3.1.2节。

体素排序 对于精确的光栅化,基元渲染顺序非常重要。与3DGS[19]中遇到的挑战类似,使用基元中心或其到相机的最近距离进行排序可能会产生不正确的顺序,从而产生“popping artifacts”[32]。我们在图4a中展示了两种使用简单排序标准导致的错误排序结果。得益于八叉树布局(见3.1.1节),我们可以利用莫顿(Morton)顺序对我们的稀疏体素表示进行排序。如图4b所示,我们可以根据不同类型的莫顿顺序来渲染八叉树节点下的体素,以获得正确的顺序。需要遵循的莫顿顺序类型完全取决于射线方向的正负号(射线起点无关紧要)。也就是说,对于3D空间中不同的射线方向,我们有八种莫顿顺序的排列。最后,通过归纳法可以证明对多层体素的推广。图4c展示了一个二维且具有三个层级的排序示例。

这种排序应用于每个图像块。如果一个块中的所有像素都具有相同的射线方向符号,我们可以简单地根据体素的莫顿顺序类型对分配的体素进行排序。当需要多个莫顿顺序时,我们在补充材料中处理边界情况。

渲染像素 最后,我们通过alpha合成(公式(1))来渲染像素。在我们的情况下,一个像素射线的N个基元混合取决于分配给该像素射线所属图块的稀疏体素数量。稀疏体素的alpha、颜色和其他几何属性的计算在3.1.1节中描述。当为一个像素射线渲染稀疏体素时,我们计算射线 - AABB(轴对齐包围盒)相交以确定要采样的射线段(用于公式(4)中的体素alpha),并跳过一些不相交的稀疏体素。如果一个稀疏体素的透射率低于阈值T_{i} < h_T,我们会提前终止alpha合成。

抗锯齿 为了减轻锯齿伪影,我们以h_{ss}倍的更高分辨率进行渲染,然后使用抗锯齿滤镜将图像下采样到目标分辨率。

3.2. 渐进式稀疏体素优化

在本节中,我们将描述使用 3.1 节中介绍的 SV 光栅化器(SV Raster)从具有已知相机参数的输入帧中优化 3D 场景的过程。

图5。体素采样率和网格布局初始化的可视化。(a)我们可视化了Eq.(7)中定义的体素采样率。(b)我们描绘了不同壳层下的前景主区域和背景区域。在无界场景中,我们对前景和背景区域采用不同的网格布局初始化策略。详见3.2.1节。

体素最大采样率。 我们首先定义每个体素在训练图像上的最大采样率v_{rate},它反映了一个体素可以覆盖的图像区域。较小的v_{rate}表示由于较少的观察,体素更容易过度拟合。我们在体素初始化和细分过程中使用v_{rate}。给定N_{cam}训练摄像机,我们估计一个体素的最大采样率如下图5a所示:
athbf{v}{athrm{rate}}=ax{i}{N_{\mathrm{cam}}}\frac{\mathbf{v}_{\mathrm{s}}}{\mathbf{v}_{\mathrm{interval}}{}}   athbf{v}{athrm{interval}}{(i)}=\underbrace{(\mathbf{v}_{\mathrm{c}}-\mathbf{r}_{\mathrm{o}}^{(i)}){athsf{T}}ll^{}}{athrm{Voxel~z-distance}}dotnderbrace{rac{aneft}ight}{0.5dot W^{}}}_{athrm{Unit-distancepixelsize}}

其中l是相机注视向量,heta_{fov - x}是相机水平视场角,W是图像宽度。采样率表示沿图像水平轴方向可能击中体素的估计光线数量。

3.2.1. 场景初始化

在不使用额外先验的情况下,我们将所有参数初始化为常数。我们通过将体素原始密度设置为一个负数h_{geo}来使体积密度接近零,这样初始激活密度ext{explin}pprox0。对于非零阶数,我们将球谐系数设为零,并设置与视角无关的零阶分量以产生灰色(即强度等于0.5)。我们将在下面详细介绍八叉树网格布局初始化。

有界场景 。如果要重建的场景或对象处于一个已知的有界区域内,我们只需将布局初始化为具有h_{lv}层的密集网格,并移除未被任何训练图像s观测到的体素。初始化后体素的数量eqslant ^3

无界场景 。对于无界场景,我们首先将空间划分为主要区域和无界背景区域,如图5b所示,每个区域采用不同的启发式方法。我们利用训练相机的位置来确定主要区域的一个立方体。立方体的中心设置为平均相机位置,半径设置为立方体中心与相机之间距离的中位数。与有界场景相同,我们为主要区域初始化一个具有h_{lv}层的密集网格。对于背景区域,我们分配层背景外壳来包围主要区域,这意味着整个场景的半径是主要区域半径的2h_{out}倍。在每个背景壳层中,我们从最粗的体素大小开始,即每个壳层中有4^3 - 2^3 = 56个体素。然后,我们迭代地对具有最高采样率的壳层体素进行细分,并移除未被任何训练相机观测到的体素。这个过程重复进行,直到背景区域和主要区域的体素数量比为h_{ratio}。初始化后,体素数量eq ^3

3.2.2. 自适应修剪和细分

初始化的网格布局只是粗略地覆盖了整个场景,在训练过程中应根据场景的不同细节层次进行自适应调整。为了实现这一目的,我们每进行h_{every}次训练迭代就会应用以下两种操作。

修剪 我们使用所有训练相机,根据公式(1)计算每个体素的最大混合权重T_i lpha_i。我们移除最大混合权重低于h_{prune}的体素。

细分 我们的启发式方法是,训练损失梯度较大的体素表明该体素区域需要更精细的体素来建模。具体而言,我们按如下方式累积细分优先级:
v_{priority} = um_{r n R} eft lpha dot rac{artial athcal{L}}{artial lpha} ight

其中,R是在h_{every}次迭代中所有训练像素射线的集合,athcal{L}是射线的训练损失。梯度由体素对射线贡献的alpha值加权。v_{priority}越高,表明细分优先级越高。 为了防止体素因过拟合少量像素而过细,我们将最大采样率低于采样率阈值v_{rate} < 2h_{rate}的体素的优先级设为零。最后,我们选择优先级在前h_{percent}的体素进行细分,即体素总数增加百分比。注意,在八叉树布局中我们只保留叶节点,因此一旦源体素被细分,我们就将其移除。 当体素被修剪和细分后,体素的球谐(SH)系数和网格点密度需要相应地更新。SH系数简单地与体素一起修剪,并复制到细分后的子体素中。网格点密度稍微复杂一些,因为相邻体素共享八个体素角网格点(图2)。当一个网格点不属于任何体素角时,我们将其移除。在细分时,我们使用三线性插值来计算新网格点的密度。复制的网格点将被合并,其密度取平均值。

3.2.3. 优化目标

我们使用均方误差(MSE)和结构相似性(SSIM)作为渲染图像和真实图像之间的光度损失。总体训练目标总结如下:
L = L_{mse} + ambda_{ssim}L_{ssim} + ambda_T L_T + ambda_{dist}L_{dist} + ambda_R L_R + ambda_{tv}L_{tv}

其中,ambda是损失权重,L_T促使最终光线透射率为零或一,L_{dist}是畸变损失,L_R是逐点RGB损失,L_{tv}是稀疏密度网格上的总变差损失。在网格提取任务中,我们还添加了来自2DGS的深度 - 法线一致性损失:
L_{mesh} = ambda_{n - dmean}L_{n - dmean} + ambda_{n - dmed}L_{n - dmed}

其中这两个损失都促使从平均和中值深度得到的渲染法线和深度 - 派生法线之间的对齐。更多细节在补充材料中。

3.2.4. 稀疏体素TSDF融合和移动立方体

我们的稀疏体素可以与基于网格的算法无缝集成。为了提取网格,我们采用移动立方体算法[23]从稀疏体素中提取密度等值面的三角形。相邻体素产生的重复顶点将被合并以生成唯一的顶点集。当相邻体素属于不同的八叉树层级时,提取出的三角形可能无法连接,因为不同层级的体素的密度场不连续。这种不连续性可以通过简单地将所有体素细分到最精细层级来消除。 决定用于提取等值面的目标层级对于密度场来说可能很棘手。相反,我们采用稀疏体素TSDF融合[7, 8, 31]来计算稀疏网格点的截断有符号距离值。然后,我们可以使用之前的稀疏体素移动立方体算法直接提取零层级的表面。我们方法的未来扩展可以直接按照NeuS[41]和VoISDF[46]来对有符号距离场进行建模。稀疏体素TSDF融合仍然可以有益于直接从传感器深度初始化我们的稀疏体素表示。

全部评论 (0)

还没有任何评论哟~