3DGS CUDA代码笔记

2024-04-24 11:28
文章标签 代码 笔记 cuda 3dgs

本文主要是介绍3DGS CUDA代码笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇文章 一Scaffold GS 为例子。 目标在里面添加 Render Depth 的代码:

将可见的 Gaussians Render 到 2D 图像上面

from diff_gaussian_rasterization import GaussianRasterizationSettings, GaussianRasterizer
.......rasterizer = GaussianRasterizer(raster_settings=raster_settings)
rendered_image, radii = rasterizer(means3D = xyz,             #  高斯的中心点 means2D = screenspace_points,   ##  return 数值shs = None,colors_precomp = color,opacities = opacity,scales = scaling,rotations = rot,cov3D_precomp = None)

上面那个 GuassianRasterizer 是从 diff_gaussian_rasterization 这个 package 中导入进来的、 因此,我找到 diff_gaussian_rasterization 这个文件夹,首先 看其对应的 init.py 这个函数。因为每次 import 这个package 的时候 都会首先执行一次 这个文件夹下面的 init.py 作为包的初始化函数

这个 Init 函数里面 回调用 rasterize_gaussians CUDA 的 函数:

 return rasterize_gaussians(means3D,means2D,shs,colors_precomp,opacities,scales, rotations,cov3D_precomp,raster_settings, )继续调用:
def rasterize_gaussians(means3D,means2D,sh,colors_precomp,opacities,scales,rotations,cov3Ds_precomp,raster_settings,
):return _RasterizeGaussians.apply(means3D,means2D,sh,colors_precomp,opacities,scales,rotations,cov3Ds_precomp,raster_settings,)

最后跳入到 _RasterizeGaussians 的 forward 函数当中

num_rendered, color, radii, geomBuffer, binningBuffer, imgBuffer = _C.rasterize_gaussians(*args)

_C 表示 在当前的 Cpp 文件中去 找这个 rasterize_gaussians 的函数,

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

发现对应的 RasterizeGaussiansCUDA 函数

这个 函数 通过 ext.
cpp
查询可以发现是 rasterize_points.cu 里面的 函数:

下面这个函数主要是定义了 一些需要返回的 变量,启动 核函数

RasterizeGaussiansCUDA(const torch::Tensor& background,const torch::Tensor& means3D,const torch::Tensor& colors,const torch::Tensor& opacity,const torch::Tensor& scales,const torch::Tensor& rotations,const float scale_modifier,const torch::Tensor& cov3D_precomp,const torch::Tensor& viewmatrix,const torch::Tensor& projmatrix,const float tan_fovx, const float tan_fovy,const int image_height,const int image_width,const torch::Tensor& sh,const int degree,const torch::Tensor& campos,const bool prefiltered,const bool debug)
{if (means3D.ndimension() != 2 || means3D.size(1) != 3) {AT_ERROR("means3D must have dimensions (num_points, 3)");}const int P = means3D.size(0);const int H = image_height;const int W = image_width;auto int_opts = means3D.options().dtype(torch::kInt32);auto float_opts = means3D.options().dtype(torch::kFloat32);torch::Tensor out_color = torch::full({NUM_CHANNELS, H, W}, 0.0, float_opts);torch::Tensor radii = torch::full({P}, 0, means3D.options().dtype(torch::kInt32));torch::Device device(torch::kCUDA);torch::TensorOptions options(torch::kByte);torch::Tensor geomBuffer = torch::empty({0}, options.device(device));torch::Tensor binningBuffer = torch::empty({0}, options.device(device));torch::Tensor imgBuffer = torch::empty({0}, options.device(device));std::function<char*(size_t)> geomFunc = resizeFunctional(geomBuffer);std::function<char*(size_t)> binningFunc = resizeFunctional(binningBuffer);std::function<char*(size_t)> imgFunc = resizeFunctional(imgBuffer);int rendered = 0;if(P != 0){int M = 0;if(sh.size(0) != 0){M = sh.size(1);}rendered = CudaRasterizer::Rasterizer::forward(geomFunc,binningFunc,imgFunc,P, degree, M,background.contiguous().data<float>(),W, H,means3D.contiguous().data<float>(),sh.contiguous().data_ptr<float>(),colors.contiguous().data<float>(), opacity.contiguous().data<float>(), scales.contiguous().data_ptr<float>(),scale_modifier,rotations.contiguous().data_ptr<float>(),cov3D_precomp.contiguous().data<float>(), viewmatrix.contiguous().data<float>(), projmatrix.contiguous().data<float>(),campos.contiguous().data<float>(),tan_fovx,tan_fovy,prefiltered,out_color.contiguous().data<float>(),radii.contiguous().data<int>(),debug);}return std::make_tuple(rendered, out_color, radii, geomBuffer, binningBuffer, imgBuffer);
}

之后 进入 CudaRasterizer::Rasterizer::forward 函数,其定义在 rasterizer_impl.cu 对应的文件。 这个 forward 函数 最后会调用 FORWARD 类里面的 render 函数, 真实的 Render 过程是在下面这个函数执行的,我们

CHECK_CUDA(FORWARD::render(tile_grid, block,imgState.ranges,binningState.point_list,width, height,geomState.means2D,feature_ptr,geomState.conic_opacity,imgState.accum_alpha,out_alpha,imgState.n_contrib,background,out_color,out_depth), debug)

最后的 Depth Render 的函数是在 renderCUDA 函数中进行的。
实际修改的代码:

## 定义 CUDA 的变量
float weight = 0;
float D = 0;## 使用深度的加权去 计算真实的depth 的数值
weight += alpha * T;
D += depths[collected_id[j]] * alpha * T;

在 添加的时候,也添加了对于 Depth 的 BP 的操作,但是如果只需要可视化 depth 的话可以不用添加。

参考网址: https://github.com/ashawkey/diff-gaussian-rasterization

这篇关于3DGS CUDA代码笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931620

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,