Splatstudio 学习笔记

1. 3DGS 是全图的Render, 因此特地写了 full_images_datamanger.py 每个step 取出一张图像。

返回值是一张 全图的 RGB 和对应的 Camera

2. 3D GS 没有生成光线,因此 不需要指定near 和 far,即 collider是None。 但需要对3D 高斯球进行初始化:

  1. 高斯球的means (中心点的初始化): 输入点云的 坐标当作是 高斯球的中心点:
 means = torch.nn.Parameter(self.seed_points[0])  # (Location, Color)
  1. 高斯球的scale初始化, 使用KNN 算法计算每一个 点云到 最近3个点之间的 距离 distance, 对这个距离求解平均距离,以这个 ave_distance 的 log 对数的结果 当作是 scale 的初始化:
distances, _ = self.k_nearest_sklearn(means.data, 3)
distances = torch.from_numpy(distances)
# find the average of the three nearest neighbors for each point and use that as the scale
avg_dist = distances.mean(dim=-1, keepdim=True)
scales = torch.nn.Parameter(torch.log(avg_dist.repeat(1, 3)))
  1. 旋转四元数的初始化,随机初始化:
quats = torch.nn.Parameter(random_quat_tensor(num_points))
  1. opacity的初始化,随机给定一个固定数值从 0.1 初始化:
opacities = torch.nn.Parameter(torch.logit(0.1 * torch.ones(num_points, 1)))
  1. color 的SH 参数的初始化,从点云的 RGB 直接转化为 SH 系数:
if self.config.sh_degree > 0:shs[:, 0, :3] = RGB2SH(self.seed_points[1] / 255) ## RGB 转化成第0阶的 SH 系数shs[:, 1:, 3:] = 0.0
else:CONSOLE.log("use color only optimization with sigmoid activation")shs[:, 0, :3] = torch.logit(self.seed_points[1] / 255, eps=1e-10)
features_dc = torch.nn.Parameter(shs[:, 0, :])
features_rest = torch.nn.Parameter(shs[:, 1:, :])

SH 的稀疏的 shape 标准是(N,16,3); 3 代表3个通道, N 代表 N个点,16 代表阶数。

第0 阶的参数直接由RGB 转换而来; 之后都是设置为0 进行初始化。 对应的优化参数是:

features_dc = torch.nn.Parameter(shs[:, 0, :]) ## 【N,3】
features_rest = torch.nn.Parameter(shs[:, 1:, :]) ## 【N,15,3】

3. 3D GS 的属性:

 self.gauss_params = torch.nn.ParameterDict({"means": means,  ## Location"scales": scales, ## 缩放因子"quats": quats,   ## 旋转的四元数"features_dc": features_dc,"features_rest": features_rest,"opacities": opacities, ## 不透明度})

这行使用 torch 的 ParameterDict 的 代码相当于 直接使用:

self.means = means;
self.scales = scales;

3.1 首先对于整张 图像进行 DownScale 4 倍:

对图像进行4倍降采样,并修改对应的内参
camera_downscale = self._get_downscale_factor() ## 4
camera.rescale_output_resolution(1 / camera_downscale)

3.2 修改 Camera 的坐标,将其从 nerfstudio 的坐标 旋转 到 opencv 的坐标。 也就是 [-1,-1,1] 的矩阵

 # shift the camera to center of scene looking at center
R = camera.camera_to_worlds[0, :3, :3]  # 3 x 3
T = camera.camera_to_worlds[0, :3, 3:4]  # 3 x 1
# flip the z and y axes to align with gsplat conventions
R_edit = torch.diag(torch.tensor([1, -1, -1], device=self.device, dtype=R.dtype))
R = R @ R_edit
# analytic matrix inverse to get world2camera matrix
R_inv = R.T
T_inv = -R_inv @ T
viewmat = torch.eye(4, device=R.device, dtype=R.dtype)
viewmat[:3, :3] = R_inv
viewmat[:3, 3:4] = T_inv

3.3 在CUDA 中 对3D Gaussian 进行投影:

  1. 投影的椭圆近似成一个圆, 保存圆的半径 和中心点的xyz 坐标即可
    当一个 Gaussian 投影成一个圆之后,那么他的半径 和 椭圆的 标准差是密切相关的:
    在这里插入图片描述
    给定二维高斯分布的协方差矩阵 Σ \Sigma Σ ,通过计算该矩阵的特征值并取其平方根,我们可以得到分布的“半径”,协方差的特征值可以认为是 椭圆的两个方向的半径。求解 下面的方程即可:
    在这里插入图片描述
    可以进一步的展开:
    ( a − λ ) ( c − λ ) − b 2 = 0 (a-\lambda)(c-\lambda)-b^2=0 (aλ)(cλ)b2=0

圆的圆心,可以直接通过 3D Gaussian 的中心点 Center 投影得到。

  1. 计算覆盖的像素
    快速的方法,将图像分成 16*16 的tile; 计算每一个 Tile 和圆的 相交区域。
    在这里插入图片描述
    3.对每一个高斯按照深度顺序进行排序
    一个Tile 可能会有很多个 Gaussian 进行覆盖, CUDA 程序会根据每一个 Tile 会对其覆盖的 Gaussian 进行深度排序
    在这里插入图片描述

  2. 计算每一个像素的颜色
    每一个 Tile 对应着 一个block; 而每一个Pixel 对应着一个 thread。
    计算 每一个像素到2D 投影圆的距离,并且依据 高斯分布 求解出 opacity 的大小。

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

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

相关文章

Django检测到会话cookie中缺少HttpOnly属性手工复现

一、漏洞复现 会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本等)获取到用户的cookie信息,造成用户cookie信息泄露,增加攻击者的跨站脚本攻击威胁。 第一步:复制URL:http://192.168.43.219在浏览器打开,…

【Linux C | 多线程编程】线程同步 | 互斥量

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 本文未经允许…

k8snode节点kubeadm join主节点失败,请问你们有什么好的办法吗?

K8S版本:1.20.9,docker也是1.20的 在网上找了,说是关闭交换区swap,这个也关了,防火墙也关了,现在kubelet无法启动,网上查了只有kubeadm init后kubelet才能启动,而init后10250端口会…

货物摆放-C++题解

计算本题前先了解一下约数 约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数 然后首先要求出n的所有因数,因为题目需要满足的条件是nLWH…

云南省气象探空业务升级为北斗探空观测系统

云南省气象探空业务升级为北斗探空观测系统 近日,云南省首套北斗探空观测系统在普洱市思茅区高空气象观测站建成并调试成功,这意味着云南省气象探空业务将从L波段雷达探测升级到北斗探空观测系统。 (图片来源于网络) 北斗探空观…

SpringCloud学习(12)-SpringCloudAlibaba-Sentinel

Sentinel介绍 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 官网 home | Sentinel 下载…

k8s部署efk

环境简介: kubernetes: v1.22.2 helm: v3.12.0 elasticsearch: 8.8.0 chart包:19.10.0 fluentd: 1.16.2 chart包: 5.9.4 kibana: 8.2.2 chart包:10.1.9 整体架构图: 一、Elasticsearch安装…

实体类转换视图类,转换器

1、以前我都是直接用spring提供的:BeanUtils.copyProperties(entuty, vo1);方法去转换。 2、后面又学到了转换hutool工具类的转换方法。 3、现在又学了一个利用mapstruct框架转换。 package com.jsrDom.controller;import cn.hutool.core.bean.BeanUtil; import c…

【php开发支付宝web支付】

首先介绍下 我用的框架ci 在吐槽下百度的其他人的写的都很垃圾,还不如自己看支付宝的开发手册了 1、composer安装支付宝的sdk composer require alipay/alipay-sdk-php安装完毕 不多哔哔 代码展示 先点地址登录支付宝以后再上我这重点下 支付宝沙箱地址 $ord…

算法中的二阶差分

众所周知,在往区间的每一个数都加上一个相同的数k,进行n次后会得到一个新的数列,如果每次加都循环区间挨个数加上k,这样时间复杂度无疑是O(n^2),很高。这时可以采用一阶差分就可解决,这里默认会一阶差分&am…

01 _ 分布式缘何而起:从单兵,到游击队,到集团军

这里先来聊聊什么是分布式。 与其直接用些抽象、晦涩的技术名词去给分布式下一个定义,还不如从理解分布式的发展驱动因素开始,我们一起去探寻它的本质,自然而然地也就清楚它的定义了。 这里将介绍分布式的起源,是如何从单台计算…

【考研数学】张宇《1000题》刷不动,做不下来怎么办❓

学长肯定是用着效果不错才给你推荐的,但是习题册有很多,各自有不同的风格,1000题适不适合你的情况是你要考虑的点。 选书还是要结合自身的情况,如果当前用着不错的话,继续完全没有问题,核心就是要从自身的…