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.0?opacities[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.pswp.cn/diannao/43873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43873.shtml
英文地址,請注明出處:http://en.pswp.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…