outlook

辐射场:辐射场是三维空间中光分布的表示,它捕捉光如何与环境中的表面和材料相互作用。

隐式辐射场:隐式辐射场表示场景中的光分布,而不明确定义场景的几何体。任何点的辐射度都不是明确存储的,而是通过查询神经网络实时计算的。

显式辐射场:显式辐射场直接表示离散空间结构中的光分布,例如体素网格或点集。该结构中的每个元素存储其在空间中的相应位置的辐射信息。

NeRF主要使用隐式的基于坐标的模型将空间坐标映射到像素值。

3D GS由SFM建立得到的稀疏三维点云,在建模成3D高斯后,3D高斯中明确的包含了三维世界的信息。凭借其明确的场景表示和可微分的渲染算法,不仅保证了实时渲染能力,而且引入了前所未有的控制和场景编辑水平。


NeRF

image-20250207132445865

需要有图片到输入的5D向量的前处理(粒子采集),输出的4D(密度、颜色RGB)向量到图片的后处理。

粒子的采集:

image-20250206113027221

点做差得到向量射线ray;再在每条ray上[near, far]均匀采样N_sample(64)个点。image-20250206122752673

NeRF 的原理

NeRF 中三大关键的技术点:

  1. 5D 的隐式场景表示函数;
  2. 位置编码;
  3. 分层体渲染;

img

  • 在 NeRF 技术中,也采用隐式的场景表达方式:
  • (r,g,b,α)=f(x,y,z,θ,ϕ)(r,g,b,\alpha)=f(x,y,z,\theta,\phi)(r,g,b,α)=f(x,y,z,θ,ϕ)

通过一个连续的 5D 函数,得到在每个点 (x,y,z) 朝每个方向 (θ,ϕ)(\theta,\phi)(θ,ϕ) 下的颜色和密度。

为什么要使用 5D 的参数?

  1. 对于颜色数据来说,尤其是高光反射的部分,虽然在场景中的位置相同,但是从不同的角度观察时,会得到不同的结果,所以本身除了和位置相关,也和观察角度相关;
  2. 对于密度数据来说,其表示的是观察的视线能够通过该点的概率,只和位置相关,所以先输出了α\alphaα密度。
  • MLP

  • 首先对位置进行位置编码,再通过 8 层 256 维的全链接 ReLU 层,输出体素密度 α\alphaα 和 256 维的特征向量,然后把特征向量和经过位置编码后的方向参数串联,最后经过一个 128 维的全连接层,得到与位置和方向都相关的一个颜色预测。

  • 小白向 | 从0开始用 PyTorch 构建完整的 NeRF-CSDN博客

    • 经过位置编码后,三维的位置信息,会变为 63 维的输入信息(3 维原来的信息,加上 3∗2∗10 维升维后的信息),同时,我们用三维的向量来描述视角信息,经过编码后,得到 27维的视角信息(3 维原来的信息,加上 3∗2∗4 维升维后的信息)
    • image-20250206182024868
  • 体渲染

图形学中的体渲染,模拟了光在空间中的散射、吸收等现象,NeRF 中对此进行了简化,使用了 τ(t)\tau(t)τ(t) 表示视线通过此处的概率(没有被阻碍的概率)。σ(s)\sigma(s)σ(s) 表示在s处光线碰击粒子(光线被阻碍)的概率密度。c(s)c(s)c(s)表示在s处粒子光出的颜色。

某条视线下:那么我们把此位置的颜色和可能停止在此处的概率相乘 τ(t)σ(t)Δt⋅c(t)\tau(t)\sigma(t)\Delta t\cdot c(t)τ(t)σ(t)Δtc(t) ,得到此位置对最终结果贡献的颜色,然后我们把整条视线上所有的颜色进行积分:

image-20250107102641992

得到了上述连续形式的积分方程之后,我们还需要进一步对其进行离散化。每一小段(a->b)的密度、颜色、碰撞概率不变

image-20250107102838168

积分变求和:

image-20250107103137162

得到了如何计算一条视线所得到的颜色,就可以从相机位置发出多条视线,组成画面,NeRF 的算法里面是通过 1024 条射线,来得到一幅完整的画面

img

image-20250207105255685

NeRF 中采用了多层级体素采样(Hierarchical volume sampling)的技术,该方案可以根据场景密度,自适应分布场景中的采样点。

总的来说,场景重建就是通过在多个视角下的输入图像和相机参数,让神经网络学习到一个能够将三维空间点映射到颜色和密度值的隐式函数。这个过程实际上是在从输入图像中学习场景的三维结构和属性,并将其表示为神经网络的权重,这使得网络在渲染阶段能够根据相机参数和光线来生成场景的虚拟图像。

我们可以看下 NeRF 为什么会存在训练慢和渲染慢的问题:
训练慢:NeRF 中采用的 MLP 网络是从零开始进行训练,需要在训练中一点点学习到场景的空间结构;
渲染慢:体渲染技术中,会对空白区域进行采样,浪费了大量的算力。


3D Gaussian Splatting

沿袭 Plenoxels 的思路,完全抛弃了 MLP 神经网络,在此之上又抛弃了光线追踪的体渲染方法,利用了基于光栅化的 3D Gaussian Splatting 的渲染方式。

image-20250120112521343

image-20250221175613550

为什么选择3D高斯(椭球)?

G(x)=1(2π)k∣Σ∣e−12(x−μ)TΣ−1(x−μ) G(x)=\frac{1}{\sqrt{(2 \pi)^k|\Sigma|}} e^{-\frac{1}{2}(x-\mu)^T \Sigma^{-1}(x-\mu)} G(x)=(2π)k∣Σ∣ 1e21(xμ)TΣ1(xμ)

  • μ\muμ 是均值; Σ\SigmaΣ是协方差矩阵

数学性质:仿射变换后高斯核仍闭合;降维后还是高斯(沿某一轴积分)

image-20241230213041188
  • 高维高斯分布由均值和协方差矩阵Σ\SigmaΣ(控制形状)决定。

[σx2  σxy  σxzσyx  σy2  σyzσzx  σzy  σz2] \begin{bmatrix} \sigma^2_x \ \ \sigma_{xy} \ \ \sigma_{xz} \\ \sigma_{yx} \ \ \sigma^2_y \ \ \sigma_{yz} \\ \sigma_{zx} \ \ \sigma_{zy} \ \ \sigma^2_z \end{bmatrix} σx2  σxy  σxzσyx  σy2  σyzσzx  σzy  σz2

image-20250207171841240

3D高斯的自身透明度只有一个数值α\alphaα。实际渲染时(对某像素影响)透明度不止受α\alphaα影响(αe−o1x2+o3y22−o2xy\alpha e^{- \frac{o_1 x^2 + o_3 y^2}{2} - o_2 xy}αe2o1x2+o3y2o2xy),因为概率密度越高的地方就越不透明,概率密度越低就越透明。由于高斯分布的概率密度在靠近中心的位置最高,因此每个3D高斯最中心是不透明度最高的。

  • 球谐函数

球谐系数可以理解为用于表示RGB颜色的一组数值,每个3D高斯需要多达48($ 3 \times 16 $个系数c , 4阶 )个数值。球谐系数不止能够表达单一的颜色,而是能表达物体表面不同位置的不同色彩和纹理。

image-20250106205819960

球谐函数的值与方向(相机位姿和高斯中心)有关,右下侧xyz和r的比值会影响函数

image-20250208214155989

训练更新的参数是3D高斯的那几个参数,也就是位置、协方差矩阵、透明度和球谐系数。

如果用梯度下降的方法,我们在更新协方差矩阵的时候,不能保证更新后的矩阵是半正定的。一个3D高斯的协方差矩阵可以被转换成它的旋转矩阵 RRR 和缩放矩阵 SSS 的乘积:Σ=RSSTRT\Sigma =RS S^T R^TΣ=RSSTRT,也就是Σ=(RS)(RS)T\Sigma =(RS) {(RS)}^TΣ=(RS)(RS)T。储存并更新 RRRSSS 而不是直接更新协方差矩阵,就能保证协方差矩阵都是半正定。


splatting本质上就是把3D的高斯转换成2D的过程

  • 先通过CG层面理解坐标转换:
  1. 观测变换,从世界坐标系到相机坐标系:

image-20250207181500757

  • 获取2D高斯的位置,只需要将3D高斯的位置表示成一个齐次坐标(齐次坐标的引入使得投影变换在数学上可以表示为线性变换)。

[xyz]→[xyz1]\begin{bmatrix} x \\ y \\ z \end{bmatrix} \rightarrow \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} xyz xyz1

然后用投影矩阵乘以这个齐次坐标,

[1tan⁡fovh200001tan⁡fovv20000−f+nf−n−2nff−n00−10]\begin{bmatrix} \frac{1}{\tan{\frac{{fov}_h}{2}}} & 0 & 0 & 0 \\ 0 & \frac{1}{\tan{\frac{{fov}_v}{2}}} & 0 & 0 \\ 0 & 0 & - \frac{f+n}{f-n} & - \frac{2nf}{f-n} \\ 0 & 0 & -1 & 0 \end{bmatrix} tan2fovh10000tan2fovv10000fnf+n100fn2nf0

最后再把齐次坐标还原为普通三维坐标就行了。

[xyzw]→[xwywzw]\begin{bmatrix} x \\ y \\ z \\ w \end{bmatrix} \rightarrow \begin{bmatrix} \frac{x}{w} \\ \frac{y}{w} \\ \frac{z}{w} \end{bmatrix} xyzw wxwywz

  1. 投影变换(透视投影P):

image-20250207175735777

  • 透视投影,先把视锥压成立方体,再进行正交投影转换为[−1,1]3[-1, 1]^3[1,1]3的正方体.

image-20250207180120760

  1. 视口变换,将长宽形变恢复

image-20250207181145951


  • 3DGS层面:
  1. 3dgs的观测变换,世界坐标系到相机坐标系
  • image-20250208153200059
  1. 3dgs的投影变换。后续只需要对均值进行视口变换,不需要对协方差进行。
image-20250101202711741
  • 计算出2D协方差矩阵需要进行投影变换(非线性,涉及除法,/Z),但是不能直接对协方差矩阵进行非线性变换。
    • 协方差矩阵处理的难题:协方差矩阵描述了随机变量之间的相关性和不确定性。直 接对协方差矩阵进行非线性变换是很困难的,因为协方差矩阵的更新规则是基于线性代数的,非线性变换会破坏协方差矩阵所代表的统计特性,难以准确描述投影后 随机变量的不确定性
  • 因此需要一种将非线性变换转换为线性变换的手段,这个手段就是雅可比矩阵(对非线性变换的局部线性近似,泰勒展开、线性逼近)。对于一个3D高斯的协方差矩阵Σ\SigmaΣ,无法直接在三维空间中对它进行线性的投影变换,但是我们可以使用一个线性变换f(x)=JWΣWTJTf(x)=JW \Sigma W^TJ^Tf(x)=JWΣWTJT来代替投影变换,并且这个线性变换的效果与投影变换非常近似。其中,WWW是相机旋转矩阵。这里直接给出J的值:

[nz0−nxz20nz−nyz200nfz2] \begin{bmatrix} \frac{n}{z} & 0 & - \frac{nx}{z^2} \\ 0 & \frac{n}{z} & - \frac{ny}{z^2} \\ 0 & 0 & \frac{nf}{z^2} \end{bmatrix} zn000zn0z2nxz2nyz2nf

最后得到3*3矩阵,去掉第三行第三列得到2D协方差矩阵。

Σ′=[σx2σxyσyxσy2] \Sigma '= \begin{bmatrix} {\sigma}_x^2 & {\sigma}_{xy} \\ {\sigma}_{yx} & {\sigma}_y^2 \end{bmatrix} Σ=[σx2σyxσxyσy2]

  • 投影变换中的雅可比矩阵详解

image-20250101203037755

投影变换后的点xyz变为:

image-20250101203052344

  1. 3dgs的视口变换

image-20250208201927972


  • 2D高斯的颜色由两个因素决定:球谐函数和透明度。

为了求出渲染时对某个像素具体的影响,我们需要预先计算三个参数:
o1=σy2∣Σ′∣o_1 = \frac{{\sigma}_y^2}{|\Sigma '|}o1=Σσy2
o2=−σxy∣Σ′∣o_2 =- \frac{{\sigma}_{xy}}{|\Sigma '|}o2=Σσxy
o3=σx2∣Σ′∣o_3 = \frac{{\sigma}_x^2}{|\Sigma '|}o3=Σσx2

对于像素面上的一点<X,Y>\left< X,Y \right>X,Y,知道某个2d高斯的中心 <μ1,μ2>\left< \mu_1,\mu_2 \right>μ1,μ2 ,则计算两点的distance,下面公式中的 <x,y>=<μ1−X,μ2−Y>\left< x,y \right>= \left< \mu_1 - X, \mu_2 - Y\right>x,y=μ1X,μ2Y ,该2d高斯对这个像素点的透明度影响数值为:
αe−o1x2+o3y22−o2xy \alpha e^{- \frac{o_1 x^2 + o_3 y^2}{2} - o_2 xy} αe2o1x2+o3y2o2xy
最后,将其乘以该点通过球谐函数计算出来的颜色和 TTT(累乘后的光线通过概率),就得到了单个高斯椭球最终的颜色

image-20250221152932964

所以在最后进行渲染时需要对每一个像素CiC_iCi计算颜色,像素的颜色(类似NERF,区别是3dgs按照深度去对高斯椭球排序):

image-20250208221327517

image-20250120170808329

  • 光栅化

image-20250101180719305image-20250221153723165

example:

  1. CullGaussian剔除视锥以外的高斯,置信度<99;
  2. 将每个 3D Gaussian 点投影到视平面;
  3. 将屏幕划分为 16x16 大小的 tiles;根据中心点的位置,计算出该点所处的 tile 和相对视平面的深度;
  4. 对每个 tile 中的所有 3D Gaussian 点,根据相对视平面的深度进行排序;
  5. 排序完成后,每个 tile 都可以得到一个按照从近到远记录了该 tile 中所有 3D Gaussian 点的 list;
  6. 对应每个 tile,运行一个 16x16 的 thread block,并将 tile 对应的 list 加载进 block 的 shared memory 里;
  7. thread block 中的每个 thread 对应 tile 中的一个像素,从 list 中依次取出 3D Gaussian 点,根据投影后的 2D Gaussian 公式,可以计算出该像素位置处的百分比,然后通过球谐函数得到 3D Gaussian 点中心出的颜色和透明度,乘以百分比后,按照以下规则进行累加:
    1. 将颜色与 frame buffer 中的颜色按照 frame buffer 中的透明度混合;
    2. 将透明度与 frame buffer 中的透明度相加;
    3. 如果透明度的值大于阈值则退出计算;
  8. 每个像素的颜色都计算完成后,也就渲染出了整个画面。

3dgs为什么快? 利用GPU并行运算

image-20250209104450324


  • 机器学习与参数评估

image-20250209220833162

  • simple-knn可以使得初始化的高斯椭球占满并且有一定的重叠。

    • 椭球的初始化:
    • 是一个球(isotropic Gaussians),使用knn法,找到3近邻,半径是与3近邻的距离的平均。
  • 协方差矩阵的更新

在3D高斯泼溅(3DGS)中,协方差矩阵的更新与梯度反向传播过程如下:

三维高斯分布的协方差矩阵 (Σ\SigmaΣ) 由旋转矩阵 (RRR) 和缩放矩阵 (SSS) 定义:

Σ=RSSTRT=MMT(其中 M=RS)\Sigma = RSS^T R^T = MM^T \quad (\text{其中 } M = RS)Σ=RSSTRT=MMT(其中 M=RS)

  • 旋转参数化:旋转矩阵 (R) 通过四元数 (q=(qr,qi,qj,qk)q = (q_r, q_i, q_j, q_k)q=(qr,qi,qj,qk)) 参数化,保证旋转的正交性。
  • 缩放参数化:缩放矩阵 (S) 是对角矩阵,对角线元素为各轴缩放系数 (sx,sy,szs_x, s_y, s_zsx,sy,sz)。

投影后的协方差矩阵 (Σ′\Sigma'Σ) 通过以下变换得到:

Σ′=JWΣWTJT\Sigma' = JW \Sigma W^T J^TΣ=JWΣWTJT

  • (WWW) 是世界坐标系到相机坐标系的变换矩阵(如刚性变换)。
  • (JJJ) 是投影过程的雅可比矩阵,包含透视投影或仿射投影的导数信息。

梯度反向传播的目标是计算损失函数 (L) 对参数(四元数 (q) 和缩放系数 (s_k))的梯度,通过链式法则逐层分解:

通过梯度下降法更新参数:
q←q−η∂L∂q,sk←sk−η∂L∂skq \leftarrow q - \eta \frac{\partial L}{\partial q}, \quad s_k \leftarrow s_k - \eta \frac{\partial L}{\partial s_k}qqηqL,skskηskL
其中 (η\etaη) 是学习率。这一过程迭代优化高斯分布的旋转、缩放参数,使投影后的分布与目标(如像素颜色)对齐。

梯度传播:损失梯度沿 (Σ′→Σ→M\Sigma' \rightarrow \Sigma \rightarrow MΣΣM) 反向传播,最终分解到四元数和缩放系数。

image-20250221104722655

image-20250209221056132

  • 自适应密度控制:加快模型收敛速度又能提高模型质量
    • 删除几乎透明的高斯
    • 将高斯设置为完全透明,在之后的训练中,有用的高斯会被再重现,无用的一直为透明直到被删除
    • 删除范围大的高斯

Pruning减小伪影的出现;Densification处理过度重建欠采样

image-20250221172337281

image-20250221172555031

  • 高斯分裂和克隆(复制)
    • 作者设置了两个阈值,第一个用来判断一个高斯是否过小,另一个用于判断高斯是否过大。每次训练中,我们对每个高斯进行检查,如果尺寸小于第一个阈值,就将它复制;如果尺寸大于第二个阈值,就将它拆分。
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐