3D Gaussian Splatting介绍

news2024/11/13 21:56:26

目录

    • 一、概述
    • 二、基础介绍
    • 三、整体流程
    • 四、 伪代码
    • 五、评价指标
    • 六、实验结果
    • 七、reference

一、概述

3D Gaussian Splatting和NeRF一样,主要用于新视图合成。
特点:

  • 使用光栅化渲染方式,而不是NeRF的基于射线的体渲染(volumetric rendering along a ray)
  • 使用多个3D高斯球显示的表达场景
  • 训练推理速度快的同时保证质量高
  • 本质上是一个优化问题,没有使用神经网络

二、基础介绍

1. 多维高斯分布

Gaussians are defined by a full 3D covariance matrix Σ defined in world space centered at point (mean) μ \mu μ
在这里插入图片描述

进行了一定简化,我们回顾一下原始形式,若随机变量服从 X ∼ N ( μ , σ 2 ) X\sim N(\mu ,\sigma^2) XN(μ,σ2),则有如下的概率密度函数
Alt
对应到多元,就是下面的形式,

高斯分布的协方差Σ 是正定矩阵,一定可以进行对角化,因此可以分解成如下形式
在这里插入图片描述
R通过四元数表示,4个参数,S为对角矩阵,3个参数,所以协方差一共7个参数

2. 将3D 高斯投影到2D像素平面

y = p c = W w c p w + t w c y=p_c = W^c_w p_w+t^c_w y=pc=Wwcpw+twc
线性变换,依然符合高斯分布
Σ p c = W Σ p w W T \Sigma_{p_c} = W\Sigma_{p_w}W^T Σpc=WΣpwWT
从相机坐标系变换到像素坐标系:
z = [ z x z y 1 ] = ( 1 / p c z ) [ f x 0 c x 0 f y c y 0 0 1 ] [ p c x p c y p c z ] z = \begin{bmatrix} z_x\\ z_y\\ 1 \end{bmatrix}=(1/p_c^z)\begin{bmatrix} fx& 0& cx& \\ 0& fy& cy& \\ 0& 0& 1& \end{bmatrix} \begin{bmatrix} p_c^x\\ p_c^y\\ p_c^z \end{bmatrix} z= zxzy1 =(1/pcz) fx000fy0cxcy1 pcxpcypcz
这个变换是非线性的,需要进行一阶泰勒展开, z = F ( p c ) ≈ F ( μ y ) + J ( y − μ y ) z=F(p_c)\approx F(\mu _y)+ J(y-\mu_y) z=F(pc)F(μy)+J(yμy),进而得到协方差变换为:
Σ z = J Σ p c J T = J W Σ p w W T J T \Sigma _z=J\Sigma _{p_c}J^T=JW\Sigma _{p_w}W^TJ^T Σz=JΣpcJT=JWΣpwWTJT
均值如下:
μ z = F ( μ y ) = F ( W μ p w c + t ) \mu_z = F(\mu^y)=F(W\mu_{p_w^c}+t) μz=F(μy)=F(Wμpwc+t)

3. 球谐函数
  • 球谐函数用于表达空间中某点的光照模型(NeRF通过MLP来建模光照模型,输入(x,y,z,theta,phi)-> MLP->颜色C)
  • 光照函数 C ( θ , ϕ ) C(\theta, \phi) C(θ,ϕ)可以表示为球谐函数的加权线性组合,如下,某一个位置高斯球的函数,输入为角度,输出为这个角度的颜色
    在这里插入图片描述
    其中:
    在这里插入图片描述
  • m由J决定,如J=3, m=-3,-2,-1,0,1,2,3, J =2 m = -2,-1,0,1,2 , 对应7+5+3+1=16个球谐函数,所以有16个系数c,RGB分别对应一个球谐函数线性组合,所以光照模型一共16*3=48个参数,这些参数就是需要优化的变量。
  • 输入 ( θ , ϕ ) (\theta, \phi) (θ,ϕ),确定J,那么球谐函数就是固定的,如下,带入 ( θ , ϕ ) (\theta, \phi) (θ,ϕ),那么球谐函数就是一个个实数
    在这里插入图片描述
    带入J,化简之后:
    在这里插入图片描述
    其他如下图所示
    在这里插入图片描述
    实际使用时,不用 ( θ , ϕ ) (\theta, \phi) (θ,ϕ),而是使用方向向量d = (x,y,z)(模长为1),转换如下图所示,这样就可以把上面球谐函数表示为关于x,y,z的函数。
    在这里插入图片描述

NeRF通过MLP确定光照模型,这里是通过球谐函数确定光照模型,每个高斯球48个参数,估计出来就能知道这个高斯球的光照模型。

注:也可以理解为一种朝向编码方法,NeRF中姿态会进行编码,这种编码方式可以替换为球谐函数,更有物理意义。

4. Splatting and α \alpha α blending

Splatting是一种光栅化(Rasterize)3D对象的方法,即将3D对象投影到2D图形。如将3D高斯球(也可以是其他图形)往像素平面扔雪球,在像素平面的能量从中心向外扩散并减弱。该过程可以方便的并行处理。一会可以看到,这对应后面的projection过程,即把3D高斯球投影到2D图像上的过程。
α \alpha α blending介绍
光栅化之后怎么混合这些像素平面的椭球呢?使用 α \alpha α blending,主要解决图层融合的问题。
以两幅图像为例,图像 I 1 I_1 I1透明度为KaTeX parse error: Undefined control sequence: \lapha at position 1: \̲l̲a̲p̲h̲a̲_1,图像 I b k I_{bk} Ibk为背景,融合公式如下:
I r e s u l t = I 1 ∗ α 1 + I B K ∗ ( 1 − α 1 ) I_{result} = I_1 * \alpha_1 + I_{BK}*(1-\alpha_1) Iresult=I1α1+IBK(1α1)
在这里插入图片描述

扩展到多张图,按照深度由近到远排序四张图,融合公式如下: I B K I_{BK} IBK先和 I 3 I_3 I3融合,再和 I 2 I_2 I2, I 1 I_1 I1
在这里插入图片描述
I B K I_{BK} IBK为0,则可以写成
在这里插入图片描述
这就是 α \alpha α blending 公式了。

接下来说一下 α \alpha α blending和NeRF体渲染的区别:
体渲染公式如下:
在这里插入图片描述
在这里插入图片描述
公式相同,虽然公式相同,但实现上区别比较大,应用方式也不一样。

三、整体流程

在这里插入图片描述
场景表达通过很多个高斯球来实现,如下图所示,每个高斯球对应59个参数。
在这里插入图片描述
其中决定一个高斯球需要59个系数来表达,这些也是优化问题要求解的状态:

  • 中心位置:3dof
  • 协方差矩阵:7dof
  • 透明度:1dof
  • 球谐系数:48 dof(J = 3,16 * 3)

整体流程

1)Initialization: 输入为3D点云,可以 通过colmap得到,(NeRF也会用到colmap,使用位姿), 基于这些点云初始化高斯球,每个点云位置放置一个高斯球,中心点位置设置为点云位置,其他随机初始化
2) Projection: 根据相机内外参数(图像位姿),把高斯球splatting到图像上–把能看到99%的所有高斯球投影到图像上(参考“将3D 高斯投影到2D像素平面”)使用下面3个公式
在这里插入图片描述

3)Differentiable Tile Rasterizer:在投影重叠区域进行光栅化渲染(Differentiable Tile Rasterizer),使用 α \alpha α blending,这是确定的函数,不需要学习。把这些高斯球进行混合,过程可微,公式就是:
在这里插入图片描述
4)与gt计算loss,更新每个高斯球的59维系数
在这里插入图片描述
损失函数为:

在这里插入图片描述
其中:

  • L1 loss:基于逐像素比较差异,然后取绝对值
    在这里插入图片描述
  • SSIM loss(结构相似)损失函数:考虑了亮度 (luminance)、对比度 (contrast) 和结构 (structure)指标,这就考虑了人类视觉感知,一般而言,SSIM得到的结果会比L1,L2的结果更有细节,SSIM 的取值范围为 -1 到 1,1 表示两幅图像完全一样,-1 表示两幅图像差异最大。
    在这里插入图片描述
def _ssim(img1, img2, window, window_size, channel, size_average=True):
    mu1 = F.conv2d(img1, window, padding=window_size // 2, groups=channel)
    mu2 = F.conv2d(img2, window, padding=window_size // 2, groups=channel)

    mu1_sq = mu1.pow(2)
    mu2_sq = mu2.pow(2)
    mu1_mu2 = mu1 * mu2

    sigma1_sq = F.conv2d(img1 * img1, window, padding=window_size // 2, groups=channel) - mu1_sq
    sigma2_sq = F.conv2d(img2 * img2, window, padding=window_size // 2, groups=channel) - mu2_sq
    sigma12 = F.conv2d(img1 * img2, window, padding=window_size // 2, groups=channel) - mu1_mu2

    C1 = 0.01 ** 2
    C2 = 0.03 ** 2

    ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))

    if size_average:
        return ssim_map.mean()
    else:
        return ssim_map.mean(1).mean(1).mean(1)

参考论文:Loss Functions for Image Restoration with Neural Networks(ref)
参考链接:wiki

5)梯度回传

  • 更新每个高斯球的属性(59维系数)-这是个优化问题
    在这里插入图片描述
  • Adaptive Density Control:根据梯度实现3D高斯球的clone和split,具体而言
  1. 学习过程中,较大梯度(59维导数,模长大)的高斯球存在under-reconstruction和over-reconstruction问题
  2. under-reconstruction区域的高斯球方差小,进行clone
  3. over-reconstruction区域高斯球方差大,进行split
    在这里插入图片描述
  4. 每经过固定次数的迭代进行一次剔除操作,剔除几乎透明(透明度接近0)的高斯球以及方差过大的高斯球

四、 伪代码

在这里插入图片描述
对应colmap输入点云,内部处理流程:
在这里插入图片描述
rasterization pipeline:
在这里插入图片描述

  1. cull some 3D gaussian, 99%必须投影到当前图像,才有效
    2)都投影到图像
    3)把图像分成很多tile,并行处理
    4)建立索引和tile的对应关系,每个tile的深度值存在key里面
    5)key排序
    6)逐个tile渲染
    注意:rasterzation时,每个高斯球投影到image时,透明度也需要从中心点开始递减,根据概率衰减

五、评价指标

PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比是一种评估图像质量的常用指标,主要用于衡量原始图像和压缩或重构后的图像之间的质量差异。

  • PSNR 是基于预测错误的均方值来定义的,公式为:
  • 在这里插入图片描述

其中,MAX_I 是图像可能的最大像素值(对于8位图像来说,值为255),MSE 是均方误差,计算公式为:

  • MSE = (1/mn) ΣΣ[(I(i,j)-K(i,j))^2] (i=1:m, j=1:n)

其中,I(i,j) 和 K(i,j) 分别是在位置 (i,j) 的原始图像和重构后的图像单元像素的亮度值,‘m’ 和 ‘n’ 分别是图像的行数和列数。
PSNR 的取值范围是 0到无穷大,单位是 dB(分贝)。PSNR 值越大,说明重构图像质量越高。但需要注意的是,PSNR 只是一个粗略的图像质量度量指标,有时候 PSNR 很高的两幅图像,人眼可能会觉得差异很大;反之,PSNR 很低的两幅图像,人眼可能觉得差异不大。

六、实验结果

训练速度快,和instant NGP相当,效果更好。推理速度135fps,很快,训练时间增长51min,效果比Mip-NeRF360更好,因为有更多高斯球,所以推理速度慢一点,但也有93fps.
在这里插入图片描述

七、reference

多元高斯分布介绍
深蓝学院课程

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

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

相关文章

视频批量剪辑新风尚:横屏内容轻松转竖屏,引领内容创作新风尚!

随着移动设备的普及和社交媒体的崛起,横屏视频逐渐成为内容创作的新宠。然而,在某些场景下,竖屏视频仍然具有无可比拟的优势。为了满足创作者多样化的需求,我们推出了全新的视频剪辑功能——横屏转竖屏! 第一步&#…

合合信息Embedding模型:引领中文文本向量化技术新高度

目录 🍅前言🍓赛事含金量🍓Embedding技术简介🍓Embedding在大模型中的价值🍓合合信息Embedding模型特点及优势🍓合合信息Embedding模型测试🍓技术突破🍓公司介绍 🍅总结 …

flutter 谷歌的苹果系统消息推送

flutter firebase 云消息通知教程 (android-安卓、ios-苹果) Android、ReactNative、Flutter集成Firebase推送注意事项 Android:Firebase 凭据 iOS:基于 p8 令牌的 APN 连接 iOS:p12 生成证书 Flutter之对接国外推送onesignal踩坑笔记&a…

计算机网络学习day02|HTTP协议

目录 一、HTTP报文格式长什么样?是如何分割的? 请求行 状态行 头部字段 常用头字段 小结 二、HTTP提供了哪些方法?GET和POST的区别是什么? 1.HTTP有哪些方法 2.GET/HEAD 3.PSOT/PUT 小结 三、URI和URL URI 的格式 U…

【C++】 【进程】第二天

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会…

2024三掌柜赠书活动第二十四期:containerd原理剖析与实战

目录 前言 Containerd的架构 Containerd的工作流程 Containerd的实战演示 关于《containerd原理剖析与实战》 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《containerd原理剖析与实战》全书速览 结束语 前言 作为开发者,对于编程语言并不陌生&…

【ARM 裸机】C 语言 led 驱动

前面刚学习了汇编 led 驱动的编写和验证,现在开始就要进入 C 语言 led 驱动编写与验证了 ! 1、C 语言运行环境构建 1.1、设置处理器模式 使 6ULL 处于 SVC 模式下,之前已经提到了处理器的九种模式,参考:【ARM 裸机】汇编 led 驱…

在Nuxt.js中添加PostCSS自动前缀器

在其他浏览器中,有些 CSS 属性需要带有前缀。如-webkit- | -o- | -ms- 等等 Autoprefixer 是一个 PostCSS 插件,可以将你的CSS代码渲染到浏览器中自动补充厂商前缀,因此你不用担心自己编写的CSS代码有浏览器兼容性问题。 如: .fl…

Golang | Leetcode Golang题解之第43题字符串相乘

题目: 题解: func multiply(num1 string, num2 string) string {if num1 "0" || num2 "0" {return "0"}m, n : len(num1), len(num2)ansArr : make([]int, m n)for i : m - 1; i > 0; i-- {x : int(num1[i]) - 0fo…

AI大模型探索之路-认知篇3:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内,大型预训练语言模型(Large Language Models, LLMs)已经成为推动技术革新的关…

软考132-上午题-【软件工程】-沟通路径

一、定义 1-1、沟通路径1 沟通路径 1-2、沟通路径2 沟通路径 n-1 二、真题 真题1: 真题2: 真题3:

C++感受6-Hello World 交互版

变量、常量输入、输出、流getline() 函数读入整行输入Hello() 函数复习新定义函数 Input() 实现友好的人机交互还有 “痘痘” 为什么挤不到的分析…… 1. DRY 原则简介 上一节课,我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多,每一次问…

Netty快速入门

网络通信模型 在了解Netty之前,我们可以简单的先了解一下我们的网络通信方式,正所谓知其然,知其所以然。只有了解了网络通信模型,我们才能更好的去理解Netty的一些核心的原理。 如下图是一个简单的请求发送的时候的一个大概的HTT…

大型网站系统架构演化实例_6.使用分布式文件系统和分布式数据库系统

1.使用分布式文件系统和分布式数据库系统 任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库经过读写分离后,从一台服务器拆分成两台服务器,但是随着网站业务的发展依然不能满足需求,这时需要使用分布式数据库。文件系统也一…

el-image组件预览图片同时操作页面

背景:el-image组件打开预览效果不能滑动页面。 Q:那么如何才能在打开遮罩层后还能操作页面呢? A:改变遮罩层的大小。CSS3有一个属性width:fit-content;可以解决这个问题。 打开F12看看饿了么的原生样式如下 加上width&#xff1…

AI大模型实现软件智能化落地实践

1、什么是大模型 大型语言模型(Large Language Model,LLM;Large Language Models,LLMs)。 大语言模型是一种深度学习模型,特别是属于自然语言处理(NLP)的领域,一般是指包含数干亿&…

在数字化转型过程中,企业的资产管理需要做出哪些调整?

在数字化转型过程中,企业的资产管理做出调整的常见于以下几个方面: 1、提高工作效率:数字化转型能够让员工在部门与部门之间的沟通更加顺畅,节省时间,提高效率。这要求企业在资产管理中采用数字化工具和流程&#xff…

高中数学:三角函数之考点精华-单调性问题

一、解题方法 1、换元 2、画图 3、反向求解 参考:整体换元法 二、练习 例题1 解析: 这一题,比较简单,是标准的换元法应用题。 这里稍微注意下第二小问的对称中心,因为,B1,所以,对…

单机三pxc节点集群,+docker-haproxy2.0负载均衡实现

一.下载 https://www.haproxy.org/download/2.0/src/haproxy-2.0.5.tar.gz 或者在这里下载(下面需要的各个配置文件都有): https://download.csdn.net/download/cyw8998/89170129 二.编写文件,制作docker镜像 1.Dockerfile&a…

恒峰智慧科技—森林消防泵,你了解多少?

在我们的日常生活中,森林火灾是一种非常危险的现象。为了保护森林资源和人民的生命财产安全,森林消防泵成为了一种非常重要的设备。那么,你对森林消防泵了解多少呢?本文将为您详细介绍森林消防泵的操作步骤、注意事项以及维护保养…