3D Gaussian Splatting 论文学习

devtools/2024/9/18 1:03:03/ 标签: 3dgs, 三维重建, 图形学

概述

目前比较常见的渲染方法大致可以分为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.ppmy.cn/devtools/111700.html

相关文章

OPENAIGC开发者大赛企业组AI黑马奖 | AIGC数智传媒解决方案

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…

极狐GitLab DevSecOps 功能合集(七大安全功能)

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…

浅谈WebApi

一、基本介绍 Web API(Web应用程序编程接口)是一种用于构建应用程序的接口,它允许软件应用程序通过HTTP请求与Web服务器进行交互。Web API通常用于构建客户端-服务器应用程序,其中客户端可以是Web浏览器、移动应用程序、桌面应用程…

docker 进程的概念

Docker 是一个开放源代码软件,用于开发、运输和运行应用程序,它通过将应用程序及其依赖项打包到一个轻量级、可移植的容器中,从而实现了应用程序的隔离和一致性。在 Docker 的上下文中,进程(Process)是一个…

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static NonNull File getRootDirectory() {return DIR_ANDROID_ROOT;}// ENV_ANDROID_ROOT 的值为 "AN…

SQL进阶技巧:如何将字符串数组清洗为简单map结构? | translate + regexp_replace方法

目录 0 场景描述 1 数据准备 2 问题分析 2.1 方法1 特征法-通用解法 2.2 方法2枚举法(不通用) 3 小结 ~~END~~ 如果觉得本文对你有帮助,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下: 数字化建设通关指南专栏原价99,现在活动价29.9,按照阶梯式增长,直到恢…

小众语言ruby在苹果中的初步应用

前言 感觉Ruby在苹果系统中充当一种脚本语言来使用。 1、直接输入ruby没有反应 2、可显示结果的命令 ruby -e "puts Goodbye, cruel world!" 效果如下图: 说明苹果系统中ruby已经安装完毕,或者就是自带的。 3、编辑运行第一个ruby程序 输入…

docker入门安装及使用

docker概述 docker是一种容器技术,它提供了标准的应用镜像(包含应用和应用多需要的依赖),因此,我们可以非常轻松的在docker中安装应用,安装好的应用相当于一个独立的容器 如下图所示,为docker中…

如何在@GenericGenerator中显式指定schema

现在的情况是,在MySQL中有db1和db2两个数据库。项目使用Hibernate,可同时访问db1和db2,默认数据库为db1。表table2在db2中。且table2的主键名为ids,是自增长字段(Auto Increment)。 table2和ids的定义为&a…

大数据-126 - Flink State 03篇 状态原理和原理剖析:状态存储 Part1

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

【qt信号槽-6】槽函数不执行的一种原因——未知线程

背景: 项目需要调用第三方库,又要涉及多线程,遇到了在connect成功之后,槽函数依然不执行的情况。按照常理,槽函数不执行无非就几种情况: 要么connect未成功。 要么disconnect,或者对象被销毁…

.NET 一款在线解密Web.config的脚本

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(六、ILQR正则化和line search)

(六)ILQR正则化和line search 1. ILQR正则化 在iLQR中,我们通常线性化系统动力学并对目标函数进行二阶近似。在反向传播步骤中,我们需要计算逆矩阵(控制变量对目标函数的二阶导数矩阵),用以更…

第 1 0 章OpenCV

本章概述如何通过 Python 接口使用流行的计算机视觉库 OpenCV。OpenCV 是一个C 库,用于(实时)处理计算视觉问题。实时处理计算机视觉的 C 库,最初由英特尔公司开发,现由 Willow Garage 维护。OpenCV 是在 BSD 许可下发…

对数器验证小和算法是否正确

题目&#xff1a;在一个数组中&#xff0c;每一个数左边比当前数小的数累加起来&#xff0c;叫做这个数组的小和。求一个数组的小和。 function randomArr(size, value) {var length Math.floor((size 1) * Math.random())var arr []for(var i 0; i < length; i) {arr[…

【React Native】路由和导航

RN 中的路由是通过 React Navigation 组件来完成的 Stack 路由导航RN 中默认没有类似浏览器的 history 对象在 RN 中路由跳转之前&#xff0c;需要先将路由声明在 Stack 中<Stack.Navigator initialRouteNameDetails> <Stack.Screen nameDetails /> </Stack.N…

2024 年 GitLab Global DevSecOps 报告解读

近日 GitLab 正式发布了 2024 年 GitLab Global DevSecOps 报告&#xff0c;报告主题为 What’s next in DevSecOps。在全球有超 5000 位 IT 人员参与了该报告的调研&#xff0c;超 70% 为企业管理者&#xff0c;50% 以上的受访者所在企业规模超过 500人。该报告深刻揭示了在 A…

通信协议:WebSocket 和 SSE(Server-Sent Events)如何选择?一文让您了解!

WebSocket 和 SSE&#xff08;Server-Sent Events&#xff09;都是用于在客户端和服务器之间建立持久连接的技术&#xff0c;用于实时通信。然而&#xff0c;它们有不同的特点和适用场景&#xff0c;选择时需要考虑应用需求。 1. WebSocket WebSocket 是一个双向通信协议&…

使用 Spring Boot + Vue + ElementUI 构建简易评分系统

在这篇博客中&#xff0c;我将带领大家一步一步地构建一个简易评分系统。这个项目会使用 Spring Boot 作为后端&#xff0c;Vue 作为前端框架&#xff0c;并结合 ElementUI 提供用户界面的组件。我们将详细介绍项目的设计思路和实现过程&#xff0c;并在此过程中学习如何将这些…

计算机毕业设计选题推荐-流浪动物领养管理系统-Java/Python项目实战(亮点:数据可视化分析、智能推荐)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…