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

devtools/2024/10/8 15:05:00/

在学习 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 绝对梯度策略

3DGS__39">2.1 原 3DGS 策略

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

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

M o l d = ∥ d L d x ∥ 2 = ∥ ∑ i d L d p i ⋅ d p i d x ∥ 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范数

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

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

2.2 改进后策略

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

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

改进后的度量方式:

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

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

3 具体实现

这里的第一行就是原 3DGSadd_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 的第一维就是以前的度量 M o l d M_{old} Mold ,第二维就是新的度量 M n e w M_{new} Mnew

densify_and_prune 中如果用绝对梯度策略就用第二维的 M n e w M_{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,红线即没有启用的情况,两者差别还是挺大的


http://www.ppmy.cn/devtools/122394.html

相关文章

CUDA cooperative_groups grid_group测试

CUDA cooperative_groups grid_group测试 一.测试描述及小结1.任务描述2.输出3.小结 二.复现步骤三.grid_group.sync 代码对照1.CUDA C2.PTX3.SASS CUDA Cooperative Groups是CUDA编程模型中引入的一组高级特性,提供了更灵活的线程组织和同步机制 通过Cooperative G…

C 语言入门指南:致大一新生

亲爱的大一新生们: 当你踏入大学的校门,开启全新的学习之旅时,C 语言或许会成为你在计算机世界中探索的重要起点。C 语言作为一种广泛应用且基础的编程语言,掌握它将为你打开编程世界的大门。 一、认识 C 语言 C 语言是一种结构化…

一个简单的SQL面试题

最近面试遇到一个SQL题,复述如下: SQL面试题 现在有两张表,结构如下: 学生表(student) 学号sid姓名name1张三2李四3王五 成绩表(score) 序号id学号sid科目subject分数score11语…

【优选算法】(第十一篇)

目录 ⼭峰数组的峰顶(easy) 题目解析 讲解算法原理 编写代码 寻找峰值(medium) 题目解析 讲解算法原理 编写代码 ⼭峰数组的峰顶(easy) 题目解析 1.题目链接:. - 力扣(Leet…

【CSS Tricks】试试新思路去处理文本超出情况

目录 引言一、常规套路1. 单行文本省略2. 多行文本省略 二、新思路美化一下1. 单行/多行文本隐藏2. 看下效果 三、总结 引言 本篇为css的一个小技巧 文本溢出问题是一个较为常见的场景。UI设计稿为了整体的美观度会将文本内容限制到一定范围内,然而UI设计阶段并不能…

GPT带我学-设计模式16-原型模式

概述 原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过类的构造函数。这个模式特别适用于对象创建开销较大或者对象需要频繁被创建和销毁的场景。 主要组成部分: 原型接口:声明一个克隆自身的方法。…

项目定位与服务器(SERVER)模块划分

目录 定位 HTTP协议以及HTTP服务器 高并发服务器 单Reactor单线程 单Reactor多线程 多Reactor多线程 模块划分 SERVER模块划分 Buffer 模块 Socket模块 Channel 模块 Connection模块 Acceptor模块 TimerQueue模块 Poller模块 EventLoop模块 TcpServer模块 SE…

Windows11系统下Docker环境搭建教程

目录 前言Docker简介安装docker总结 前言 本文为博主在项目环境搭建时记录的Docker安装流程,希望对大家能够有所帮助,不足之处欢迎批评指正🤝🤝🤝 Docker简介 Docker 就像一个“容器”平台,可以帮你把应用…