【论文笔记】GS++: Error Analyzing and Optimal Gaussian Splatting

原文链接:https://browse.arxiv.org/abs/2402.00752

1. 引言

许多基于3D高斯溅射(3D-GS)的方法针对稀疏视图场景的鲁棒性、性能和存储效率进行增强,但没有专门处理高斯投影的误差。

3D-GS以一组图像和相机通过SfM校准产生的点云为输入,建立3D高斯来表达场景。渲染时,3D高斯会通过投影函数 ϕ \phi ϕ投影到图像平面( z = 1 z=1 z=1平面),以进行可微栅格化。

但是,尽管高斯函数经过卷积或仿射变换可以保留高斯属性,经过投影变换却不一定。因此,3D高斯溅射使用了局部仿射近似,即使用二阶泰勒展开近似投影函数,这会引入误差,从而在渲染图像中产生伪影。本文通过对泰勒余项的分析,揭示了3D高斯溅射误差与高斯均值的关系;同时,通过确定误差函数的极值,找到了使误差最小的条件。

本文还通过对误差函数的极值分析,提出最优投影方法,沿高斯均值与相机中心投影,投影平面与该线垂直。与直接将3D高斯投影到 z = 1 z=1 z=1平面相比,本文的投影方法误差更小,且也可实现真实且实时的渲染。

3. 准备知识

设有3D高斯函数 G G G,由均值 μ \mu μ和协方差矩阵 Σ \Sigma Σ表达:
G μ , Σ ( x ) = exp ⁡ ( − 1 / 2 ( x − μ ) T Σ − 1 ( x − μ ) ) G_{\mu,\Sigma}(x)=\exp(-1/2(x-\mu)^T\Sigma^{-1}(x-\mu)) Gμ,Σ(x)=exp(1/2(xμ)TΣ1(xμ))

在混合过程中,高斯会乘以不透明度 α \alpha α

通过视图变换矩阵 W W W,将高斯函数从世界坐标系变换到相机坐标系:
G ′ ( x ) = exp ⁡ ( − 1 / 2 ( W x − W μ ) T ( W Σ W T ) − 1 ( W x − W μ ) ) (1) G'(x)=\exp(-1/2(Wx-W\mu)^T(W\Sigma W^T)^{-1}(Wx-W\mu))\tag1 G(x)=exp(1/2(WxWμ)T(WΣWT)1(WxWμ))(1)

x ′ = W x , μ ′ = W μ , Σ ′ = W Σ W T x'=Wx,\mu'=W\mu,\Sigma'=W\Sigma W^T x=Wx,μ=Wμ,Σ=WΣWT,可得:
G ′ ( x ′ ) = exp ⁡ ( − 1 / 2 ( x ′ − μ ′ ) T Σ ′ − 1 ( x ′ − μ ′ ) ) G'(x')=\exp(-1/2(x'-\mu')^T\Sigma'^{-1}(x'-\mu')) G(x)=exp(1/2(xμ)TΣ1(xμ))

x 0 = [ 0 , 0 , 1 ] T x_0=[0,0,1]^T x0=[0,0,1]T z = 1 z=1 z=1的投影平面可以记为:
x 0 T ⋅ ( x ′ − x 0 ) = 0 x_0^T\cdot(x'-x_0)=0 x0T(xx0)=0

可以据此获取投影函数 ϕ \phi ϕ
ϕ ( x ′ ) = x ′ ( x 0 T x ′ ) − 1 ( x 0 T x 0 ) = x ′ ( x 0 T x ′ ) − 1 \phi(x')=x'(x_0^Tx')^{-1}(x_0^Tx_0)=x'(x_0^Tx')^{-1} ϕ(x)=x(x0Tx)1(x0Tx0)=x(x0Tx)1

可以使用泰勒展开到一阶:
ϕ ( x ′ ) = ϕ ( μ ′ ) + ∂ ϕ ∂ x ′ ( μ ′ ) ( x ′ − μ ′ ) + R 1 ( x ′ ) \phi(x')=\phi(\mu')+\frac{\partial\phi}{\partial x'}(\mu')(x'-\mu')+R_1(x') ϕ(x)=ϕ(μ)+xϕ(μ)(xμ)+R1(x)

其中 ∂ ϕ ∂ x ′ ( μ ′ ) \frac{\partial\phi}{\partial x'}(\mu') xϕ(μ)为投影变换的仿射近似,记为 J J J。不考虑泰勒余项时,可按照(1)式类似推导得到投影的2D高斯:
G 2 D ( x ′ ) = exp ⁡ ( − 1 / 2 ( J x ′ − J μ ′ ) T ( J Σ J T ) − 1 ( J x ′ − J μ ′ ) ) ≈ exp ⁡ ( − 1 / 2 ( ϕ ( x ′ ) − ϕ ( μ ′ ) ) T ( J Σ J T ) − 1 ( ϕ ( x ′ ) − ϕ ( μ ′ ) ) ) \begin{aligned}G_{2D}(x')&=\exp(-1/2(Jx'-J\mu')^T(J\Sigma J^T)^{-1}(Jx'-J\mu'))\\ &\approx\exp(-1/2(\phi(x')-\phi(\mu'))^T(J\Sigma J^T)^{-1}(\phi(x')-\phi(\mu')))\end{aligned} G2D(x)=exp(1/2(JxJμ)T(JΣJT)1(JxJμ))exp(1/2(ϕ(x)ϕ(μ))T(JΣJT)1(ϕ(x)ϕ(μ)))

注意 J J J的秩为2, J Σ J T J\Sigma J^T JΣJT的逆跳过第三维度求取。记 x 2 D = ϕ ( x ′ ) , μ 2 D = ϕ ( μ ′ ) , Σ 2 D = J Σ ′ J T x_{2D}=\phi(x'),\mu_{2D}=\phi(\mu'),\Sigma_{2D}=J\Sigma' J^T x2D=ϕ(x),μ2D=ϕ(μ),Σ2D=JΣJT,则投影的2D高斯可写成:
G 2 D ( x 2 D ) = exp ⁡ ( − 1 / 2 ( x 2 D − μ 2 D ) T Σ 2 D − 1 ( x 2 D − μ 2 D ) ) G_{2D}(x_{2D})=\exp(-1/2(x_{2D}-\mu_{2D})^T\Sigma_{2D}^{-1}(x_{2D}-\mu_{2D})) G2D(x2D)=exp(1/2(x2Dμ2D)TΣ2D1(x2Dμ2D))

4. 局部仿射近似误差

该部分推导见原文。

局部仿射近似误差由泰勒余项决定。可知该余项向量与随机变量 x ′ x' x和高斯均值 μ ′ \mu' μ相关。可计算其F-范数的平方,并计算其关于 x ′ x' x的期望,得到关于 μ ′ \mu' μ的误差函数 ϵ \epsilon ϵ
在这里插入图片描述
然后,可以证明 x ′ x' x μ ′ \mu' μ在单位球面上的投影 再投影到投影平面上(注意这个投影不是正交投影)时,得到的结果与直接将 x ′ x' x μ ′ \mu' μ投影到投影平面上相同,即 ( ϕ ∘ π ) ( x ′ ) = ϕ ( x ′ ) (\phi\circ\pi)(x')=\phi(x') (ϕπ)(x)=ϕ(x)。计算球面坐标,带入误差函数的表达式,可计算得到,当 x 0 x_0 x0 μ ′ \mu' μ在球面上的投影重合时,误差函数取得极值。

可视化误差函数发现,极值附近的较大区域,误差函数值变化不大,但靠近积分界限时误差急剧变大。因此,使用局部仿射近似的3D-GS在多数情况下能高质量地合成新视图,但对于离平面中心(相机中心在投影面上的投影点)远的高斯,会有大误差,从而导致伪影。

5. 最优高斯溅射

5.1 最优投影

在这里插入图片描述
本文将各3D高斯投影到不同的平面(高斯均值的与相机中心连线的垂直平面)上,以保证投影误差最小。投影平面与单位球相切,为:
x μ T ⋅ ( x ′ − x μ ) = 0 x^{\mu T}\cdot(x'-x^{\mu})=0 xμT(xxμ)=0

其中 x μ = π ( μ ′ ) = μ ′ ( μ ′ T μ ′ ) − 1 / 2 x^\mu=\pi(\mu')=\mu'(\mu'^T\mu')^{-1/2} xμ=π(μ)=μ(μTμ)1/2。最优投影函数为:
ϕ μ ( x ′ ) = x ′ ( x μ T x ′ ) − 1 \phi^\mu(x')=x'(x^{\mu T}x')^{-1} ϕμ(x)=x(xμTx)1

对应的局部仿射近似雅可比矩阵 J μ J^\mu Jμ可用 μ ′ \mu' μ的坐标表达(见原文)。

5.2 基于单位球的栅格化

由于投影不位于图像平面上,需要使用基于单位球的栅格化来生成图像。

具体来说,对图像像素 ( u , v ) (u,v) (u,v),类似NeRF投射射线,然后确定单位球上的哪些平面高斯与射线相交:
x 2 D μ = ϕ μ ( [ ( u − c x ) / f x , ( v − c y ) / f y , 1 ] T ) x^\mu_{2D}=\phi^\mu([(u-c_x)/f_x,(v-c_y)/f_y,1]^T) x2Dμ=ϕμ([(ucx)/fx,(vcy)/fy,1]T)

然后使用 x 2 D μ x^\mu_{2D} x2Dμ查询高斯函数值,进行alpha混合,获取颜色:
C ( u , v ) = ∑ z = z near z far SH ( μ z ) α ( u , v , μ z ) ∏ k = z near z ( 1 − α ( u , v , μ k ) ) C(u,v)=\sum_{z=z_\text{near}}^{z_\text{far}}\text{SH}(\mu_z)\alpha(u,v,\mu_z)\prod_{k=z_\text{near}}^{z}(1-\alpha(u,v,\mu_k)) C(u,v)=z=znearzfarSH(μz)α(u,v,μz)k=znearz(1α(u,v,μk))

其中 α ( u , v , μ ) = α μ ⋅ G 2 D μ ( x 2 D μ ) \alpha(u,v,\mu)=\alpha_\mu\cdot G^\mu_{2D}(x_{2D}^\mu) α(u,v,μ)=αμG2Dμ(x2Dμ) α μ \alpha_\mu αμ为中心为 μ \mu μ的高斯的不透明度, SH ( μ ) \text{SH}(\mu) SH(μ)为中心为 μ \mu μ的高斯的球面谐波, μ z \mu_z μz表示深度为 z z z的高斯中心。

6. 实验

6.4 结果

定量结果:与MipNeRF360相比,本文方法在MipNeRF360数据集下PSNR性能略低,但速度远远更快。这是因为MipNeRF360没有使用显著的近似。但总的来说,与3D-GS和MipNeRF360相比,本文方法能保证实时性,并取得性能提升。

定性结果:与3D-GS相比,本文方法可以减少伪影产生并保留更多细节。

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

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

相关文章

LabVIEW电能质量监测系统

LabVIEW电能质量监测系统 随着全球能源需求的增加以及能源危机的加剧,对电能的有效利用和质量监控变得越来越重要。特别是在电力系统中,电能质量的监测对于保证电力设备的稳定运行和提高能源利用效率具有重要意义。采用LabVIEW软件开发了一套高效的电能…

使用PHPStudy搭建Cloudreve网盘服务

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局&#…

充电桩项目实战:短信功能 分布式限流

你好,我是田哥 最近,我在对充电桩项目进行微服务升级中,肯定会遇到一些问题 前面分享了:充电桩项目实战:搞定多数据源! 题外话:如果想年后找到更好的工作,推荐看这篇文章&#xff1a…

高端酒店宴会包间桌位预定小程序h5开源版开发

高端酒店宴会包间桌位预定小程序h5开源版开发 餐厅预定桌位系统,支持多店切换预约,提供全部前后台无加密源代码和数据库 功能特性 为你介绍餐厅预订系统的功能特性 多端适配 采用uniapp,目前适配小程序和微信H5 多店铺 支持多店铺预定 付费和免费预定 支…

介绍 HTTPS 中间人攻击

介绍 HTTPS 中间人攻击 https协议是由httpssl协议构成的。 客户端和服务端SSL或TLS能够相互通信的基本步骤 确定使用协议的版本 选择加密算法 通过交换和验证数字证书彼此进行身份验证 使用非对称加密技术生成共享密钥,避免密钥分发问题。 SSL或TLS使用共享密钥对消…

软件包模块、服务模块、逻辑卷模块、文件系统模块、playbook剧本,YAML语法规范、playbook剧本案例

ansible ansible模块 yum_repository 用于配置yum 常用选项: file: 指定文件名其他选项,请与文件内容对照 # 在webservers组中的主机上,配置yum[rootpubserver ansible]# ansible webservers -m yum_repository -a "file…

请解释Java中的equals()和hashCode()方法的作用和区别。请解释Java中的AOP(面向切面编程)的作用和原理。

请解释Java中的equals()和hashCode()方法的作用和区别。 在Java中,equals()和hashCode()方法都是用于处理对象相等性(equality)的方法。 equals()方法: equals()方法是Object类中定义的方法,所有的Java类都可以使用该…

vscode连接ssh失败记录(20240202)

问题描述: 1、在使用vscode remote-ssh插件时连接较老版本linux时,出现报错Warning: Missing GLIBC > 2.28! from /lib/x86_64-linux-gnu/libc-2.27.so Error: Missing required dependencies. Please refer to our FAQ https://aka.ms/vscode-rem…

算法随想录第五十天打卡123.买卖股票的最佳时机III , 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 这道题一下子就难度上来了,关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。 视频讲解:动态规划,股票至多买卖两次,怎么求? | …

『运维备忘录』之 Systemd 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

什么是 Java 中的 IO 和 NIO?它们之间有什么区别?什么是 Java 中的内存管理和垃圾回收?常见的垃圾回收算法有哪些?

什么是 Java 中的 IO 和 NIO?它们之间有什么区别? 在 Java 中,IO(Input/Output)和NIO(New IO)都是用于处理输入输出操作的API。它们之间有以下区别: IO(传统IO&#xff…

11月最新版付费进群源码自动定位+开源

Nginx 1.22.1 php5.6 mysql5.6 数据库配置&#xff1a;/config/database.php 配置后台域名&#xff1a;config/extra/ip.php 设置伪静态thinkphp 后台账号88886666 密码12345 代码结构 关键代码剖析 <?php // ----------------------------------------------------…

continue语句

一、continue语句 1、continue语句介绍 2、continue语句流程图 3、快速入门案例 4、continue语句的标签

毫米波雷达在汽车领域的原理、优势和未来趋势

1 毫米波雷达的原理 汽车引入毫米波雷达最初主要是为了实现盲点监测和定距巡航。毫米波实质上是电磁波&#xff0c;其频段位于无线电和可见光、红外线之间&#xff0c;频率范围为10GHz-200GHz。工作原理类似一般雷达&#xff0c;通过发射无线电波并接收回波&#xff0c;利用障…

LeetCode 每日一题 2024/1/29-2024/2/4

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 1/29 514. 自由之路1/30 2808. 使循环数组所有元素相等的最少秒数1/31 2670. 找出不同元素数目差数组2/1 LCP 24. 数字游戏2/2 1686. 石子游戏 VI2/3 1690. 石子游戏 VII2/…

理论与实战:一篇看懂Python词云

实现原理 导入一篇txt文档&#xff0c;使用jieba库对文档中的文字进行分词&#xff0c;计算各个词汇出现的频率&#xff0c;使用wordcloud库按照词汇频率的大小生成词云。 注意&#xff0c;不是使用wordcloud.generate()&#xff0c;这个方法没有按照词汇频率的方式实现词云 停…

Linux 驱动开发基础知识——总线设备驱动模型(七)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

Linux常见面试题汇总

Linux上如何查询某个端口是否被占用&#xff1f; 在Linux上&#xff0c;你可以使用以下几种方法来查询某个端口是否被占用&#xff1a; 使用netstat命令&#xff1a; netstat -tuln | grep <端口号>这个命令会列出当前正在运行的所有TCP和UDP端口&#xff0c;并过滤出指…

极速搭建幻兽帕鲁私服,叫上好友春节假期一起联机畅玩帕鲁

文章目录 前言幻兽帕鲁私服详细部署教程查看服务器开始游戏自定义游戏参数配置 前言 行业资讯 《幻兽帕鲁》的火爆对开发商 Pocketpair 来说&#xff0c;代价是巨大的。该游戏的成功让首席执行官沟部拓郎最近在推特上表示&#xff0c;他可能因服务器运营费用而面临破产。据他透…

多线程例子,通过启动三个线程 等三个线程都跑完后打印结果

一个多线程例子&#xff0c;通过启动三个线程 等三个线程都跑完后打印结果 需求描述&#xff1a;开启一个多线程跑3条门店的数据&#xff0c;每个门店都新起一个线程去跑数据&#xff0c;当所有线程跑完后主线程打印结果&#xff0c;记录报错的门店编码 1.线程池配置类 impo…