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

这篇具有很好参考价值的文章主要介绍了3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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
  4. Structure-from-Motion Revisited(COLMAP) 流程介绍

系列文章:

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

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

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS
问题定义:

  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(θ,ϕ)

Implicit Neural Representation(隐式神经表达) 对场景建模导致了许多问题:

  • query过程(可以理解为射线渲染)需要大量的采样,渲染方法成本很高
  • 用了大型多层MLP,运算量大,占用内存高
  • 不容易编辑
  • 不能显式地对空间几何建模
  • 导致“遗忘”问题(在不重新访问之前训练数据的情况下不断从流数据中学习时,会遇到灾难性的遗忘问题,这种情况在大场景下容易出现)

1. 预备知识

1.1 球谐函数

球谐函数这一块请阅读 Instant-NGP 一文内的相关片段:NeRF 其三:Instant-NGP,此处不再做赘述。

1.2 Splatting

Splatting(抛雪球) 是一种用于光栅化(rasterizer) 3D 对象(如椭球)的技术。这些 3D 对象被映射到投影平面后得到的 2D 图形称为 splat,类似于一个点、圆、矩形或其他形状,就像雪球打在墙上留下的印记,能量从中心向外扩散并减弱(就像抛出一个雪球砸在墙上一样)。

换句话说,三维场景不用三维点表达,而用一个个高斯球来表达。将一个个高斯球投影到二维图像上的过程就称为 Splatting 算法。
3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS该光栅化过程可以在 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)3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS那么按照深度由近到远的排序四张图像,其中,图像 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 轴上方黑线所示。
3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS

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。所以一个是正向而另一个是逆向的过程,两个的渲染方式是完全不一样的。
    3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS

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

  3. 推理速度快、 质量高

  4. 未使用神经网络

需要注意的是,3D Gaussian Splatting 与 NeRF 是完全不同的思想。不要认为 3D Gaussian Splatting 是在改进 NeRF 的某个环节,它俩的思维方式完全不一样

2.2 流程与关键步骤

论文大体流程如下:
3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS

2.2.1 场景表达

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS
文中是以 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 高斯, 每个三维点初始化为一个高斯椭球
    3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS初始化时的输入量使用的是 COLMAP 等 SFM 方式输出的点云,这里与 NeRF 就完全不同了,NeRF 使用的 仅是 COLMAP 等输出的相机位姿,而 3DGS 中,这些点云是有用的。3DGS 将根据这些点云进行初始化:基于这些点云的位置,会在每一个位置上放置一个高斯球,系数随机。

  2. 给定摄像机内、 外参数及标答图像,将椭球 splatting 到图像上
    3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS给定相机位姿,就可以将这一个个 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 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS3DGS 从近到远每个球投下来以后都形成了一个图像区,那么在重叠区域就可以进行光栅化的融合了。每个点都进行融合以后就可以得到图像。

  4. 与标答图像计算损失
    3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,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 内,每次采集一小批图,以图像为单位进行损失计算。

  5. 梯度回传
    有了损失,就可以以梯度回传的方式更新 3DGS 球的属性,并能控制高斯球的克隆与分裂。

    • 上支更新 3D 高斯椭球体的属性;
      3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS ① 可微分光栅化渲染器里面都是一些加法和乘法,肯定是可以回传的;
      ② 函数 F F F 没有学习的必要,也没有系数需要去学习。所以需要更新的只有 3 D 3D 3D 高斯球的那 59 59 59 个属性。

    • 下支实现 3D 高斯椭球体的克隆和分裂等。
      3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS

      • 学习过程中,较大梯度的高斯椭球存在 欠重构(under-reconstruction)过重构(over-reconstruction) 问题。
        梯度在传过来时没有更新任何参数,只是通过对这 59 59 59 维导数的模值来确定当前高斯球,是否存在欠重构或过重构的问题,如果是就进行复制或分裂。这个步骤是不可导的。
        3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS
        ① 欠重构区域的高斯椭球方差小, 进行复制操作;
        可以看到上图中的几何体,又是很难用一个高斯球去描述这个几何体的形状,所以就对高斯球进行克隆,克隆的操作是不可导的。克隆完再优化就成了右边的样子。
        ② 过重构区域的高斯椭球方差大, 进行分裂操作;
        图中可以看到方差大的高斯球太大了,拟合覆盖了全部形状,但有太多不属于这个几何形体的形状,这样描述是不准确的。
        ③ 每经过固定次数的迭代进行一次剔除操作, 剔除几乎透明的高斯椭球以及方差过大的高斯椭球。

2.3 算法伪代码

2.3.1 整体流程伪代码

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS

2.3.2 光栅化伪代码

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS

整体流程为:

  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 的过程。

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering,# NeRF,3d,nerf,神经网络,3DGS文章来源地址https://www.toymoban.com/news/detail-800962.html

到了这里,关于3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [SIGGRAPH-23] 3D Gaussian Splatting for Real-Time Radiance Field Rendering

    pdf | proj | code 本文提出一种新的3D数据表达形式3D Gaussians。每个Gaussian由以下参数组成:中心点位置、协方差矩阵、可见性、颜色。通过世界坐标系到相机坐标系,再到图像坐标系的仿射关系,可将3D Gaussian映射到相机坐标系,通过对z轴积分,可得到对应Splatting 2D分布。 针对

    2024年02月04日
    浏览(49)
  • 3D Gaussian Splatting for Real-Time Radiance Field Rendering(论文中代码复现)

    3D Gaussian Splatting for Real-Time Radiance Field Rendering https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/ 主要研究方法是使用3D高斯光点绘制(3D Gaussian Splatting)方法进行实时光辐射场渲染。该方法结合了3D高斯场表示和实时可微分渲染器,通过优化3D高斯场的属性和密度控制,实现了高质

    2024年02月03日
    浏览(48)
  • 3D Gaussian Splatting for Real-Time Radiance Field Rendering论文中代码复现及排错过程

    graphdeco-inria/gaussian-splatting: Original reference implementation of “3D Gaussian Splatting for Real-Time Radiance Field Rendering” (github.com) 以下是最初电脑所安装的内容: Anaconda3 2022.10-Windows-x86_64 CUDA 电脑只支持11.6,所以装的是11.6版本。 使用git去克隆repository 尽管挂了梯子,但是还是需要多次刷

    2024年02月05日
    浏览(56)
  • GPS-Gaussian:Generalizable Pixel-wise 3D Gaussian Splatting for Real-time Human Novel View Synthesis

    1)仿射变换 quad 所谓仿射变换,就是向量经过一次线性变换加一次平移变换,用公式可以表示为: quad 其中,p为变换前原始向量,q为变换后目标向量,A为线性变换矩阵,b为平移变换向量。 quad 对于二维图像而言,p和q分别是某个像素点在原图和仿射变换后的图中的未知(

    2024年02月03日
    浏览(45)
  • 3DGS(3D Guassian Splatting)部署验证+个人数据训练

    我是先阅读一遍官方文档,后来发现版本有要求,看了半天,后来下定决心尝试下和官方要求的不一样的环境是否可以运行。 结论:python3.10 +cuda12.3+pytorch2.2.1可以运行。 以下过程供大家参考! GPU:4090 cudatoolkit visual studio 2022 win11 conda 按照以下步骤依次操作。 按需下载 TT+D

    2024年03月10日
    浏览(56)
  • DreamGaussian: Generative Gaussian Splatting for Efficient 3D Content Creation解读

    太卷啦,太卷啦,视觉太卷啦,赶紧跑路吧~_~ 介绍DreamGaussian: Generative Gaussian Splatting for Efficient 3D Content Creation论文方法,解释原理,本文不是机械翻译,而是尝试讲解方法原理 论文地址:https://arxiv.org/abs/2309.16653 github地址:https://github.com/dreamgaussian/dreamgaussian?tab=readme-ov-fil

    2024年04月09日
    浏览(43)
  • 【反渲染高斯】GS-IR: 3D Gaussian Splatting for Inverse Rendering

    会有自己的理解PS,不保证正确,欢迎评论中指出错误。 我们提出了一种基于3D高斯溅射(GS)的新型反向渲染方法GS-IR,它利用前向映射体渲染forward mapping volume rendering来实现逼真的新视图合成和重照明结果。与先前使用隐式神经表征和体绘制(例如NeRF)的工作不同,这些工作具有

    2024年02月19日
    浏览(39)
  • 3dgs学习(二)—— 3d高斯与协方差矩阵及其几何意义

    3d高斯,及3维空间内的正态分布。 通过一元正态分布的坐标系图像不难想象,3维空间中的正态分布点集中在一片椭球空间中,各方向长轴取决于各方向正态分布的方差。 而协方差矩阵通过计算多元之间的协方差关系,反映了椭球在空间中所呈现的几何形态,具体表现方法见

    2024年04月15日
    浏览(68)
  • LiDAR SLAM 闭环——BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM

    标题:BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM 作者:Yunge Cui,Xieyuanli Chen,Yinlong Zhang,Jiahua Dong,Qingxiao Wu,Feng Zhu 机构:中科院沈阳自动化研究所 来源:2022 RAL 现算法已经开源,代码链接: GitHub - YungeCui/BoW3D: [RA-L] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM.      

    2024年02月12日
    浏览(51)
  • 【3D-GS】Gaussian Splatting SLAM——基于3D Gaussian Splatting的全网最详细的解析

    3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文:link code:link video:link 1. 开山之作 Nerf 一切的开始都是起源于 NERF 开山之作 这里由详细的学习与拆解 【NERF】入门学习整理(一) 【NERF】入门学习整理(二) 【NERF】入门学习整理(三) 【NeRF数据集】LLFF格式数据集处理co

    2024年04月15日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包