首页 > 编程语言 >渲染 | Gaussian Splatting 源码解析

渲染 | Gaussian Splatting 源码解析

时间:2024-04-23 16:56:45浏览次数:66  
标签:GS Splatting Python chunk Gaussian iter 地址 源码 CUDA

TODO: GS 组成

  • point cloud
  • render flow
  • optimize

仓库结构

仓库由 C++/CUDA 和 Python 组成,CUDA 包括 diff-rasterization ,Python 包括 optimize 。CUDA 部分依赖 glm ,只用了 glm 的 vector 数据类型。

Rendering (C++/CUDA Part)

Python-CUDA 接口

CUDA 向 Python 暴露的就三个方法,rasterize_gaussians , rasterize_gaussians_backwardmark_visible 。 Python 再包装上 torch.autograd.Function ,最后以 GaussianRasterizerGaussianRasterizationSettings 这俩个接口。

Python 和 CUDA 映射如下:

PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
  m.def("rasterize_gaussians", &RasterizeGaussiansCUDA);
  m.def("rasterize_gaussians_backward", &RasterizeGaussiansBackwardCUDA);
  m.def("mark_visible", &markVisible);
}

Frustum Culling

相关定义主要在 cuda_rasterizer/auxiliary.h in_frustum()

做俩次变换投影到 ImageSpace,比较深度(z 坐标),这里的 z 值是到相机原点平面的深度,在屏幕平面后的点舍弃(z<0.2)。

函数中注释了对 x 和 y 方向的判断,因为 Gaussian Splatting 严格是无限大,和传统 culling Frustum 不太一样。 需要通过置信度阈值来筛选置信度,不能简单地通过投影后的二维距离来判断。

不过 mark visible 似乎根本就没有调用?

Chunk Management

相关定义主要在 cuda_rasterizer\rasterizer_impl.h

把内存按切分成一个个 chunk(内存块),每个 chunk的第一个地址是起始地址,起始地址都是对齐的。比如按 16 字节切分,起始地址就是 0x00, 0x10, 0x20 ... ;0x00~0x0F ,0x10~0x1F ,0x20~0x2F 是切好的一个个 chunk,chunk 也可以用起始地址标识。

下面方法先获取指针所指位置 chunk(起始地址/对齐地址),再在起始地址上偏移相应元素得到新地址,是一个多对一的函数映射。

static void obtain(char*& chunk, T*& ptr, std::size_t count, std::size_t alignment)
{
    std::size_t offset = (reinterpret_cast<std::uintptr_t>(chunk) + alignment - 1) & ~(alignment - 1);
    ptr = reinterpret_cast<T*>(offset);
    chunk = reinterpret_cast<char*>(ptr + count);
}

diff GS Chunk 内管理着三种 buffer 数据 :GeometryState, ImageState, BinningState,都以 128 字节作为 chunk size 切割分块。

  • GeometryState 点云的基本信息,位置(means2D)、协方差(cov)、颜色(rgb)、透明度(conic_opacity)等(这个似乎是投影过后的)
  • ImageState 渲染到图像上的数据,主要是存储渲染过程中的 partial sum
  • BinningState 用来管理点云列表排序

通过 fromChunk() 从统一的 chunk 获取对应的 strut 实例。

Forward

Gaussian Splatting 表示

类似 NeRF,GS 的 color 是 view-denpendence 的,和观察的视角有关。也就是一个视角到 Color 的函数映射。NeRF 使用神经网络表示该函数;GS 是 pure explict 结构,采用球谐函数表示。

preprocess

TODO

Optimize (Python Part)

相关定义主要在 train.py

  • Densification
    • Split
    • Clone
  • Opacity Reset

默认训练超参数如下:

Params Value
iterations 30k
densify_until_iter 15k
densify_from_iter 0.5k
densification_interval 0.1k
opacity_reset_interval 3k

分阶段优化方案

  • 0 只优化 GS 的参数
  • desinify_until_iter ~ densify_until_iter,优化 GS 的参数和数量
    • 每 densification_interval 优化数量
    • 每 opacity_reset_interval 重置透明度上限(如果开启 white background 则每 iter 都会重置透明度上限)
  • densify_until_iter ~ iterations,只优化 GS 的参数

Split & Clone

TODO

Reset Opacity

相关文件 scene\gaussian_model.py reset_opacity()

将 Opacity clamp 到 \((-\infty, 0.01)\)

标签:GS,Splatting,Python,chunk,Gaussian,iter,地址,源码,CUDA
From: https://www.cnblogs.com/devil-sx/p/18153221

相关文章

  • 【Lua】源码编译
    1、准备工作1、下载lua源码在Lua官网下载指定版本的Lua源码。2、下载依赖库readline、ncurses在readline官网下载readline源码;在ncurses官网下载ncurses源码。2、编译readline将readline源码放到环境上并解压。执行以下命令安装./configuremakemakeinstall3、编译ncu......
  • Spring 源码阅读(二)IoC 容器初始化以及 BeanFactory 创建和 BeanDefinition 加载过程
    相关代码提交记录:https://github.com/linweiwang/spring-framework-5.3.33IoC容器三种启动方式XMLJavaSE:ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml")ApplicationContextcontext=newFileSystemXmlApplicationContext("C:/beans......
  • Next-Auth 源码解析
    Next-Auth源码解析简单介绍一下Next-Auth源码的结构目录简介我们看packages/next-auth/src,这个目录下面是根目录,我们会看到下面的结构--src--client//这个里面主要是封装了fetch这个方法--core//这个是主要的方法,/api/auth/xxx的api及页面都是在这个里面......
  • xxl-job源码解析
    简介:XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。Features:1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行......
  • 这个网站真的太香了!居然可以免费使用AI聊天工具和“智能AI聊天助手”项目源码!
    宝子们,在这个AI爆火的时代,你是否还在因为无法使用ChatGpt而头疼?是否还在寻觅一款国内的好用AI工具呢?好消息!小编花费三个月终于找到了一个可以免费使用AI聊天工具的网站,由于这个网站之前一直在内测阶段,所以就没有给大家分享。刚好,近期这个网站正式上线了。小编今天就来好好跟大......
  • 序列化类源码分析
    序列化类源码分析​ 我们主要带着两个问题取探究反序列化类校验是如何走的局部钩子和全局钩子序列化类实例化分单条和多条,它们实例化得到的对象是不一样的(不同的类)单条和多条的序列化类的实例化​ 首先当我们去查多条和查一条时,会在我们定义的序列化类传入参数many=True/......
  • ElasticSearch 7.17.20本地源码调试
    目录使用本地安装gradle下载相关依赖本地编译本地调试使用本地安装gradle下载相关依赖在gradle安装目录下的init.d目录中,创建初始化脚本init.gradle,添加如下脚本,将其中的maven仓库源全部换成国内镜像allprojects{repositories{defREPOSITORY_URL='http://m......
  • 认证组件及源码分析
    认证组件​ 用于判断用户是否登录简单使用#1.创建一个任意名字的py文件#2.导入认证类fromrest_framework.authenticationimportBaseAuthentication#3.写一个类继承它并且重写authenticate方法classLoginAuth(BaseAuthentication):defauthenticate(self,req......
  • 权限组件及源码分析
    权限组件​ 通过观察APIView的源码,会发现他的里面执行了三个方法self.perform_authentication(request)#认证self.check_permissions(request)#权限self.check_throttles(request)#频率​ 也由此看出,权限是在认证之后执行的权限类的编写写一个类,继承Base......
  • 频率组件及源码分析
    频率组件​ 他的作用是限制接口访问的频率频率类的编写写一个类,继承SimpleRateThrottle重写get_cache_key,返回唯一标识,返回什么就以什么做限制重写类属性rate控制频率fromrest_framework.throttlingimportBaseThrottle,SimpleRateThrottleclassCommonThrottling(S......