学习笔记之——2D Gaussian Splatting(2DGS)

3DGS在辐射场重建中取得了巨大的成就,实现高质量的新视图合成和快速渲染。最近新出了3DGS的升级版本,2DGS。写下本博文记录本人学习及测试2DGS的过程,本博文仅为本人学习记录用~

目录

原理解读

什么是surfels?

2DGS与3DGS的区别

2DGS的理解

2DGS 的Modeling

2DGS的Splatting

2DGS的Rasterization

2DGS的训练及loss

Depth Distortion

Normal Consistency

Final Loss

代码测试

代码解读

参考材料


原理解读

由于3D 高斯在多视角下的不一致性,使得它在surface reconstruction中效果不佳。为此,作者提出用2D平面高斯圆盘(2D oriented planar Gaussian disks)来表征三维单元。2DGS通过采用surfels的表达方式,并使用针对surfels的投影方法较好地保证了多视角一致性。通过ray-splat intersection和 rasterization实现2D高斯的渲染。进一步的,通过在loss中引入depth distortion and normal consistency提高了重建几何的质量,而不能单单只靠RGB的loss。

从motivation来看,应该就是3D高斯难以处理复杂的几何形状下的重建,特别是平面会有比较多的noise(这点之前大量的实验也可观察到,也确实3D高斯球叠加一起的平面肯定有些棱角之类的noise)。对于3D高斯而言,对于相邻高斯球交汇处,不同的视角会有不同的渲染值/深度值(3DGS evaluates a Gaussian’s value at the intersection between a pixel ray and a 3D Gaussian, which leads to inconsistency depth when rendered from different viewpoints.)

而采用2D 高斯,也就是类似于Mesh或者surfels差不多的平面来构建的话,可以交换的拟合复杂的平面。

什么是surfels?

Surfels approximate the object surface locally with shape and shade attributes, and can be derived from known geometry.

Surfels(surface elements)是体积渲染文献中的“表面元素”或“表面体素”。其他人将其描述为零维n元组,其形状和阴影属性局部近似于对象表面。对象可以由一组密集的点(表面)表示,这些点(表面)保存照明信息。

A surfel, that is, a point structure representing Euclidean xyz coordinates, together with normal coordinates, a RGBA color, a radius, a confidence value and the surface curvature estimate.

其表达如下:

基于surfels的方法基本上都需要几何的GT、深度信息或者在光照已知的场景下才能运行。而2DGS将其结合起来。2DGS采用了扁平的基元(2D高斯,oriented elliptical disk)对3D场景进行表示,2DGS的基元辐射场垂直于其法线,使其可以更好地贴合场景表面。

2DGS与3DGS的区别

关于3DGS的原理,此处就不再阐述了,请见博客:学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研_3d gaussian splatting slam-CSDN博客

虽然3DGS取得巨大的成就,但是由于3D 高斯在多视角下的不一致性,使得它在surface reconstruction中效果不佳。而2D高斯则是多视觉一致性强。而2DGS使用2D的圆盘来表示场景,这使得2DGS与3DGS相比能够表达精确的表面几何。3DGS通过像素发出的光线束和3D Gaussian之间的交平面来计算投影到像平面的高斯值,这在不同视点进行渲染时会导致得到不同的depth(因此depth sort的结果也会不连续)。2DGS使用ray-splat来得到准确连续的投影结果,大大提高了几何的质量。如下图所示。对于3DGS而言,不同的视角,其对应的是不同的交互平面(Intersection Plane),但是对于2DGS,都是相同的平面,因此多视角一致性较强~

此外,2D高斯中固有的表面法线使得能够通过法线约束进行直接的重构表面进行正则化,因此相比于传统的surfel-based的方法,2DGS可以从未知几何体中恢复。(2DGS天生具有normal使其可以很自然地使用normal进行监督,并且2DGS可以通过基于梯度的优化方法从未知的几何中进行重建。)

如下图所示,2DGS所构建的平面光滑一些~

下图放大一些细节就更明显了~

虽然效果比较不错,但是2DGS是通过不透明度来判断场景的表面,对于诸如玻璃一类半透明的物体会遇到较大困难。其次,2DGS的densification策略使其主要集中在纹理较丰富区域,对于弱纹理区域表示较差。<

### 2D 高斯点绘制技术解释与实现 #### 解释 高斯点绘制(Gaussian Splatting)是一种用于高效渲染和处理三维数据的技术,在二维空间中的应用同样具有重要意义。通过将3D场景中的物体建模成若干个带有位置、方向以及大小参数的高斯分布,可以有效地简化复杂几何结构并加速计算过程。 具体来说,当涉及到2D高斯点绘制时,主要目标是从不同视角对一组定义好的3D高斯体素进行投影,并最终形成对应的图像表示形式[^1]。此过程中会经历如下几个重要环节: - **创建高斯模型集合**:初始化一系列代表特定对象特征的多维正态分布函数; - **多角度渲染**:基于预设相机路径或随机选取的位置,模拟光线穿过这些分布后的效果; - **获取分割掩膜**:利用先进的计算机视觉算法分析所得画面,识别出各个部分所属类别并标记出来[^2]。 #### 实现示例 下面给出一段Python代码片段作为概念验证,展示了如何构建简单的2D高斯点绘制流程。请注意这只是一个基础版本,实际应用场景下可能还需要考虑更多因素如光照条件等影响因子。 ```python import numpy as np from scipy.stats import multivariate_normal import matplotlib.pyplot as plt def create_gaussians(num_points=50): """Generate random Gaussian distributions.""" means = [] covariances = [] for _ in range(num_points): mean_x, mean_y = np.random.uniform(-10, 10), np.random.uniform(-10, 10) var_x, var_y = abs(np.random.normal()), abs(np.random.normal()) means.append([mean_x, mean_y]) covariances.append([[var_x, 0], [0, var_y]]) return means, covariances def render_2d_splatting(means, covs, resolution=(200, 200)): """Render 2D splatting image from given Gaussians.""" x, y = np.mgrid[-15:15:.1, -15:15:.1] pos = np.dstack((x, y)) img = np.zeros(resolution) for mu, sigma in zip(means, covs): rv = multivariate_normal(mu, sigma) z = rv.pdf(pos) img += z.reshape(*resolution) return img / max(img.flatten()) * 255. means, covs = create_gaussians() image_data = render_2d_splatting(means, covs) plt.imshow(image_data, cmap=&#39;gray&#39;) plt.show() ``` 这段程序首先生成了一些随机分布的均值向量`means`及其协方差矩阵`covs`来描述不同的高斯组件。接着调用了`render_2d_splatting()`方法完成具体的渲染工作——它接受上述两个列表以及其他可选参数(比如分辨率),返回一张由所有输入高斯叠加而成的结果图片。最后借助Matplotlib库展示该合成图形。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值