3D Gaussian Splatting 论文学习

news2024/9/20 20:37:57

概述

目前比较常见的渲染方法大致可以分为2种:

  1. 将场景中的物体投影到渲染平面:传统的渲染管线就是这种方式,主要针对Mesh数据,可以将顶点直接投影成2D的形式,配合光栅化、深度测试、Alpha混合等就可以得到渲染的图像。
  2. 从相机到像素发出一条射线与场景物体交互去计算沿着射线的颜色积分:例如光线追踪,去计算光线和Mesh的光学行为(反射等)来得到像素的颜色值;或是体渲染,对于体数据或是隐式的场景表达(NeRF)通过采样的方式来计算一个光线上的离散的积分,得到最终的颜色。

隐式的场景表达因为其连续性天然具有可微性,比较适合放在优化框架中去使用,但是在渲染时由于需要随机采样,会浪费大量时间在无效的采样点上。3D高斯这个方法则结合了连续可微和投影后光栅化渲染的优势,实现了高质量的实时渲染效果。

接下来我以一些关键知识点为章节来进行总结:

3D高斯表示

3D高斯实际上就是点云+概率密度,使得场景离散化表示的同时对不存在顶点的空间有了连续的颜色变化。一个高斯球的数学形式可以表示为
G ( x ) = exp ⁡ ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) G(x)=\exp{(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu))} G(x)=exp(21(xμ)TΣ1(xμ))
其中 Σ \Sigma Σ是协方差矩阵, μ \mu μ是高斯球的重心坐标(均值)。论文中省略了高斯分布的归一化系数,这是因为我们并不需要得到严格的概率分布,只需要表达对空间的相对影响就行了。协方差矩阵 Σ \Sigma Σ是一个正定对称矩阵,是场景学习时的优化参数,如果直接优化一个3x3的矩阵很难满足高斯分布的性质,因此往往将其分解为旋转矩阵 R R R和缩放矩阵 S S S,即
Σ = R S S T R T \Sigma=RSS^TR^T Σ=RSSTRT
然后缩放用一个三维的向量表示,旋转用一个四元数表示。

以上的概率分布实际上定义了一个类似“椭球”的形状,用来表示某个高斯球对空间的影响程度,除此之外对每个高斯球还需要不透明度 α \alpha α和颜色信息。不透明度好理解,一个[0,1]的浮点数,深度排序后用来影响颜色的混合。而颜色信息,论文中用了四阶球谐函数(0, 1, 2, 3,每个颜色分量对应16个参数)来表示。因为我之前对球谐函数不太了解,所以这里简要总结一下球谐函数:

球谐函数(Spherical Harmonics),可以用来拟合球面函数 ρ = f ( θ , ϕ ) \rho=f(\theta,\phi) ρ=f(θ,ϕ)。实际上球谐函数就是一组基函数,怎么理解基函数呢?类似傅里叶展开的基函数为 { s i n ( p θ ) , c o s ( q θ ) } \{sin(p\theta),cos(q\theta)\} {sin(),cos()},用他们的线性组合可以拟合任意一个周期函数;也类似我们刚接触机器学习的欠拟合和过拟合时都会遇到的例子,用多项式去拟合数据点,也可以把 { 1 , x , x 2 , … , x k } \{1,x,x^2,\dots,x^k\} {1,x,x2,,xk}作为基函数,每个基函数前面乘的参数作为可学习的参数。

而用于拟合球面函数常用的基函数就是球谐函数
S m l ( θ , ϕ ) ,   − m ≤ l ≤ m S_m^l(\theta,\phi), \ -m\le l\le m Sml(θ,ϕ), mlm
它的具体形式就不展开了,需要再查吧,总之对于一个 m m m阶( m ≥ 0 m\ge0 m0)的球谐函数,它有 2 m + 1 2m+1 2m+1种变化。而对于一个任意的球面函数 f ( θ , ϕ ) f(\theta,\phi) f(θ,ϕ),我们用 k k k阶球谐函数去拟合的方式为
f ( θ , ϕ ) = ∑ m = 0 k ∑ l = − m m C m l S m l ( θ , ϕ ) f(\theta,\phi)=\sum_{m=0}^k \sum_{l=-m}^m C_m^l S_m^l(\theta,\phi) f(θ,ϕ)=m=0kl=mmCmlSml(θ,ϕ)
注意我这里的阶数是从0开始的。需要学习的参数是 C m l C_m^l Cml,总共有 ( k + 1 ) 2 (k+1)^2 (k+1)2个。

对于某个高斯球的颜色RGB,论文中每个分量用一个3阶(或者说是4阶,看从0还是1开始)球谐函数表示,总共48个参数,这样就可以根据任意视角 ( θ , ϕ ) (\theta,\phi) (θ,ϕ),查询这个高斯球的颜色了。

综上所述,每个3D高斯球有以下几个属性:

  • 位置: ( x , y , z ) (x,y,z) (x,y,z)
  • 缩放向量,四元数:表示高斯分布的协方差矩阵
  • 不透明度:opacity α \alpha α
  • 颜色:球谐函数拟合 C ( θ , ϕ ) C(\theta,\phi) C(θ,ϕ)

图片渲染

假设所有的高斯球已经训练好,要怎么渲染成2D的图像呢?前面也讲到过,像NeRF是发射光线,然后沿着光线进行采样对颜色做离散积分,如果套用到3D高斯的话,就要在光线路径上采样,然后计算所有(或者附近)的高斯球在该采样点的颜色。然而论文方法名称里叫“Splatting”,顾名思义就是“溅射”,或者说是“抛雪球”,比较形象的解释了高斯球的渲染方式:直接投影到2D。

给定一个视图变换(世界坐标到相机坐标)矩阵 W W W,相机坐标下某个高斯球的协方差矩阵为
Σ ′ = J W Σ W T J T \Sigma'=JW\Sigma W^TJ^T Σ=JWΣWTJT
其中 J J J为投影变换的仿射近似的雅各比矩阵,假设投影变换 x ′ = p ( x ) x'=p(x) x=p(x),那么 J = ∂ p ∂ μ J=\frac{\partial p}{\partial\mu} J=μp ,投影变换就可以近似为 x ′ = p ( μ ) + J ( x − μ ) x'=p(\mu)+J(x-\mu) x=p(μ)+J(xμ) 。其实就是把一个非线性的投影变换近似成一个线性变换,使得3D高斯投影后还是一个2D高斯。

至此,图片的渲染就可以对每个像素点,按照距离(深度)对所有高斯球排序,然后根据深度和不透明度以及二维高斯分布计算累加的颜色。论文还提出了一种加速方式,就是将图片分为16x16的小块,每一块按照一定置信度找到受影响的所有高斯球进行排序,后续就不再对每个像素单独排序了,并且每个小块只计算被影响的高斯球的颜色叠加。这样GPU上的每个Block处理一个小块,共享内存,每个Thread再处理一个像素点,光栅化过程就会非常非常快。

训练策略

训练流程如下图所示

image-20240910144820202

先用SFM(Structure From Motion,例如Colmap)将多视角图片转为点云,然后进行高斯球的初始化,然后再进行迭代训练以及进行高斯球密度的调整。

高斯球密度调整策略一般每过一定迭代次数调整一次,大致类型如下:

  1. 对于不透明度低于一定阈值的高斯球,直接删除(说明是空的,对应区域没有物体);
  2. 对于位置梯度(也就是对高斯球中心坐标那三个参数求导)过大的区域,可能有两种情况:
    1. 欠拟合:说明高斯球无法很好的填充周围的空白区域,于是克隆一个新的相同的高斯球;
    2. 过拟合,高斯球填满了周围的区域,还溢出了很多,于是分割成两个更小的高斯球

总结

相较于NeRF,3D高斯确实在保证质量的情况下,速度快很多,基本能够达到实时的渲染,并且训练时间也不长(半小时左右)。不过3D高斯是显式的表示,占用的内存和显存更高,保存场景时占用的空间比NeRF高了2个数量级。

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

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

相关文章

【Java基础】——深入理解Java异常

目录 1- 什么是异常概述(What、Why)1-1 什么是异常(What)1-2 为什么要有异常处理机制(Why) 2- ⭐异常体系结构图-总览2-1 分类2-2 异常体系结构小结 3- 五大运行时异常3-1 NullPointerException 空指针异常3-2 ArithmeticException 算数异常3-3 ArrayInd…

HPL 源码结构分析

文件夹结构: $ cd /home/hipper/ex_hpl_hpcg/ $ pwd $ mkdir ./openmpi $mkdir ./openblas $mkdir ./hpl $ tree 1. 安装openmpi 1.1.1 使用Makefile下载配置编译安装 openmpi Makefile: all:wget https://download.open-mpi.org/release/open-m…

java spring定时任务-动态任务

cron表达式 在线生成https://cron.qqe2.com/ 6个时间刻度的话 * * * * * * 分别对应 秒 分 时 日 月 星期 ; 7个时间刻度的话 * * * * * * * 分别对应 秒 分 时 日 月 星期 年;每隔5秒执行一次:*/5 * * * * ? 每隔1分钟执行一次&#xff1a…

AI如何辅助未来数学研究:陶哲轩的最新见解与应用展望

随着人工智能(AI)技术的飞速发展,AI在多个领域的应用已经渗透到了我们生活的方方面面。然而,在严谨且逻辑性极强的数学研究领域,AI能否真正发挥作用?2024年,著名数学家、菲尔兹奖得主陶哲轩在IM…

【Nacos】配置中心

Nacos除了注册中心和负载均衡之外,还是一个配置中心,具备配置管理的功能。 Nacos 配置中心是一种用于集中式管理应用程序配置的服务,它可以将应用程序的配置从代码和本地配置文件中分离出来,实现配置的集中管理和动态更新。通过 …

刘润《关键跃升》读书笔记7

沟通: 想明⽩,说清楚,能接受 团队沟通的正确⽅式可以⽤9个字来概括:想明⽩,说清楚,能接受 (⻅图4-1)想明⽩ 有时经理跟⼈沟通,讲完之后却⽆奈地对员⼯说,你怎…

远程访问电脑共享文件

远程访问电脑共享文件,可以通过多种方法实现,每种方法都有其特点和适用场景。以下是一些常见的方法及其步骤: 一、使用Microsoft远程桌面 启用远程桌面: 在目标电脑上,打开“开始”菜单,选择“设置”>“…

常见概念 -- WDM/OTN 时延

什么是时延? 在通信网络中,时延指原始数据经一台转发设备的编码等一系列处理过程后由发送端发送,通过传输链路传输,到达另一台(目的地)设备的接收端并解码还原为原始数据所花费的时间。网络时延主要由以下几…

多维时序 | Matlab基于TCN-Transformer+LSTM双输入神经网络时间序列预测

多维时序 | Matlab基于TCN-TransformerLSTM双输入神经网络时间序列预测 目录 多维时序 | Matlab基于TCN-TransformerLSTM双输入神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于TCN-TransformerLSTM双输入神经网络时间序列预测&#xff…

基于SpringBoot的校园自助洗衣服务管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的校园自助洗衣服务…

SAP Fiori-Vscode 环境搭建中npm报错

文章目录 前提: vscode 安装好了,node 配置完毕,npm环境搭建OK新建一个Fiori 初始化初始化性项目的报错&警告Q1: npm WARN config global --global, --local are deprecated. Use --locationglobal insteadQ2: npm打包出现警告&#xff0…

GPU池化赋能智能制造

2023年3月10日,“第六届智能工厂高峰论坛”在杭州隆重揭幕。本次会议由e-works数字化企业网、浙江制信科技有限公司主办,中国人工智能学会智能制造专业委员会、长三角新能源汽车产业链联盟、长三角(杭州)制造业数字化能力中心、浙江省智能工厂操作系统技…

基于微信小程序的宠物之家的设计与实现

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宠物之家/宠物综合…

Redis复习笔记整理(2w+)

目录 1、Redis简介 1.1 补充数据类型Stream 1.2 Redis底层数据结构 1.3 Redis为什么快 1.4 持久化机制* 1.4.1 RDB持久化 bgsave执行流程 如何保证数据一致性 快照操作期间服务崩溃 RDB优缺点 1.4.2 AOF持久化 为什么采用写后日志 如何实现AOF 什么是AOF重写 AO…

vue项目中引入组件时出现的Module is not installed问题

在Vue项目中,如果遇到了如图“Module is not installed”这样的错误,通常这 个错误并不是直接由Vue或Vue CLI本身抛出的,而是可能因为几个不同的原因导致的。 这个错误可能是在你尝试引入一个模块或组件时,该模块或组件并没有被正…

java基础 | 动态代理

动态代理 简而言之就是:首先创建一套动态代理的规则,创建好自己的接口,和实现类,在调用时直接调用(缺少什么参数,补充哪个参数!) 实现步骤: 设计动态代理的规则&#x…

Windows系统下编译C++源码并调用

现在很多的C库都以源码的形式在github网站开源,如果要使用,可以直接下载到本地,添加到工程中调用。也可以将源码编译为动态或静态库文件,然后将库文件添加到工程中。 在这里我们将GoogleTest源码编译,然后加到工程中。…

OpenGL(三)着色器语言GLSL

着色器语言 在GPU上运行的图形渲染语言,类C风格。 类似于CUDA,但是又没有CUDA通用,又有点像Verilog这种硬件描述语言 GLSL是一种着色器语言,需要有对应的图形API环境配合,可以使用OpenGL,也可以使用OpenGL…

Proteus仿真综合实例(1)

分享一些基于Proteus的仿真实例,供大家学习参考。 1、51单片机230个Proteus仿真实例 包含基于51单片机的230个仿真实例,涉及定时器、中断、LCD显示、DS18B20温度测量、DS1621温度测量、PWM生成等充足电路模型案例。 2、51交通灯 模拟实现基于51单片机…

音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件

在文章《音视频入门基础:PCM专题(1)——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为AAC裸流文件: ./ffmpeg -f s16le -ar 44100 -ac 2 -i audio1.pcm audio1.aac 由于…