3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering

  • 1. 预备知识
    • 1.1 球谐函数
    • 1.2 Splatting
    • 1.3 α \alpha α blending
    • 1.4 多维高斯的协方差矩阵
      • 1.4.1 高斯与椭球体的关系
      • 1.4.2 世界坐标系下的三维高斯到二维像素平面投影过程
  • 2. 3D Gaussian Splatting
    • 2.1 特点
    • 2.2 流程与关键步骤
      • 2.2.1 场景表达
      • 2.2.2 整体流程
    • 2.3 算法伪代码
      • 2.3.1 整体流程伪代码
      • 2.3.2 光栅化伪代码

Reference:

  1. 深蓝学院:NeRF基础与常见算法解析
  2. GitHub: gaussian-splatting
  3. 原文官网
  4. A Survey on 3D Gaussian Splatting
  5. 开始弃用NeRF?为什么Gaussian Splatting在自动驾驶场景如此受欢迎?

相关文章:

  1. NeRF 其一:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
  2. NeRF 其二:Mip-NeRF
  3. NeRF 其三:Instant-NGP

系列文章:

  1. 3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering

3D Gaussian Splatting 是表达三维场景的一种方式,不同于 NeRF 用一个点来表达,它是用一堆的 3D 高斯来表达。

在这里插入图片描述
问题定义:

  1. 辐射场:辐射场是三维空间中光分布的表示,它捕捉光如何与环境中的表面和材料相互作用。从数学上讲,辐射场可以描述为函数 L : R 5 → R + L: R^5 \rightarrow R^{+} L:R5R+,其中 L ( x , y , z , θ , ϕ ) L(x, y, z, \theta, \phi) L(x,y,z,θ,ϕ) 将空间中的一个点 ( x , y , z ) (x, y, z) (x,y,z) 和由球面坐标 ( θ , ϕ ) (\theta, \phi) (θ,ϕ) 指定的方向映射到非负辐射值。辐射场可以通过隐式或显式表示进行封装,每种表示都具有特定的场景表示和渲染优势。

  2. 隐式辐射场:隐式辐射场表示场景中的光分布,而不明确定义场景的几何体。在深度学习时代,它经常使用神经网络来学习连续的体积场景表示。最突出的例子是 NeRF。在NeRF中,MLP网络用于将一组空间坐标 ( x , y , z ) (x, y, z) (x,y,z) 和观看方向 ( θ , ϕ ) (\theta, \phi) (θ,ϕ) 映射到颜色和密度值。任何点的辐射度都不是明确存储的,而是通过查询神经网络实时计算的。因此,函数可以写成:
    L implicit  ( x , y , z , θ , ϕ ) = NeuralNetwork  ( x , y , z , θ , ϕ ) . L_{\text {implicit }}(x, y, z, \theta, \phi)=\text { NeuralNetwork }(x, y, z, \theta, \phi) . Limplicit (x,y,z,θ,ϕ)= NeuralNetwork (x,y,z,θ,ϕ).这种格式允许对复杂场景进行可微分和紧凑的表示,尽管由于体积光线行进,渲染过程中的计算负载往往很高。

  3. 显式辐射场:相反,显式辐射场直接表示离散空间结构中的光分布,例如体素网格或点集。该结构中的每个元素存储其在空间中的相应位置的辐射信息。这种方法允许更直接且通常更快地访问辐射数据,但代价是更高的内存使用率和潜在的更低分辨率。显式辐射场表示的一般形式可以写成:
    L explicit  ( x , y , z , θ , ϕ ) = DataStructure ⁡ [ ( x , y , z ) ] ⋅ f ( θ , ϕ ) , ( 2 ) L_{\text {explicit }}(x, y, z, \theta, \phi)=\operatorname{DataStructure}[(x, y, z)] \cdot f(\theta, \phi),(2) Lexplicit (x,y,z,θ,ϕ)=DataStructure[(x,y,z)]f(θ,ϕ),(2)其中 DataStructure 可以是网格或点云, f ( θ , ϕ ) f(\theta, \phi) f(θ,ϕ) 是基于观看方向修改辐射的函数。

  4. 两全其美的3D Gaussian Splatting:3D GS表示从隐式辐射场到显式辐射场的转变。它通过利用3D高斯作为灵活高效的表示,利用了这两种方法的优势。这些高斯系数经过优化,可以准确地表示场景,结合了基于神经网络的优化和显式结构化数据存储的优点。这种混合方法旨在通过更快的训练和实时性能实现高质量渲染, 特别是对于复杂的场景和高分辨率输出。3D 高斯表示公式化为:
    L 3 D G S ( x , y , z , θ , ϕ ) = ∑ i G ( x , y , z , μ i , Σ i ) ⋅ c i ( θ , ϕ ) L_{3 \mathrm{DGS}}(x, y, z, \theta, \phi)=\sum_i G\left(x, y, z, \boldsymbol{\mu}_i, \boldsymbol{\Sigma}_i\right) \cdot c_i(\theta, \phi) L3DGS(x,y,z,θ,ϕ)=iG(x,y,z,μi,Σi)ci(θ,ϕ)

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_1+I_{BK}\times(1-\alpha_1) Iresult=I1×α1+IBK×(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_3+I_{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} Iresult=I1×α1+(1α1)(I2×α2+(1α2)(I3×α3+IBK×(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_3+I_{BK}\times(1-\alpha_3) I3×α3+IBK×(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_3+I_{BK}\times(1-\alpha_3)) I2×α2+(1α2)(I3×α3+IBK×(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_{j=1}^{i-1}(1-\alpha_j) C=iNciαij=1i1(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_{i=1}^NT_i(1-\exp(-\sigma_i\delta_i))\mathbf{c}_i\quad\mathrm{with}\quad T_i=\exp\left(-\sum_{j=1}^{i-1}\sigma_j\delta_j\right) C=i=1NTi(1exp(σiδi))ciwithTi=exp(j=1i1σjδj)使用 α i \alpha_i αi 来替代 1 − exp ⁡ ( − σ i δ i ) 1-\exp(-\sigma_i\delta_i) 1exp(σ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_{i=1}^NT_i\alpha_i\mathbf{c}_i\quad\alpha_i=(1-\exp(-\sigma_i\delta_i))\text{and}T_i=\prod_{j=1}^{i-1}(1-\alpha_i) C=i=1NTiαiciαi=(1exp(σiδi))andTi=j=1i1(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)=e21(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ΛPT=PΛ21(Λ21)TPT Σ = R S S T R T \Sigma=RSS^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)=e21(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}} e21 这一部分是固定计算的。还是以协方差矩阵 [ σ 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+σ22x22=const这就是一个椭球,其长短轴与 σ \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) xwN(μ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 xc=Wcwxw+T,这里用 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) xcN(Wcwμw+T,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}) z=F(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}) zF(μc)2×1+J2×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_z=J\Sigma_cJ^T=JW\Sigma_wW^TJ^T) Σz=JΣcJT=JWΣwWTJT);均值为 μ z = F ( μ c ) = F ( W μ x + T ) \boldsymbol{\mu_z} = F(\boldsymbol{\mu_c})=F(W\boldsymbol{\mu_x}+T) μz=F(μc)=F(Wμx+T)

有了上述这些知识,就可以学习 3D Gaussian Splatting 技术了。

2. 3D Gaussian Splatting

2.1 特点

3D Gaussian Splatting 和 NeRF 一样,所做的任务也是新视图合成。它有以下特点:

  1. 使用光栅化渲染方式,而非基于射线的体渲染方式
    与 NeRF 的区别在于,光栅化的渲染方式是将三维空间的一个物体投到二维图像上形成对应的颜色;而体渲染方式是从图像上的点(视线)触发,将光线上的点进行汇聚形成一个点的颜色 C C C。所以一个是正向而另一个是逆向的过程,两个的渲染方式是完全不一样的。
    在这里插入图片描述

  2. 使用多个 3 D 3D 3D 高斯椭球显式的表达场景
    在 NeRF 里去表达一个三维场景的信息时,使用的是三维场景的点和它的体密度值σ、颜色C。3DGS内不再用点表达,而是使用 3D 高斯组件替代了点,所以在空间中的表达是一堆堆的3D高斯。这些3D高斯的信息没有保存在神经网络里,而是存在了硬盘上,所以它是一个显式的表达场景。

  3. 推理速度快、 质量高

  4. 未使用神经网络

需要注意的是,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 J=3 J=3,即有 16 16 16 个基(系数),那么 RGB 一共有 48 48 48 个系数。当然使用的阶数越高,模型就越精确,但是要求的系数也越多。

综上,一个高斯球总共有 59 59 59 个系数,只要给到这 59 59 59 个系数,那么这个高斯球的性质就完全确定了。

2.2.2 整体流程

  1. 基于SFM得到点云初始化 3D 高斯, 每个三维点初始化为一个高斯椭球
    在这里插入图片描述初始化时的输入量使用的是 COLMAP 等 SFM 方式输出的点云,这里与 NeRF 就完全不同了,NeRF 使用的 仅是 COLMAP 等输出的相机位姿,而 3DGS 中,这些点云是有用的。3DGS 将根据这些点云进行初始化:基于这些点云的位置,会在每一个位置上放置一个高斯球,系数随机。

  2. 给定摄像机内、 外参数及标答图像,将椭球 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)} \\ &\Sigma=RSS^TR^T \\ &\Sigma'=JW\Sigma W^TJ^T \end{aligned} G(x)=e21(x)TΣ1(x)Σ=RSSTRTΣ=JWΣWTJT

  3. 通过 α \alpha α blending 进行光栅化渲染
    在这里插入图片描述3DGS 从近到远每个球投下来以后都形成了一个图像区,那么在重叠区域就可以进行光栅化的融合了。每个点都进行融合以后就可以得到图像。

  4. 与标答图像计算损失
    在这里插入图片描述使用的损失函数为: 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 内,每次采集一小批图,以图像为单位进行损失计算。

  5. 梯度回传
    有了损失,就可以以梯度回传的方式更新 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 光栅化伪代码

在这里插入图片描述

整体流程为:

  1. 将图像分为 16 × 16 16\times16 16×16 个块, 为每个块筛选 视锥体(view frustum) 内的 3D高斯椭球;
  2. 实例化高斯椭球,即为其分配索引值与键值;
  3. 根据 键值(key) 中的深度信息对高斯椭球进行排序
  4. 将排好序的高斯椭球从近到远向对应块上做 Splatting;
  5. 在每个块上做 α-blending。

One more thing,注意一个高斯球往下投影时,这一个高斯球投影到图像中每个点的 α \alpha α 值是不一样的,每个点的透明度还考虑了点距离中心的距离,即前面所讲的 G ( z ) G(z) G(z)。所以,这个点的透明度由 P ′ α P'\alpha Pα 决定,也就是说在投影过程中,透明度是从中间向外衰减的,这也就是 Splatting 的过程。

在这里插入图片描述

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

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

相关文章

web架构师编辑器内容-编辑器组件图层面板功能开发-锁定隐藏、键盘事件功能的开发

我们这一部分主要是对最右侧图层面板功能进行剖析,完成对应的功能的开发: 每个图层都对应编辑器上面的元素,有多少个元素就对应多少个图层,主要的功能如下: 锁定功能:点击锁定,在编辑器中没法编辑对应的组…

gin+gorm增删改查目录框架

从网上找资料,发现,很多都是直接的结构 路由,后端的controller层,还有model层,都是放在了同一个main.go文件中,如果写项目的话,还得自己去拆文件,拆代码,经过查询和自己总结,下面放…

如何在 Ubuntu / Raspbian 上安装 MariaDB

Raspberry Pi OS(原为Raspbian)是为树莓派基于Debian开发的操作系统。 从2015年起,树莓派基金会正式将其作为树莓派的官方操作系统。 Raspbian是由Mike Thompson和Peter Green创建的一个独立项目。第一个版本于2012年6月发布,至…

SQL慢语句执行的很慢,如何分析优化呢,(如何优化的呢?)

慢查询出现的情况: SQL执行慢如何解决? 可以采用MySQL自带的分析工具Explain。 通过key和key_len检查是否命中了索引(如果你已经添加了索引,还可以判断索引是否失效)通过type字段查看SQL是否有进一步优化的空间&#…

macOS修改默认时区显示中国时间

默认时区不是中国,显示时间不是中国时间 打开终端 ,删除旧区,并复制新时区到etcreb sudo -rm -rf /etc/localtime sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 重启系统后时间显示为中国时间

k8s节点RouteCreated为false

出现该情况后,一般是初始化节点失败。因此,需要把节点从集群中移除,再加入到集群中,即可解决。 通常出现这个状况后,该节点上是没有被分配pod ip的,可以通过命令查看: # 发现没有PodCIDR、PodC…

蓝桥杯java基础

数组的倒序与隔位输出 时间限制:1.000S 空间限制:128MB 题目描述 给定一个整数数组,编写一个程序实现以下功能: 1. 将输入的整数数组倒序输出,每个数之间用空格分隔。 2. 从正序数组中,每隔一个单位&a…

【C语言基础考研向】05 scanf读取标准输入超详解

文章目录 一.scanf函数的原理 样例问题原因解决方法 二.多种数据类型混合输入 错误样例正确样例 一.scanf函数的原理 C语言未提供输入/输出关键字,其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入,键盘输入又被称为标准输入。…

【Docker】未来已来 | Docker技术在云计算、边缘计算领域的应用前景

欢迎来到英杰社区: https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区: https://bbs.csdn.net/topics/617897397 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步&#xff…

Spring Boot多环境配置

Spring Boot的针对不同的环境创建不同的配置文件, 语法结构:application-{profile}.properties profile:代表的就是一套环境 1.需求 application-dev.yml 开发环境 端口8090 application-test.yml 测试环境 端口8091 application-pro…

【Python】--- 基础语法(1)

目录 1.变量和表达式2.变量和类型2.1变量是什么2.2变量的语法2.3变量的类型2.3.1整数2.3.2浮点数(小数)2.3.3字符串2.3.4布尔2.3.5其他 2.4为什么要有这么多类型2.5动态类型特征 3.注释3.1注释的语法3.2注释的规范 结语 1.变量和表达式 对python的学习就…

SpringCloud之Nacos的学习、快速上手

1、什么是Nacos Nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案,用来实现配置中心和服务注册中心。 Nacos 快速开始 2、安装运行nacos nacos下载地址 下载地址: https://github.com/alibaba/nacos/rel…

Linux第33步_TF-A移植的第1步_创建新的设备树

TF-A移植第1步就是创建新的设备树,并命名为“stm32mp157d-atk”。 和“TF-A移植”有关的知识点: 1)设备树英文名字叫做Device tree,用来描述板子硬件信息的,比如开发板上的 CPU有几个核 、每个CPU核主频是多少,IIC、…

使用 MinIO 和 PostgreSQL 简化数据事件

本教程将教您如何使用 Docker 和 Docker Compose 在 MinIO 和 PostgreSQL 之间设置和管理数据事件,也称为存储桶或对象事件。 您可能已经在利用 MinIO 事件与外部服务进行通信,现在您将通过使用 PostgreSQL 自动化和简化数据事件管理来增强数据处理能力…

【C++】STL 算法 - 累加填充算法 ( 元素累加算法 - accumulate 函数 | 元素填充算法 - fill 函数 )

文章目录 一、元素累加算法 - accumulate 函数1、函数原型分析2、代码示例 二、元素填充算法 - fill 函数1、函数原型分析2、代码示例 一、元素累加算法 - accumulate 函数 1、函数原型分析 在 C 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 accu…

2024 年最佳 PDF 编辑器:我的首选清单

在我们日益多设备、跨平台的世界中,PDF 可能比以往任何时候都更有用。有大量免费的 PDF 阅读器可让您审阅和评论这些文件,但不可避免地,您需要具有编辑 PDF 的能力。这通常需要升级到高级 PDF 编辑器。 Adobe Acrobat 是最著名的&#xff0c…

20240119-子数组最小值之和

题目要求 给定一个整数数组 arr,求 min(b) 的总和,其中 b 的范围涵盖 arr 的每个(连续)子数组。由于答案可能很大,因此返回答案模数 Example 1: Input: arr [3,1,2,4] Output: 17 Explanation: Subarrays are [3]…

Unity3D学习之Unity基础——3D数学

文章目录 1. 前言2 Mathf和Math基础2.1 一般用于只计算一次的函数2.1.1 PI Π PI2.1.2 取绝对值 Abs2.1.3 向上取整 CeilToInt2.1.4 向下取整 FloorToInt2.1.5 钳制函数 Clamp2.1.6 获取最大值 Max2.1.7 获取最小值 Min2.1.8 一个数的n次幂 Pow2.1.9 四舍五入 RoundToInt2.1.10…

苹果Find My可查找添加32件物品,伦茨科技ST17H6x芯片加速产品赋能

苹果最近更新的支持文档证实,从 iOS 16 开始,"Find My"可查找添加物品从16件增加到32件,AirTag 和“查找”网络中的物品利用“查找”网络的强大功能来发挥作用,这个网络由数亿台加密的匿名 Apple 设备构成。“查找”网络…

【Unity】AB包下载

【Unity】AB包下载 1.使用插件打AB包 a.AB包分类 一般地,将预制体作为AB包资源,不仅需要对预制体本身进行归类,还要对其涉及的动画(AnimationClip)、动画状态机(AnimatorController)、以及所…