Surface splatting (2D Gaussian splatting)代码分析

源码地址

colab.research.google.com/drive/1qoclD7HJ3-o0O1R8cvV3PxLhoDCMsH8W

核心代码

surface_splatting

def surface_splatting(means3D, scales, quats, colors, opacities, intrins, viewmat, projmat):
    # Rasterization setup
    projmat = torch.zeros(4,4).cuda()
    projmat[:3,:3] = intrins
    projmat[-1,-2] = 1.0
    projmat = projmat.T
    # T 是论文中的 M
    T, colors, opacities, center, depth, radii = setup(means3D, scales, quats, opacities, colors, viewmat, projmat)

    # Rasterization
    # 1. Generate pixels
    W, H = (intrins[0,-1] * 2).long(), (intrins[1,-1] * 2).long()
    W, H = W.item(), H.item()
    pix = torch.stack(torch.meshgrid(torch.arange(W),
        torch.arange(H), indexing='xy'), dim=-1).to('cuda')

    # 2. Compute ray splat intersection # Eq.9 and Eq.10
    x = pix.reshape(-1,1,2)[..., :1]
    y = pix.reshape(-1,1,2)[..., 1:]
    k = -T[None][..., 0] + x * T[None][..., 3] # 这个是 h_u, 因为公式8 h_u = ⊤ · h_x = ⊤ · (−1, 0, 0, 𝑥) = -T_0 + x · T_3
    l = -T[None][..., 1] + y * T[None][..., 3] # 这个是 h_v
    # 因为论文中 h_u 和 (𝑢, 𝑣, 1, 1) 点成为0, h_v 和 (𝑢, 𝑣, 1, 1) 点成为0
    # 所以 h_u 和 h_v  与 (𝑢, 𝑣, 1, 1) 垂直
    # h_u 和 h_v 的 叉乘是 (𝑢, 𝑣, 1, 1)
    points = torch.cross(k, l, dim=-1) # 叉乘
    s = points[..., :2] / points[..., -1:]

    # 3. add low pass filter # Eq. 11
    # when a point (2D Gaussian) viewed from a far distance or from a slended angle
    # the 2D Gaussian will falls between pixels and no fragment is used to rasterize the Gaussian
    # so we should add a low pass filter to handle such aliasing.
    dist3d = (s * s).sum(dim=-1)
    filtersze = np.sqrt(2) / 2
    dist2d = (1/filtersze)**2 * (torch.cat([x,y], dim=-1) - center[None,:,:2]).norm(dim=-1)**2
    # min of dist2 is equal to max of Gaussian exp(-0.5 * dist2)
    dist2 = torch.min(dist3d, dist2d)
    # dist2 = dist3d
    depth_acc = (homogeneous(s) * T[None,..., -1]).sum(dim=-1)

    # 4. accumulate 2D gaussians through alpha blending # Eq.12
    image, depthmap = alpha_blending_with_gaussians(dist2, colors, opacities, depth_acc, H, W)
    return image, depthmap, center, radii, dist2
### 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='gray') plt.show() ``` 这段程序首先生成了一些随机分布的均值向量`means`及其协方差矩阵`covs`来描述不同的高斯组件。接着调用了`render_2d_splatting()`方法完成具体的渲染工作——它接受上述两个列表以及其他可选参数(比如分辨率),返回一张由所有输入高斯叠加而成的结果图片。最后借助Matplotlib库展示该合成图形。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值