3DGS中Densification梯度累计策略的改进——绝对梯度策略(Gaussian Opacity Fields)

在学习 StreetGS 代码中发现了其中的 Densification 策略与原 3DGS 不太一样,其是使用的 Gaussian Opacity Fields 中的一个的策略

我们先来回忆一下 3DGS 中一个比较重要 contribution:自适应密度控制

1 自适应密度控制

其具体步骤如下:

  1. 计算 xyz_gradient_accumdenom 的比值,得到每个点的平均梯度 grads

  2. densify_and_clone 克隆:

    image-20240726103511004
    1. 筛选出梯度大于等于阈值的点。再进一步筛选出这些点中尺度小于等于场景范围的点。

    2. 直接复制一个添加即可(xyz不需要改变 —— 之后训练会优化)

  3. densify_and_split 分裂:

    image-20240726103635171
    1. 筛选出梯度大于等于阈值的点。再进一步筛选出这些点中尺度大于等于场景范围的点。
    2. 标准差 stds 复制原来的值,均值 means 设为0(位置在原点)。生成新的 samples。旋转矩阵也是原来的
    3. 计算新的位置 new_xyz:紧挨原本的点
    4. 计算新的缩放 new_scaling:两个点都同时除以1.6使变小
    5. 旋转、SH、不透明度、语义信息都复制即可
    6. 删除中间变量点(缩放前的两个大点)
  4. 修剪低不透明度的点和巨大点

  5. 重置 xyz_gradient_accumdenommax_radii2D

可以看到计算 xyz_gradient_accumdenom 的比值,得到每个点的平均梯度 grads 是 clone 和 split 的第一个指标,其是拿来判断当前点是否拟合的较好的,高于一个阈值就说明当前这个点的梯度太大,拟合较差,需要进行优化,然后进一步判断是否进行 clone / split

2 绝对梯度策略

2.1 原 3DGS 策略

致密化是通过观察某个高斯函数的中心位置在视图空间中的变化梯度来进行的。这个变化梯度是通过分析该高斯对像素的贡献来计算的。

数学上,梯度 dLdx\frac{dL}{d\mathbf{x}}dxdL 对应的是目标函数相对于高斯中心 x\mathbf{x}x 的变化率。为了计算这个梯度,需要对高斯函数影响的所有像素 pi\mathbf{p}_ipi 进行求和。

Mold=∥dLdx∥2=∥∑idLdpi⋅dpidx∥2 M_{old} = \|\frac{dL}{d\mathbf{x}}\|_2 = \|\sum_i \frac{dL}{d\mathbf{p}_i} \cdot \frac{d\mathbf{p}_i}{d\mathbf{x}}\|_2 Mold=dxdL2=idpidLdxdpi2
—— 对应就是mean2D的梯度的前两维的L2范数

其中,pi\mathbf{p}_ipi 是像素,dLdpi\frac{dL}{d\mathbf{p}_i}dpidL 是目标函数对每个像素的梯度,dpidx\frac{d\mathbf{p}_i}{d\mathbf{x}}dxdpi 是像素位置相对于高斯中心位置的梯度。

如果计算出的梯度范数 ∥dLdx∥2\|\frac{dL}{d\mathbf{x}}\|_2dxdL2 超过预设的阈值 τx\tau_{\mathbf{x}}τx,则该高斯函数会被选为致密化的候选对象。这意味着它可能处于一个需要增加更多点来更好描述的区域。

2.2 改进后策略

然而,Gaussian Opacity Fields 中作者发现上述度量并不能有效识别过度模糊的区域。这是因为在某些情况下,不同像素的梯度信号可能会相互抵消,从而导致总的梯度大小较小,尽管该区域的重建质量实际上较差。

为了解决这个问题,作者提出了一种简单的改进方法,即直接累积每个像素梯度的范数,而不是计算总的梯度大小。这种做法可以更好地反映每个像素的重建误差,并避免梯度相互抵消的情况。

改进后的度量方式:

Mnew=∑i∥dLdpi⋅dpidx∥ M_{new} = \sum_i \left\|\frac{dL}{d\mathbf{p}_i} \cdot \frac{d\mathbf{p}_i}{d\mathbf{x}}\right\| Mnew=idpidLdxdpi
—— 对应就是mean2D的梯度的最后一维,各个像素梯度的范数之和(CUDA代码是这样写的)

通过这种修改,新的度量标准 MnewM_{new}Mnew 能更有效地识别出那些存在显著重建误差的区域,从而带来更好的场景重建和视图合成效果。

3 具体实现

这里的第一行就是原 3DGS 的 add_densification_stats 中累计梯度的操作,而第二行就是保存新的度量的操作,即直接保存 mean2D 的梯度的最后一维(CUDA代码中是有实现在最后一维保存各个像素梯度的范数之和)

model.xyz_gradient_accum[visibility_model, 0:1] += torch.norm(viewspace_point_tensor_grad_model[visibility_model, :2], dim=-1, keepdim=True)
model.xyz_gradient_accum[visibility_model, 1:2] += torch.norm(viewspace_point_tensor_grad_model[visibility_model, 2:], dim=-1, keepdim=True)

这样,xyz_gradient_accum 的第一维就是以前的度量 MoldM_{old}Mold ,第二维就是新的度量 MnewM_{new}Mnew

densify_and_prune 中如果用绝对梯度策略就用第二维的 MnewM_{new}Mnew 即可:

if cfg.optim.get('densify_grad_abs_bkgd', False):
    grads = self.xyz_gradient_accum[:, 1:2] / self.denom
else:
    grads = self.xyz_gradient_accum[:, 0:1] / self.denom

在使用绝对梯度策略之后,可以明显看出绝对梯度比原梯度要大,每次 Densification 的点的数量相比较以前也大大增加:

240238CB-BB30-496f-A599-9BA5FEE3C15C 2132333C-1019-4b3e-BE25-75F9BAD9AC7D

如上图可以看到,灰色即启用了绝对梯度策略的 clone 和 split,红线即没有启用的情况,两者差别还是挺大的

03-18
<think>好的,用户的问题是关于如何在3D图形或游戏开发中使用3D高斯散射(3DGS)。我需要先理解3DGS的基本概念和应用场景。根据提供的引用[1],3DGS通过与2D图像的集成,可以通过反向传播训练网络,生成高精度3D模型。这可能涉及到从2D图像生成3D模型的流程,比如NeRF之类的技术。 接下来,用户提到的是游戏开发,所以需要考虑实时渲染的需求。引用[2]中的BrightDreamer框架提到快速文本到3D合成,这可能与游戏中的资源生成有关。需要说明3DGS在游戏中的具体应用,比如角色建模、场景生成等。 然后,要确保回答结构清晰,分点列出技术优势和应用场景。同时,用户可能对性能优化和实际案例感兴趣,所以需要涵盖实时渲染优化、跨领域协作等方面。还要注意生成相关问题,比如技术挑战、与其他技术的比较等。 需要验证引用内容是否准确,引用[1]提到通过渲染图像的反向传播优化3D模型,这适用于训练阶段。而引用[2]的BrightDreamer框架则强调快速生成,这对游戏开发中的快速迭代很重要。因此,在回答中需要结合这两点,说明3DGS如何提升开发效率和模型质量。 最后,确保使用正确的中文表达,技术术语准确,并自然地融入引用标识。检查是否有遗漏的关键点,比如是否提到了工具支持、实际应用案例等,确保回答全面且符合用户需求。</think>### 3D高斯散射(3D Gaussian Splatting, 3DGS)在3D图形与游戏开发中的应用 3D高斯散射(3DGS)是一种基于神经辐射场(NeRF)优化的技术,通过将3D场景表示为可学习的高斯分布集合,结合可微分渲染实现高质量3D重建[^1]。其在游戏和图形开发中的核心优势包括: 1. **实时渲染与高保真度** - 3DGS通过优化高斯分布的参数(如位置、协方差、透明度),支持动态调整细节密度,在保持实时渲染性能(如60 FPS)的同时生成高精度表面。 - 例如,游戏中的开放世界地形可通过稀疏高斯分布实现远距离低细节、近距离高细节的LOD(Level of Detail)优化。 2. **跨模态生成与快速迭代** - 如BrightDreamer框架所示,3DGS可直接从文本描述生成3D模型,通过2D图像监督优化3D高斯参数,大幅缩短游戏角色/场景的设计周期[^2]。 - 代码示例(伪代码): ```python def generate_3d_asset(text_prompt): # 文本编码与3D高斯初始化 latent_code = text_encoder(text_prompt) gaussians = initialize_gaussians(latent_code) # 可微分渲染与优化 rendered_images = differentiable_renderer(gaussians) loss = compare_with_clip(rendered_images, text_prompt) gaussians.backprop(loss) return gaussians.to_mesh() ``` 3. **动态场景支持** - 通过时间域参数扩展,3DGS可建模物理碰撞、角色动作等动态效果。例如,在Unity/Unreal引擎中,可将高斯参数与刚体动力学结合,实现破坏特效的实时生成。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值