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

devtools/2024/10/18 18:23:43/

源码地址

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

核心代码

surface_splatting

def surface_splatting(means3D, scales, quats, colors, opacities, intrins, viewmat, projmat):# Rasterization setupprojmat = torch.zeros(4,4).cuda()projmat[:3,:3] = intrinsprojmat[-1,-2] = 1.0projmat = projmat.T# T 是论文中的 MT, colors, opacities, center, depth, radii = setup(means3D, scales, quats, opacities, colors, viewmat, projmat)# Rasterization# 1. Generate pixelsW, 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.10x = 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_3l = -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) / 2dist2d = (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 = dist3ddepth_acc = (homogeneous(s) * T[None,..., -1]).sum(dim=-1)# 4. accumulate 2D gaussians through alpha blending # Eq.12image, depthmap = alpha_blending_with_gaussians(dist2, colors, opacities, depth_acc, H, W)return image, depthmap, center, radii, dist2

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

相关文章

STM32-OC输出比较和PWM

本内容基于江协科技STM32视频内容,整理而得。 文章目录 1. OC输出比较和PWM1.1 OC输出比较1.2 PWM(脉冲宽度调制)1.3 输出比较通道(高级)1.4 输出比较通道(通用)1.5 输出比较模式1.6 PWM基本结…

14.优化算法之BFS解决FloodFill算法1

0.FloodFill简介 dfs:深度优先遍历(红色) bfs:宽度优先遍历 1.图像渲染 算法原理 class Solution {int[] dx { 0, 0, 1, -1 };int[] dy { 1, -1, 0, 0 };public int[][] floodFill(int[][] image, int sr, int sc, int color)…

【云原生】Prometheus监控Docker指标并接入Grafana

目录 一、前言 二、docker监控概述 2.1 docker常用监控指标 2.2 docker常用监控工具 三、CAdvisor概述 3.1 CAdvisor是什么 3.2 CAdvisor功能特点 3.3 CAdvisor使用场景 四、CAdvisor对接Prometheus与Grafana 4.1 环境准备 4.2 docker部署CAdvisor 4.2.2 docker部署…

python-开关灯(赛氪OJ)

[题目描述] 假设有 N 盏灯(N 为不大于 5000 的正整数),从 1 到到 N 按顺序依次编号,初始时全部处于开启状态;第一个人( 1 号)将灯全部关闭,第二个人( 2 号)将…

Docker Compose 安装以及命令的详细解析

Docker Compose 是一种用于定义和运行多容器Docker应用程序的工具。通过Compose,可以使用YAML文件来配置应用程序所需的所有服务,然后使用单个命令创建并启动所有服务。Docker Compose 提供了一种高效、简洁的方式来管理Docker容器和服务,使得…

使用ref定义响应式数据变量

Ref 使用 Ref 可以方便地创建和管理Vue组件中的响应式数据。例如,如果你有一个计数器组件,你可以使用 Ref 来创建一个响应式的计数器变量,然后在组件内部或外部修改这个变量的值,而不需要手动触发视图更新。 先声明一个变量&…

行业洞察 | 2024应用程序安全领域现状报告

在信息爆炸的时代,我们每天都在使用各种应用,从社交娱乐到工作学习,应用已经成为我们生活中不可或缺的一部分。然而,你是否知道,在这些便捷的背后,隐藏着巨大的安全风险? 近年来,应用…

lua入门(1) - 基本语法

本文参考自: Lua 基本语法 | 菜鸟教程 (runoob.com) 需要更加详细了解的还请参看lua 上方链接 交互式编程 Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用: 如下图: 按…