gsplat中的3D Gaussian Splatting as Markov Chain Monte Carlo的代码解读

总体

https://github.com/nerfstudio-project/gsplat

simple_trainer_mcmc.py

2个关键点:

  1. 高斯状态转移(每100iter调用)
  2. 高斯随机过程(每1iter调用)

relocate_gs

  • 对 alive gs 进行采样,被采样的 alive gs 将作为 dead gs 的转移目标。
  • 对被采样的 alive gs 进行状态更新,opacities和scales属性会重新计算。
  • 对 dead gs 进行状态转移。

add_new_gs

  • 对 all gs 进行采样
  • 被采样的 gs 进行状态更新,opacities和scales属性会重新计算
  • 再把被采样的 gs 作为 copy,添加到所有 gs 中。

add_noise_to_gs

  • 根据 学习率 和 opacities 控制噪声的大小
  • 根据 quats 和 scales 控制噪声的分布
  • 得到 delt_xyz 噪声
  • 添加到 gs 的 xyz 属性上

代码AI解读

relocate_gs

(add_new_gs 类似)

    @torch.no_grad()def relocate_gs(self, min_opacity: float = 0.005) -> int:dead_mask = torch.sigmoid(self.splats["opacities"]) <= min_opacitydead_indices = dead_mask.nonzero(as_tuple=True)[0]alive_indices = (~dead_mask).nonzero(as_tuple=True)[0]num_gs = len(dead_indices)if num_gs <= 0:return num_gs# Sample for new GSseps = torch.finfo(torch.float32).epsprobs = torch.sigmoid(self.splats["opacities"])[alive_indices]probs = probs / (probs.sum() + eps)sampled_idxs = torch.multinomial(probs, num_gs, replacement=True) # 进行多项式采样,num_gs 是要重新定位的粒子数量,replacement=True 表示允许重复采样。sampled_idxs = alive_indices[sampled_idxs]new_opacities, new_scales = compute_relocation(opacities=torch.sigmoid(self.splats["opacities"])[sampled_idxs],scales=torch.exp(self.splats["scales"])[sampled_idxs],ratios=torch.bincount(sampled_idxs)[sampled_idxs] + 1, # torch.bincount: 这个函数计算输入张量中每个整数值的出现次数。对于 sampled_idxs,torch.bincount 的输出将是一个包含每个索引出现次数的张量。例如,对于 sampled_idxs = [2, 1, 2, 3, 1],torch.bincount(sampled_idxs) 的输出将是 [0, 2, 2, 1]。这里,0 表示索引 0 没有出现,2 表示索引 1 出现了两次,2 表示索引 2 出现了两次,1 表示索引 3 出现了一次。)new_opacities = torch.clamp(new_opacities, max=1.0 - eps, min=min_opacity)self.splats["opacities"][sampled_idxs] = torch.logit(new_opacities)self.splats["scales"][sampled_idxs] = torch.log(new_scales)# Update splats and optimizersfor k in self.splats.keys():self.splats[k][dead_indices] = self.splats[k][sampled_idxs]for optimizer in self.optimizers:for i, param_group in enumerate(optimizer.param_groups):p = param_group["params"][0]name = param_group["name"]p_state = optimizer.state[p]del optimizer.state[p]for key in p_state.keys():if key != "step":p_state[key][sampled_idxs] = 0p_new = torch.nn.Parameter(self.splats[name])optimizer.param_groups[i]["params"] = [p_new]optimizer.state[p_new] = p_stateself.splats[name] = p_newtorch.cuda.empty_cache()return num_gs

compute_relocation

// Equation (9) in "3D Gaussian Splatting as Markov Chain Monte Carlo"
__global__ void compute_relocation_kernel(int N, float *opacities, float *scales,int *ratios, float *binoms, int n_max,float *new_opacities, float *new_scales) {int idx = threadIdx.x + blockIdx.x * blockDim.x;if (idx >= N)return;int n_idx = ratios[idx];float denom_sum = 0.0f;// compute new opacitynew_opacities[idx] = 1.0f - powf(1.0f - opacities[idx], 1.0f / n_idx);// compute new scalefor (int i = 1; i <= n_idx; ++i) {for (int k = 0; k <= (i - 1); ++k) {float bin_coeff = binoms[(i - 1) * n_max + k];float term = (pow(-1.0f, k) / sqrt(static_cast<float>(k + 1))) *pow(new_opacities[idx], k + 1);denom_sum += (bin_coeff * term);}}float coeff = (opacities[idx] / denom_sum);for (int i = 0; i < 3; ++i)new_scales[idx * 3 + i] = coeff * scales[idx * 3 + i];
}
  1. 计算新的透明度(Opacity)

    • 使用公式 new_opacities[idx]=1.0−(1.0−opacities[idx])1.0/n_idx\text{new\_opacities}[idx] = 1.0 - (1.0 - \text{opacities}[idx])^{1.0 / n\_idx}new_opacities[idx]=1.0(1.0opacities[idx])1.0/n_idx 来计算新的透明度。这个公式是基于论文中的公式 (9) 推导出来的。

  2. 计算新的尺度(Scale)

    • 通过一个嵌套的循环来计算新的尺度。这个过程涉及到二项式系数(binoms)和一些数学运算,包括幂运算和平方根运算。

    • 具体来说,内核函数计算了一个系数 coeff,然后用这个系数来调整原始的尺度值,得到新的尺度值。

add_noise_to_gs

    @torch.no_grad()def add_noise_to_gs(self, last_lr):opacities = torch.sigmoid(self.splats["opacities"])scales = torch.exp(self.splats["scales"])actual_covariance, _ = quat_scale_to_covar_preci(self.splats["quats"],scales,compute_covar=True,compute_preci=False,triu=False,)def op_sigmoid(x, k=100, x0=0.995):return 1 / (1 + torch.exp(-k * (x - x0)))noise = (torch.randn_like(self.splats["means3d"])* (op_sigmoid(1 - opacities)).unsqueeze(-1)* cfg.noise_lr* last_lr)noise = torch.bmm(actual_covariance, noise.unsqueeze(-1)).squeeze(-1)self.splats["means3d"].add_(noise) # 只改变xyz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/43873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开ps提示dll文件丢失如何解决?教你几种靠谱的方法

在日常使用电脑过程中&#xff0c;由于不当操作&#xff0c;dll文件丢失是一种常见现象。当dll文件丢失时&#xff0c;程序将无法正常运行&#xff0c;比如ps&#xff0c;pr等待软件。此时&#xff0c;我们需要对其进行修复以恢复其功能&#xff0c;下面我们一起来了解一下出现…

【堆 (优先队列) 扫描线】218. 天际线问题

本文涉及知识点 堆 &#xff08;优先队列) 扫描线 LeetCode218. 天际线问题 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示&…

景芯SoC训练营DFT debug

景芯训练营VIP学员在实践课上遇到个DFT C1 violation&#xff0c;导致check_design_rule无法通过&#xff0c;具体报错如下&#xff1a; 遇到这个问题第一反映一定是确认时钟&#xff0c;于是小编让学员去排查add_clock是否指定了时钟&#xff0c;指定的时钟位置是否正确。 景芯…

C语言文件操作-文件IO(系统调用)

文件IO (系统调用) 文件描述符open函数read函数write函数lseek函数close函数dup函数dup2函数 stat函数getpwuid函数getgrgid函数 实例 目录操作 opendir函数readdir函数rewinddir函数closedir函数实例 文件IO (系统调用) 文件IO就是系统调用&#xff0c;用户空间进入内核空间…

2024年信息系统项目管理师1批次上午客观题参考答案及解析(3)

51、探索各种选项&#xff0c;权衡包括时间与成本、质量与成本、风险与进度、进度与质量等多种因素&#xff0c;在整个过程中&#xff0c;舍弃无效或次优的替代方案&#xff0c;这种不确定性应对方法是()。 A&#xff0e;集合设计 B&#xff0e;坚韧性 C&#xff0e;多种结果…

离线运行Llama3:本地部署终极指南_liama2 本地部署

4月18日&#xff0c;Meta在官方博客官宣了Llama3&#xff0c;标志着人工智能领域迈向了一个重要的飞跃。经过笔者的个人体验&#xff0c;Llama3 8B效果已经超越GPT-3.5&#xff0c;最为重要的是&#xff0c;Llama3是开源的&#xff0c;我们可以自己部署&#xff01; 本文和大家…

衡量股票价值的尺度

劳伦女士说&#xff0c;“邓普顿猎取便宜股的时候&#xff0c;总是运用证券分析师的‘一百种价值衡量尺度’中的好几种。 原因之一呢&#xff0c;就是因为任何一种衡量方法都是万能的&#xff0c;在不同的时期、不同的市场环境下&#xff0c;总会有它自己的局限性。就像有朋友…

大数据------JavaWeb------FilterListenerAJAXAxiosJSON

Filter Filter简介 定义&#xff1a;Filter表示过滤器&#xff0c;是JavaWeb三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一。 作用&#xff1a;它可把对资源&#xff08;Servlet、JSP、Html&#xff09;的请求拦截下来从而实现一些特殊功能 过滤器一般完成…

【QT中实现摄像头播放、以及视频录制】

学习分享 1、效果图2、camerathread.h3、camerathread.cpp4、mainwindow.h5、mainwindow.cpp6、main.cpp 1、效果图 2、camerathread.h #ifndef CAMERATHREAD_H #define CAMERATHREAD_H#include <QObject> #include <QThread> #include <QDebug> #include &…

SAP顾问的核心竞争力是什么?

最近看到几个业内大佬在讨论这个话题&#xff0c;我也想谈谈我的看法。这位大佬的原话是“SAP顾问的核心技能不是配置软件&#xff0c;而是对财务、供应链、销售等运行流程的理解&#xff0c;解决的是企业流程和数据标准化的问题。” 我先不做评价&#xff0c;我先问几个问题。…

选择排序(C语言版)

选择排序是一种简单直观的排序算法 算法实现 首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列的末尾。 重复第二步&…

【k8s安装redis】k8s安装单机版redis实现高性能高可用

文章目录 简介一.条件及环境说明&#xff1a;二.需求说明&#xff1a;三.实现原理及说明四.详细步骤4.1.创建configmap 配置文件4.2.创建StatefulSet 配置4.3.创建service headless 配置 五.安装说明 简介 本文将根据在k8s环境中搭建【伪】单机模式的redis实例。由于共享存储的…

020-GeoGebra中级篇-几何对象之点与向量

本文概述了在GeoGebra中如何使用笛卡尔或极坐标系输入点和向量。用户可以通过指令栏输入数字和角度&#xff0c;使用工具或指令创建点和向量。在笛卡尔坐标系中&#xff0c;示例如“P(1,0)”&#xff1b;在极坐标系中&#xff0c;示例如“P(1;0)”或“v(5;90)”。文章还介绍了点…

深入理解循环神经网络(RNN)

深入理解循环神经网络&#xff08;RNN&#xff09; 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类专门处理序列数据的神经网络&#xff0c;广泛应用于自然语言处理、时间序列预测、语音识别等领域。本文将详细解释RNN的基本结构、工作原理以及其优…

uniapp本地打包到Android Studio生成APK文件

&#xff08;1&#xff09;安装 Android Studio 软件&#xff1b; 下载地址&#xff1a;官方下载地址&#xff0c;英文环境 安装&#xff1a;如下之外&#xff0c;其他一键 next &#xff08;2&#xff09;配置java环境&#xff1b; 下载&#xff1a;j…

基于SpringBoot构造超简易QQ邮件服务发送 第二版

目录 追加 邮箱附件 添加依赖 编码 测试 第二版的更新点是追加了 邮箱附件功能 ( 后期追加定时任务 ) 基于SpringBoot构造超简易QQ邮件服务发送(分离-图解-新手) 第一版 追加 邮箱附件 添加依赖 <!-- 电子邮件 --><dependency><groupId>org.spri…

Java小白入门到实战应用教程-介绍篇

writer:eleven 介绍 编程语言介绍 编程语言按照抽象层次和硬件交互的方式划分为低级编程语言和高级编程语言。 低级编程语言更接近计算机硬件层面&#xff0c;通常具有执行效率高的特点&#xff0c;但是由于注重计算机底层交互&#xff0c;所以编程难度相对较大。 高级编程…

国内开源RAG知识库ChatWiki MaxKb QAnyThing对比

RAG 知识库 &#xff0c; 是一个比较火的赛道&#xff0c;以下是国内开源的RAG 知识库 ChatWiki 芝麻小客服开源的一个RAG 知识库&#xff0c;核心特点是和人工聊天系统打通&#xff0c;可以作为对外的聊天系统使用。 开源地址 https://github.com/zhimaAi/chatwiki 云端体…

如何评价Flutter?

哈喽&#xff0c;我是老刘 我们团队使用Flutter已经快6年了。 有很多人问过我们对Flutter的评价。 今天在这里回顾一下6年前选择Flutter时的原因&#xff0c;以及Flutter在这几年中的实际表现如何。 选择Flutter时的判断 1、性能 最开始吸引我们的就是其优秀的性能。 特别是…

【vue3|第16期】初探Vue-Router与现代网页路由

日期:2024年7月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…