企业网站建设 毕业设计,网站建设实施规范,wordpress切换作者,个人网站 平台3DGS 其一#xff1a;3D Gaussian Splatting for Real-Time Radiance Field Rendering 1. 预备知识1.1 球谐函数1.2 Splatting1.3 α \alpha α blending1.4 多维高斯的协方差矩阵1.4.1 高斯与椭球体的关系1.4.2 世界坐标系下的三维高斯到二维像素平面投影过程 2. 3D Gaussia… 3DGS 其一3D Gaussian Splatting for Real-Time Radiance Field Rendering 1. 预备知识1.1 球谐函数1.2 Splatting1.3 α \alpha α blending1.4 多维高斯的协方差矩阵1.4.1 高斯与椭球体的关系1.4.2 世界坐标系下的三维高斯到二维像素平面投影过程 2. 3D Gaussian Splatting2.1 特点2.2 流程与关键步骤2.2.1 场景表达2.2.2 整体流程 2.3 算法伪代码2.3.1 整体流程伪代码2.3.2 光栅化伪代码 Reference 深蓝学院NeRF基础与常见算法解析GitHub: gaussian-splatting原文官网A Survey on 3D Gaussian Splatting
相关文章
NeRF 其一NeRF: Representing Scenes as Neural Radiance Fields for View SynthesisNeRF 其二Mip-NeRFNeRF 其三Instant-NGP
系列文章
3DGS 其一3D Gaussian Splatting for Real-Time Radiance Field Rendering
3D Gaussian Splatting 是表达三维场景的一种方式不同于 NeRF 用一个点来表达它是用一堆的 3D 高斯来表达。 1. 预备知识
1.1 球谐函数
球谐函数这一块请阅读 Instant-NGP 一文内的相关片段NeRF 其三Instant-NGP此处不再做赘述。
1.2 Splatting
Splatting(抛雪球) 是一种用于光栅化(rasterizer) 3D 对象(如椭球)的技术。这些 3D 对象被映射到投影平面后得到的 2D 图形称为 splat类似于一个点、圆、矩形或其他形状就像雪球打在墙上留下的印记能量从中心向外扩散并减弱(就像抛出一个雪球砸在墙上一样)。
换句话说三维场景不用三维点表达而用一个个高斯球来表达。将一个个高斯球投影到二维图像上的过程就称为 Splatting 算法。 该光栅化过程可以在 GPU 上并行处理因为每个 Splat 之间是独立的。
1.3 α \alpha α blending α \alpha α blending 算法主要解决“图层”叠加问题。
两幅图融合其中图像 I 1 I_1 I1 的透明度为 α 1 \alpha_1 α1(前景图像)图像 I B K I_{BK} IBK 为背景图像融合公式计算如下 I r e s u l t I 1 × α 1 I B K × ( 1 − α 1 ) (1) \tag{1} I_{\mathrm{res}ult}I_1\times\alpha_1I_{BK}\times(1-\alpha_1) IresultI1×α1IBK×(1−α1)(1)那么按照深度由近到远的排序四张图像其中图像 I 1 I_1 I1 的透明度为 α 1 \alpha_1 α1 图像 I 2 I_2 I2 的透明度为 α 2 \alpha_2 α2图像 I 3 I_3 I3 的透明度为 α 3 \alpha_3 α3图像 I B K I_{BK} IBK 为背景图像融合公式计算如下 I result I 1 × α 1 ( 1 − α 1 ) ( I 2 × α 2 ( 1 − α 2 ) ( I 3 × α 3 I B K × ( 1 − α 3 ) ) ) α 1 I 1 ( 1 − α 1 ) α 2 I 2 ( 1 − α 1 ) ( 1 − α 2 ) α 3 I 3 ( 1 − α 1 ) ( 1 − α 2 ) ( 1 − α 3 ) I B K (2) \tag{2} \begin{aligned} I_\text{result} I_ 1 \times \alpha _ 1 ( 1 - \alpha _ 1 ) (I_2\times\alpha_2(1-\alpha_2)(I_3\times\alpha_3I_{BK}\times(1-\alpha_3))) \\ \alpha_1I_1(1-\alpha_1)\alpha_2I_2(1-\alpha_1)(1-\alpha_2)\alpha_3I_3(1-\alpha_1)(1-\alpha_2)\left(1-\alpha_3\right)I_{BK} \end{aligned} IresultI1×α1(1−α1)(I2×α2(1−α2)(I3×α3IBK×(1−α3)))α1I1(1−α1)α2I2(1−α1)(1−α2)α3I3(1−α1)(1−α2)(1−α3)IBK(2)可以从底往上看 I B K I_{BK} IBK 看成 I I I I 3 × α 3 I B K × ( 1 − α 3 ) I_3\times\alpha_3I_{BK}\times(1-\alpha_3) I3×α3IBK×(1−α3) 合并成 I ′ I I′将透明度 α 3 \alpha_3 α3 套入公式可得 I 2 × α 2 ( 1 − α 2 ) ( I 3 × α 3 I B K × ( 1 − α 3 ) ) I_2\times\alpha_2(1-\alpha_2)(I_3\times\alpha_3I_{BK}\times(1-\alpha_3)) I2×α2(1−α2)(I3×α3IBK×(1−α3)) 合并成 I ′ ′ I I′′将透明度 α 2 \alpha_2 α2 套入公式可得。
也可以从上往下看直接得到 Eq.2 底部公式。
综上 α \alpha α blending 公式可以写成 C ∑ i ∈ N c i α i ∏ j 1 i − 1 ( 1 − α j ) C\sum_{i\in\mathcal{N}}c_i\alpha_i\prod_{j1}^{i-1}(1-\alpha_j) Ci∈N∑ciαij1∏i−1(1−αj)回顾体渲染公式 C ∑ i 1 N T i ( 1 − exp ( − σ i δ i ) ) c i w i t h T i exp ( − ∑ j 1 i − 1 σ j δ j ) C\sum_{i1}^NT_i(1-\exp(-\sigma_i\delta_i))\mathbf{c}_i\quad\mathrm{with}\quad T_i\exp\left(-\sum_{j1}^{i-1}\sigma_j\delta_j\right) Ci1∑NTi(1−exp(−σiδi))ciwithTiexp(−j1∑i−1σjδj)使用 α i \alpha_i αi 来替代 1 − exp ( − σ i δ i ) 1-\exp(-\sigma_i\delta_i) 1−exp(−σiδi)可得 C ∑ i 1 N T i α i c i α i ( 1 − exp ( − σ i δ i ) ) and T i ∏ j 1 i − 1 ( 1 − α i ) C\sum_{i1}^NT_i\alpha_i\mathbf{c}_i\quad\alpha_i(1-\exp(-\sigma_i\delta_i))\text{and}T_i\prod_{j1}^{i-1}(1-\alpha_i) Ci1∑NTiαiciαi(1−exp(−σiδi))andTij1∏i−1(1−αi)可以发现该公式和 α \alpha α blending 公式一模一样。
这里可以得到一个很有意思的结论 α \alpha α blending 和 体渲染 都是相同的公式但是具体做法是完全不一样的体渲染是 NeRF 的一套做法 α \alpha α blending 是 3D Gaussian Splatting 的一套做法。很多游戏都是使用 α \alpha α blending 方法进行光栅化的。体渲染速度很慢而光栅化很快而且它是图形学内很成熟得东西有很多软件可以辅助加速比如 OpenGL这样就可以充分利用硬件和软件的性能。
1.4 多维高斯的协方差矩阵
如果一个随机变量 x \boldsymbol{x} x 服从高斯分布高斯分布 N ( μ , σ ) N(\mu, \sigma) N(μ,σ)那么它的概率密度函数为 p ( x ) 1 2 π σ exp ( − 1 2 ( x − μ ) 2 σ 2 ) . p\left(x\right)\frac1{\sqrt{2\pi}\sigma}\exp\left(-\frac12\frac{\left(x-\mu\right)^2}{\sigma^2}\right). p(x)2π σ1exp(−21σ2(x−μ)2).它的高维形式为 p ( x ) 1 ( 2 π ) N det ( Σ ) exp ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) p\left(x\right)\frac1{\sqrt{\left(2\pi\right)^{N}\det\left(\boldsymbol{\Sigma}\right)}}\exp\left(-\frac12{\left(\boldsymbol{x}-\boldsymbol{\mu}\right)}^{T}\boldsymbol{\Sigma}^{-1}\left(\boldsymbol{x}-\boldsymbol{\mu}\right)\right) p(x)(2π)Ndet(Σ) 1exp(−21(x−μ)TΣ−1(x−μ))这里前面系数不太重要公式可简写成 G ( x ) e − 1 2 ( x ) T Σ − 1 ( x ) G(\boldsymbol{x})e^{-\frac{1}{2}}(\boldsymbol{x})^{T}\Sigma^{-1}(\boldsymbol{x}) G(x)e−21(x)TΣ−1(x)。
现在来看看协方差矩阵的性质 二维的协方差矩阵可写成 [ a c c b ] \left [ \begin{matrix}a c \\ c b\end{matrix} \right ] [accb] 的形式、三维的 协方差矩阵可写成 [ a d e d b f e f c ] \left [ \begin{matrix}a d e \\ d b f \\ e f c\end{matrix} \right ] adedbfefc 的形式这个矩阵一定是对称的。在斜对角不为零的情况下它一定是正定的。对于这种对称矩阵它一定能有一个正交的矩阵将它三角化即 Σ P Λ P T P Λ 1 2 ( Λ 1 2 ) T P T \Sigma P \Lambda P^T P \Lambda^{\frac{1}{2}} (\Lambda^{\frac{1}{2}})^TP^T ΣPΛPTPΛ21(Λ21)TPT即 Σ R S S T R T \SigmaRSS^TR^T ΣRSSTRT也就是说只要我们要去表达一个协方差矩阵只要知道了 R R R 和 S S S 即可。而且 R R R 和 S S S 构建出的矩阵一定是单位阵。因为 R R R 是一个正交阵只要 S S S 不全为 0 0 0构建出的就是一个正定矩阵。
那么这里的协方差矩阵有什么具体的含义呢 假设有一二维矩阵 [ σ 1 2 0 0 σ 2 2 ] \left [ \begin{matrix}\sigma_1^2 0 \\ 0 \sigma_2^2\end{matrix} \right ] [σ1200σ22]该矩阵表示分布的两个维度 ( x 1 , x 2 ) T (x_1, x_2)^T (x1,x2)T 间是没有相关性的所以右上和左下矩阵的系数为 0 0 0。如果有相关性这个地方就应该有系数如果是正数 x 1 x_1 x1 增大 x 2 x_2 x2 就会增大如果是负数 x 1 x_1 x1 增大 x 2 x_2 x2 就会减小。
在没有相关性时将所有点投影到 x 1 x_1 x1 方向上它符合 σ 1 \sigma_1 σ1 的分布其分布如下图在 x 1 x_1 x1 轴上方黑线所示。
1.4.1 高斯与椭球体的关系
由于三维高斯不好表现先来从二维高斯看三维高斯与椭球体的关系 函数 G ( x ) e − 1 2 ( x ) T Σ − 1 ( x ) G(\boldsymbol{x})e^{-\frac{1}{2}}(\boldsymbol{x})^{T}\Sigma^{-1}(\boldsymbol{x}) G(x)e−21(x)TΣ−1(x)因为现在是二维 x ( x 1 , x 2 ) T \boldsymbol{x}(x_1, x_2)^T x(x1,x2)T。当 G ( x ) G(\boldsymbol{x}) G(x) 为常数时组成了这个常数的 x \boldsymbol{x} x将是一个什么样的分布形状 如果令 G ( x ) G(\boldsymbol{x}) G(x) 为常数那么就是说 ( x ) T Σ − 1 ( x ) (\boldsymbol{x})^{T}\Sigma^{-1}(\boldsymbol{x}) (x)TΣ−1(x) 应该是一个常数因为 e − 1 2 e^{-\frac{1}{2}} e−21 这一部分是固定计算的。还是以协方差矩阵 [ σ 1 2 0 0 σ 2 2 ] \left [ \begin{matrix}\sigma_1^2 0 \\ 0 \sigma_2^2\end{matrix} \right ] [σ1200σ22] 为例则公式变成了 [ x 1 x 2 ] T [ 1 σ 1 0 0 1 σ 2 ] [ x 1 x 2 ] c o n s t , 即 x 1 2 σ 1 2 x 2 2 σ 2 2 c o n s t \left [ \begin{matrix}x_1 \\ x_2 \end{matrix} \right ]^T \left [ \begin{matrix}\frac{1}{\sigma_1} 0 \\ 0 \frac{1}{\sigma_2}\end{matrix} \right ] \left [ \begin{matrix}x_1 \\ x_2 \end{matrix} \right ] const, \quad \text{即 } \frac{x_1^2}{\sigma_1^2} \frac{x_2^2}{\sigma_2^2} const [x1x2]T[σ1100σ21][x1x2]const,即 σ12x12σ22x22const这就是一个椭球其长短轴与 σ \sigma σ 以及 c o n s t const const 有关。所以所有的等势面都会构成一个个的椭球呈现上图中一圈一圈的样子。越内圈出现的等势面的概率越高越往外等势面出现的概率越低。
那么该怎样找一个将大多概率包络的高斯呢 那么就将高斯往外面找比如高斯 99 99% 99 能量的时候就把这个值找到就会形成一个包络面包络面外面点的概率是很低的里面的总概率是 99 99% 99使用这个高斯球来代表高斯分布的边界。
1.4.2 世界坐标系下的三维高斯到二维像素平面投影过程
假设世界坐标系三维空间中的一个点符合以下高斯分布 x w ∼ N ( μ w , Σ w ) \boldsymbol{x_w}\sim N(\boldsymbol{\mu_w}, \Sigma_w) xw∼N(μw,Σw)现在想知道它对应的像素坐标系对应的向量 z \boldsymbol{z} z 所对应的均值 μ z \boldsymbol{\mu_z} μz 和协方差 Σ z \Sigma_z Σz。
我们知道世界坐标系要先转换到相机坐标系已知 x c W c w x w T \boldsymbol{x_c}W_{cw}\boldsymbol{x_w}T xcWcwxwT这里用 W W W 和 T T T 指代旋转和平移因为原文是这样写的。通过这个变换就能将世界坐标系下的点转换到相机坐标系这时的 x c \boldsymbol{x_c} xc 符合分布 x c ∼ N ( W c w μ w T , W Σ w W T ) \boldsymbol{x_c}\sim N(W_{cw}\boldsymbol{\mu_w}T, W\Sigma_wW^T) xc∼N(WcwμwT,WΣwWT)。
像素坐标 z \boldsymbol{z} z 与 x c \boldsymbol{x_c} xc 间又是什么样的关系呢 [ z ⃗ 2 × 1 1 ] 1 x 3 c [ α 0 c x 0 0 β c y 0 0 0 1 0 ] [ x c ⃗ 3 × 1 1 ] \left [ \begin{matrix}\vec{z}_{2\times1} \\ 1 \end{matrix} \right ] \frac{1}{x_{3c}} \left [ \begin{matrix}\alpha 0 c_x 0 \\ 0 \beta c_y 0 \\ 0 0 1 0\end{matrix} \right ] \left [ \begin{matrix}\vec{x_c}_{3\times1} \\ 1 \end{matrix} \right ] [z 2×11]x3c1 α000β0cxcy1000 [xc 3×11]从公式内可以看到 z \boldsymbol{z} z 与 x c \boldsymbol{x_c} xc 间并不是线性关系。
这里整理整理可以得到 z \boldsymbol{z} z 与 x c \boldsymbol{x_c} xc 间的关系 z F ( x c ) \boldsymbol{z} F(\boldsymbol{x_c}) zF(xc)这里的 F F F 不再是线性函数既然不是线性函数那么从 x c \boldsymbol{x_c} xc 转到 z \boldsymbol{z} z就不再是高斯分布了。为了解决这个问题干脆对公式在 x c \boldsymbol{x_c} xc 点处进行一阶泰勒展开即 z ≈ F ( μ c ) 2 × 1 J 2 × 3 ( x c − μ c ) \boldsymbol{z} \approx F(\boldsymbol{\mu_c})_{2\times1} J_{2\times3}(\boldsymbol{x_c}-\boldsymbol{\mu_c}) z≈F(μc)2×1J2×3(xc−μc)泰勒展开以后 F ( μ c ) F(\boldsymbol{\mu_c}) F(μc) 是一个 2 × 1 2\times1 2×1 向量 J J J 是一个确定值因为在 μ c \boldsymbol{\mu_c} μc 位置进行泰勒展开以后它的雅可比是一个确定值 μ c \boldsymbol{\mu_c} μc 也是一个确定值。所以 z \boldsymbol{z} z 与 x c \boldsymbol{x_c} xc 在这里就是线性变化关系其协方差矩阵为 Σ z J Σ c J T J W Σ w W T J T ) \Sigma_zJ\Sigma_cJ^TJW\Sigma_wW^TJ^T) ΣzJΣcJTJWΣwWTJT)均值为 μ z F ( μ c ) F ( W μ x T ) \boldsymbol{\mu_z} F(\boldsymbol{\mu_c})F(W\boldsymbol{\mu_x}T) μzF(μc)F(WμxT)。
有了上述这些知识就可以学习 3D Gaussian Splatting 技术了。
2. 3D Gaussian Splatting
2.1 特点
3D Gaussian Splatting 和 NeRF 一样所做的任务也是新视图合成。它有以下特点 使用光栅化渲染方式而非基于射线的体渲染方式 与 NeRF 的区别在于光栅化的渲染方式是将三维空间的一个物体投到二维图像上形成对应的颜色而体渲染方式是从图像上的点(视线)触发将光线上的点进行汇聚形成一个点的颜色 C C C。所以一个是正向而另一个是逆向的过程两个的渲染方式是完全不一样的。 使用多个 3 D 3D 3D 高斯椭球显式的表达场景 在 NeRF 里去表达一个三维场景的信息时使用的是三维场景的点和它的体密度值σ、颜色C。3DGS内不再用点表达而是使用 3D 高斯组件替代了点所以在空间中的表达是一堆堆的3D高斯。这些3D高斯的信息没有保存在神经网络里而是存在了硬盘上所以它是一个显式的表达场景。 推理速度快、 质量高 未使用神经网络
需要注意的是3D Gaussian Splatting 与 NeRF 是完全不同的思想。不要认为 3D Gaussian Splatting 是在改进 NeRF 的某个环节它俩的思维方式完全不一样。
2.2 流程与关键步骤
论文大体流程如下
2.2.1 场景表达 文中是以 3D Gaussian 的方式存储信息每一个基本单元就是一个高斯球用一堆高斯球来表达一个场景。 每个高斯球都有以下变量
中心位置 p \boldsymbol{p} p 因为是三维高斯球所以中心位置 p \boldsymbol{p} p 也是三维的。以 R R R 和 S S S 形式表达的协方差矩阵 R R R 可以用四元数 S S S 用三个实数表达加起来就是一个七维变量对应这里的协方差矩阵。体密度 α \alpha α 一维变量。球谐波系数 这里使用的 J 3 J3 J3即有 16 16 16 个基(系数)那么 RGB 一共有 48 48 48 个系数。当然使用的阶数越高模型就越精确但是要求的系数也越多。
综上一个高斯球总共有 59 59 59 个系数只要给到这 59 59 59 个系数那么这个高斯球的性质就完全确定了。
2.2.2 整体流程 基于SFM得到点云初始化 3D 高斯 每个三维点初始化为一个高斯椭球 初始化时的输入量使用的是 COLMAP 等 SFM 方式输出的点云这里与 NeRF 就完全不同了NeRF 使用的 仅是 COLMAP 等输出的相机位姿而 3DGS 中这些点云是有用的。3DGS 将根据这些点云进行初始化基于这些点云的位置会在每一个位置上放置一个高斯球系数随机。 给定摄像机内、 外参数及标答图像将椭球 splatting 到图像上 给定相机位姿就可以将这一个个 3D 高斯球投影到图像上了投影方式依照先前所描述的分布公式 G ( x ) e − 1 2 ( x ) T Σ − 1 ( x ) Σ R S S T R T Σ ′ J W Σ W T J T \begin{aligned} G(x)e^{-\frac12(x)^T\Sigma^{-1}(x)} \\ \SigmaRSS^TR^T \\ \SigmaJW\Sigma W^TJ^T \end{aligned} G(x)e−21(x)TΣ−1(x)ΣRSSTRTΣ′JWΣWTJT 通过 α \alpha α blending 进行光栅化渲染 3DGS 从近到远每个球投下来以后都形成了一个图像区那么在重叠区域就可以进行光栅化的融合了。每个点都进行融合以后就可以得到图像。 与标答图像计算损失 使用的损失函数为 L ( 1 − λ ) L 1 λ L D-SSIM \mathcal{L}(1-\lambda)\mathcal{L}_1\lambda\mathcal{L}_{\text{D-SSIM}} L(1−λ)L1λLD-SSIM其中 L 1 \mathcal{L}_1 L1 度量两像素间差异 L D-SSIM \mathcal{L}_{\text{D-SSIM}} LD-SSIM 度量两图像间结果差异。 NeRF 内逐像素进行计算即采集一个 batch 的像素送进去训练然后输出损失而在 3DGS 内每次采集一小批图以图像为单位进行损失计算。 梯度回传 有了损失就可以以梯度回传的方式更新 3DGS 球的属性并能控制高斯球的克隆与分裂。 上支更新 3D 高斯椭球体的属性 ① 可微分光栅化渲染器里面都是一些加法和乘法肯定是可以回传的 ② 函数 F F F 没有学习的必要也没有系数需要去学习。所以需要更新的只有 3 D 3D 3D 高斯球的那 59 59 59 个属性。 下支实现 3D 高斯椭球体的克隆和分裂等。 学习过程中较大梯度的高斯椭球存在 欠重构(under-reconstruction) 和 过重构(over-reconstruction) 问题。 梯度在传过来时没有更新任何参数只是通过对这 59 59 59 维导数的模值来确定当前高斯球是否存在欠重构或过重构的问题如果是就进行复制或分裂。这个步骤是不可导的。 ① 欠重构区域的高斯椭球方差小 进行复制操作 可以看到上图中的几何体又是很难用一个高斯球去描述这个几何体的形状所以就对高斯球进行克隆克隆的操作是不可导的。克隆完再优化就成了右边的样子。 ② 过重构区域的高斯椭球方差大 进行分裂操作 图中可以看到方差大的高斯球太大了拟合覆盖了全部形状但有太多不属于这个几何形体的形状这样描述是不准确的。 ③ 每经过固定次数的迭代进行一次剔除操作 剔除几乎透明的高斯椭球以及方差过大的高斯椭球。
2.3 算法伪代码
2.3.1 整体流程伪代码 2.3.2 光栅化伪代码 整体流程为
将图像分为 16 × 16 16\times16 16×16 个块 为每个块筛选 视锥体(view frustum) 内的 3D高斯椭球实例化高斯椭球即为其分配索引值与键值根据 键值(key) 中的深度信息对高斯椭球进行排序将排好序的高斯椭球从近到远向对应块上做 Splatting在每个块上做 α-blending。
One more thing注意一个高斯球往下投影时这一个高斯球投影到图像中每个点的 α \alpha α 值是不一样的每个点的透明度还考虑了点距离中心的距离即前面所讲的 G ( z ) G(z) G(z)。所以这个点的透明度由 P ′ α P\alpha P′α 决定也就是说在投影过程中透明度是从中间向外衰减的这也就是 Splatting 的过程。