最近学习了3D gaussian splattoing的一些知识,也了解了一些Nerf的相关知识。之前一直做2d多模态的相关知识,对于3d处于刚刚接触的阶段,想着以新手的视角记录一下学习过程,一来加深自己的理解,二来想与各位讨论求教。由于水平实在有限,本篇文章就讲究一个浅尝辄止,如果这些笔记有幸能够启发到各位那就再好不过了。很长,大家慢慢看,有参考链接还是得看人家写的博客,比我的详细多了。
主要是恶补一些计算机图形学的知识,深度学习相关知识就不在这里介绍了。
三维坐标系统中的一组向量集合,每一个点包含三维坐标,可能包含颜色信息(RGB)或反射强度信息(Intensity,表示每个点云中点的反射、反射率、反射强度)。 本质上是3D空间中无序、无结构的海量数据点的集合。
获取方式多种多样,在本文中主要会通过二维影像进行三维重建,在重建过程中获取点云数据。
对点云数据的处理有许多专门的工具框架,比如MATLAB中的LidarToolbox提供的3维点云可视化方法,以及Open3D等开源库提供的点云处理和分析功能。
顶点表示(Vertex Represemtatopm):通过最简单和最基础的三维几何表示方法,通过一系列的顶点来定义物体的形状,每个顶点包含了其在三维空间中的坐标信息。通过连接这些顶点,可以形成线、面或体等几何形状。顶点表示适用于表示简单几何形状或离散的点云数据。
多边形网格表示(Polygon Mesh Representation):多边形网格是由连接顶点的边和面组成的结构。它是表示复杂几何形状的一种常见方法。多边形网格通常由三角形或四边形构成,但也可以包含更高阶的多边形。多边形网格可以表示平面几何形状,也可以通过三角剖分等技术表示曲面或复杂形状。
参数曲面表示(Parametric Surface Representation):参数曲面是通过参数化方程来表示的曲面。它使用参数化坐标(通常是二维参数)来描述曲面上的点。参数曲面可以通过数学函数或参数化曲线来生成,例如贝塞尔曲线和贝塞尔曲面。参数曲面表示适用于光滑的曲面和复杂的形状。
体素表示(Voxel Representation):体素是三维空间中的一个像素或体素元素,类似于二维图像中的像素。体素表示将三维空间划分为规则的体素网格,并使用每个体素的属性(如密度、颜色)来表示物体的形状和属性。体素表示适用于体积数据和体绘制应用,例如医学图像和体渲染
本文所涉及到的Nerf和3D Guassia splatting主要是使用体素进行三维几何表示。
图像渲染是将三维场景转换为二维图像的过程。它是计算机图形学领域的一个重要任务,用于生成逼真的图像,以便在计算机屏幕上显示或进行进一步的图像处理。
找到所有被几何原型所占据的所有像素点然后逐个渲染这些点,得到图像的显示效果。光栅化渲染速度快,用于实时渲染,但渲染效果可能不如体渲染。
体渲染把气体等物质抽象成一团飘忽不定的粒子群。光线在穿过这类物体时,其实就是光子在跟粒子发生碰撞的过程。!
下图是体渲染建模的示意图。光沿直线方向穿过一堆粒子 (粉色部分),如果能计算出每根光线从最开始发射,到最终打到成像平面上的辐射强度(Nerf中其实可以理解为颜色),我们就可以渲染出投影图像。而体渲染要做的,就是对这个过程进行建模。为了简化计算,我们就假设光子只跟它附近的粒子发生作用,这个范围就是图中圆柱体大小的区间
此外还有线段技术渲染,图元技术渲染等等,因为Nerf和3d Gaussian splatting用到的渲染技术为体渲染和光栅化,本文暂不探究其他渲染技术。
关于光栅化,推荐博客(推荐顺序阅读):
1. https://zhuanlan.zhihu.com/p/449289345
2. https://zhuanlan.zhihu.com/p/450540827
关于体渲染,推荐博客:https://zhuanlan.zhihu.com/p/595117334
光照模型是计算机图形学中用于模拟光线在三维场景中的传播和相互作用的模型。它们用于计算物体表面的颜色和亮度,以生成逼真的渲染结果。光照模型通常考虑光源、材质和表面法线等因素,以模拟光线在物体表面的反射、折射和散射等物理现象。
ps: 不清楚这一块是否和我们的主题有关系,暂时不提,需要再详细研究叭
相机内参通常包括焦距(fx, fy)、主点坐标(cx, cy)和像素尺寸(dw, dh)等参数,这些参数描述了相机内部的光学特性,对于理解和控制图像的形成至关重要
相机外参则包括相机的位置和姿态,通常通过相机的内参和一些附加的信息(如相机的镜头畸变系数)来估计。外参的主要作用是将相机坐标系下的点云(即相机捕获的三维空间中的点)转换到世界坐标系下
在3D Gaussia splatting中,相机的内参和外参被用来将点云投影到图像平面上,这一步叫做splatting。在此过程中,相机的内参帮助我们理解和控制图像的形成,而相机的外参则帮助我们将三维空间中的点映射到图像平面上。
关于这一部分的具体内容可以参考博客: https://blog.csdn.net/qq_43742590/article/details/104109103?spm=1001.2014.3001.5506
这篇文章的重头戏可能还是3D guassia splatting,所以简单总结一下Nerf吧:
NERF(Neural Radiance Fields)是一种基于神经网络的三维场景重建和渲染方法,它能够从有限的观测数据中推断出场景的几何形状和光照信息。以下是对NERF的总结:
首先回顾一下傅里叶,通过傅里叶去类比球谐函数,任何一个二维函数都可以分解成为不同的正弦与余弦之和:
f ( x ) = a 0 + ∑ n = 1 + ∞ a n c o s n π l x + b n s i n n π l x f(x)=a_0+\sum_{n=1}^{+\infty}a_ncos\frac{n\pi}{l}x+b_nsin\frac{n\pi}{l}x f(x)=a0+n=1∑+∞ancoslnπx+bnsinlnπx
这里 c o s n π l x cos\frac{n\pi}{l}x coslnπx和 s i n n π l x sin\frac{n\pi}{l}x sinlnπx就叫作基函数,原则上来讲当 n − > + ∞ n->+\infty n−>+∞时,我们就可以完美拟合这个函数,即使只有有限个 n n n,我们也可以对这个函数进行近似。
f ( x ) ≈ a 0 + ∑ n = 1 i a n c o s n π l x + b n s i n n π l x f(x) \approx a_0+\sum_{n=1}^{i}a_ncos\frac{n\pi}{l}x+b_nsin\frac{n\pi}{l}x f(x)≈a0+n=1∑iancoslnπx+bnsinlnπx
这种基函数的思想其实在数学中很常见。
我们考虑一个有界,闭合的,平滑的曲面。
它可以用球面函数表示方法来表示 f ( θ , ϕ ) f(\theta,\phi) f(θ,ϕ),这样一个函数同样可以有自己的基函数来组成。
它的基函数长这样:
这个就是球谐函数。球谐函数的推导比较复杂,而且是递推的,这里不做介绍,只列一些比较低阶的球谐函数的方程:
与傅里叶级数相似,任意一个球面坐标的函数,就可以用多个球谐函数来近似。
f ( θ , ϕ ) ≈ a 0 f l = 0 , m = 0 f ( θ , ϕ ) + a 1 f l = 1 , m = − 1 f ( θ , ϕ ) + a 2 f l = 1 , m = 0 f ( θ , ϕ ) + a 3 f l = 1 , m = 1 f ( θ , ϕ ) + a 4 f l = 2 , m = − 2 f ( θ , ϕ ) + a 5 f l = 2 , m = − 1 f ( θ , ϕ ) + . . . f(\theta,\phi) \approx a_0f_{l=0,m=0}f(\theta,\phi)+a_1f_{l=1,m=-1}f(\theta,\phi)+a_2f_{l=1,m=0}f(\theta,\phi)+a_3f_{l=1,m=1}f(\theta,\phi)+a_4f_{l=2,m=-2}f(\theta,\phi)+a_5f_{l=2,m=-1}f(\theta,\phi)+... f(θ,ϕ)≈a0fl=0,m=0f(θ,ϕ)+a1fl=1,m=−1f(θ,ϕ)+a2fl=1,m=0f(θ,ϕ)+a3fl=1,m=1f(θ,ϕ)+a4fl=2,m=−2f(θ,ϕ)+a5fl=2,m=−1f(θ,ϕ)+...
总而言之,球谐函数是一种在球面坐标系中表示函数的方法,可以用于表示物体的颜色信息。在渲染过程中,在渲染过程中,球谐函数通常用于估计物体的颜色,并根据对应的法线信息,从球谐函数中获取对应的颜色信息。要强调一下,在实际应用中,球谐函数的值可以作为颜色值,从光照的角度来说,就是表示光照的强度。这也是为什么球谐函数可以用于表示物体的颜色信息,特别是在光照效果复杂的情况下,如环境光、反射光等。最后附上一张彩色图片
前面已经简单介绍过渲染的概念了。在图形学渲染中,坐标变换是非常关键的一部分,它涉及到从一个坐标系到另一个坐标系的转换,以便于在不同的坐标系中表示和操作图形元素。
简单来说,需要把空间里面的物体投影到相机的平面,也就是需要知道空间中每个点投影到特定相机平面上的位置是多少,在传统图形学里面的流程通常是这样的: 先把视椎内物体进行一个透视投影,压缩到一个非透视的空间内,然后使用正交投影,将视椎内物体压缩到各维度为[-1,1]的空间内。
这部分内容请参考博客:https://zhuanlan.zhihu.com/p/113662566
设近平面为 n n n,远平面为 f f f,这里假设我们相机坐标的位置如下(采用右手坐标系):
空间内任一点 ( x , y , z ) (x,y,z) (x,y,z)投影到相机平面的位置为 ( x ′ , y ′ , z ′ ) (x',y',z') (x′,y′,z′),投影矩阵为 P P P, 则有:
x ′ = n z x , y ′ = n z y x'=\frac{n}{z}x,y'=\frac{n}{z}y x′=znx,y′=zny
换成齐次坐标表示,也就是经过。
[ x , y , z , 1 ] T − > [ n x , n y , ? , z ] [x,y,z,1]^T->[nx,ny,?,z] [x,y,z,1]T−>[nx,ny,?,z]
P = [ n 0 0 0 0 n 0 0 ? ? ? ? 0 0 1 0 ] P= \begin{bmatrix} n && 0 && 0 && 0\\ 0 && n && 0 && 0\\ ? && ? && ? && ?\\ 0 && 0 && 1 && 0 \end{bmatrix} P=n0?00n?000?100?0
我们还有两个约束条件,在近平面上,所有点的 z z z坐标不会变,都为 n n n,在远平面上,所有点的 z z z坐也不会变:
[ x , y , n , 1 ] − > [ n x , n y , n 2 , n ] [x,y,n,1]->[nx,ny,n^2,n] [x,y,n,1]−>[nx,ny,n2,n]
[ x , y , f , 1 ] − > [ x ′ , y ′ , f , 1 ] = [ n x f , n y f , f , 1 ] = [ n x , n y , f 2 , f ] [x,y,f,1]->[x',y',f,1]=[\frac{nx}{f},\frac{ny}{f},f,1]=[nx,ny,f^2,f] [x,y,f,1]−>[x′,y′,f,1]=[fnx,fny,f,1]=[nx,ny,f2,f]
所以 P P P一定满足如下的形式:
P = [ n 0 0 0 0 n 0 0 0 0 A B 0 0 1 0 ] P= \begin{bmatrix} n && 0 && 0 && 0\\ 0 && n && 0 && 0\\ 0 && 0 && A && B\\ 0 && 0 && 1 && 0 \end{bmatrix} P=n0000n0000A100B0
其中 A n + B = n 2 An+B=n^2 An+B=n2, A f + B = f 2 Af+B=f^2 Af+B=f2
解出来为:
A = n + f , B = − n f A=n+f, B=-nf A=n+f,B=−nf
因此,投影距离为:
P = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] P= \begin{bmatrix} n && 0 && 0 && 0\\ 0 && n && 0 && 0\\ 0 && 0 && n+f && -nf\\ 0 && 0 && 1 && 0 \end{bmatrix} P=n0000n0000n+f100−nf0
下交投影相对较简单,只需要将非透视空间内的内容挪到坐标原点,并规范化到[-1,1]的空间内,设x坐标的范围为[l,r],y坐标为[b,t],z坐标为[n,f], 我们可以先把坐标得到了零点,再做各个维度的压缩,从坐标到零点的变换矩阵为:
T 1 = [ 1 0 0 − l + r 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] T_1= \begin{bmatrix} 1 & 0 & 0 & -\frac{l+r}{2}\\ 0 & 1 & 0 & -\frac{t+b}{2}\\ 0 & 0 & 1 & -\frac{n+f}{2}\\ 0 & 0 & 0 & 1\\ \end{bmatrix} T1=100001000010−2l+r−2t+b−2n+f1
缩放矩阵如下:
T 2 = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] T_2= \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & 0\\ 0 & \frac{2}{t-b} & 0 & 0\\ 0 & 0 & \frac{2}{n-f} & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} T2=r−l20000t−b20000n−f200001
最后的矩阵就是两个矩阵乘起来:
T = T 2 T 1 = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] T=T_2T_1= \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l}\\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b}\\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f}\\ 0 & 0 & 0 & 1\\ \end{bmatrix} T=T2T1=r−l20000t−b20000n−f20−r−lr+l−t−bt+b−n−fn+f1
综合一下,将一个坐标先经过矩阵 P P P, 再过 T T T的变换就可以变到NDC坐标系。
可参考:https://www.bilibili.com/video/BV1dC4y1c7R8/?share_source=copy_web
公式为:
p ( x ) = 1 2 π σ e − ( x − u ) 2 2 σ 2 p(x)=\frac{1}{\sqrt {2 \pi}\sigma}e^{-\frac{(x-u)^2}{2 \sigma^2}} p(x)=2πσ1e−2σ2(x−u)2
其图像如下:
其均值为 u u u,方差为 σ \sigma σ,数据会以99%的概率落在 u − 3 σ u-3\sigma u−3σ到 u + 3 σ u+3\sigma u+3σ之中。
公式如下:
1 ( 2 π ) N 2 ∣ Σ ∣ e − 1 2 ( x − u ) T Σ − 1 ( x − u ) \frac{1}{(2 \pi)^{\frac{N}{2}}|\Sigma|}e^{-\frac{1}{2}(x-u)^T\Sigma^{-1} (x-u)} (2π)2N∣Σ∣1e−21(x−u)TΣ−1(x−u)
使用固定概率为 p p p的三维高斯窥探一下三维高斯分布分布长什么样。
1 ( 2 π ) N 2 ∣ Σ ∣ e − 1 2 ( x − u ) T Σ − 1 ( x − u ) = p \frac{1}{(2 \pi)^{\frac{N}{2}}|\Sigma|}e^{-\frac{1}{2}(x-u)^T\Sigma^{-1} (x-u)}=p (2π)2N∣Σ∣1e−21(x−u)TΣ−1(x−u)=p
− l n ( 2 π ) N 2 ∣ Σ ∣ − 1 2 ( x − u ) T Σ ( x − u ) = l n p -ln(2 \pi)^{\frac{N}{2}}|\Sigma|-\frac{1}{2}(x-u)^T\Sigma (x-u)=lnp −ln(2π)2N∣Σ∣−21(x−u)TΣ(x−u)=lnp
( x − u ) T Σ ( x − u ) = − 2 l n p − 2 l n ( 2 π ) N 2 ∣ Σ = C (x-u)^T\Sigma (x-u)=-2lnp-2ln(2 \pi)^{\frac{N}{2}}|\Sigma=C (x−u)TΣ(x−u)=−2lnp−2ln(2π)2N∣Σ=C
这里, Σ \Sigma Σ是一个实对称矩阵,令:
Σ = P T ∧ P \Sigma=P^T\wedge P Σ=PT∧P
( x − u ) T P T ∧ P ( x − u ) = ( P ( x − u ) ) T ∧ P ( x − u ) = C (x-u)^TP^T\wedge P(x-u)=(P(x-u))^T \wedge P(x-u)=C (x−u)TPT∧P(x−u)=(P(x−u))T∧P(x−u)=C
令: y = P ( x − u ) y=P(x-u) y=P(x−u),
令:
∧ = [ σ 1 2 0 0 0 σ 2 2 0 0 0 σ 3 2 ] \wedge= \begin{bmatrix} \sigma_1^2 & 0 & 0\\ 0 & \sigma_2^2 & 0 \\ 0 & 0 & \sigma_3^2 \end{bmatrix} ∧=σ12000σ22000σ32
原式子变为
y T ∧ y = σ 1 2 y 1 2 + σ 2 2 y 2 2 + σ 3 2 y 3 2 y^T \wedge y=\sigma_1^2y_1^2+\sigma_2^2y_2^2+\sigma_3^2y_3^2 yT∧y=σ12y12+σ22y22+σ32y32
这是一个标准的椭球的方程,所以原式子就是把标准椭球先经过经过一个旋转变换 P − 1 P^{-1} P−1,再挪到 u u u点得到。所以对于一个三维高斯而言,同一个椭球表面其概率密度相同,离 u u u越远,其概率越小。
所以一个多元高斯轴的长度为 Σ \Sigma Σ的特征值。
跟一维一样,有99%的概率落在3倍方差之内,也就是有99%的概率落在 3 σ 1 , 3 σ 2 , 3 σ 3 3\sigma_1,3\sigma_2,3\sigma_3 3σ1,3σ2,3σ3所在的椭球内,另外 σ 1 , σ 2 , σ 3 \sigma_1,\sigma_2,\sigma_3 σ1,σ2,σ3为 Σ \Sigma Σ的特征值。
相关知识可以参考:https://www.bilibili.com/video/BV1dC4y1c7R8/?share_source=copy_web
到此,了解了以上概念之后,就可以看看3D Gaussian splatting是什么东西了!
在开始3D Gaussian splatting之前,我们一起来再接触几个概念:
万事具备,让我们快速了解一下什么是3D Gaussia splatting。
至于3D Gaussian splatting,首先推荐两篇博客,里面包含了3D Guassia的更详细的推导:https://blog.csdn.net/koukutou_mikiya/article/details/134834955
https://blog.csdn.net/su_zy_/article/details/134226262
到这里3dGaussia splatting的内容就接近尾声了,最后来讨论一下缺点吧。3D GS的效果确实可以,速度也很快,但本质上来说,3DGS不是建立了一个精准的真实3D模型,而是通过渲染结合3DGS所得到的分布,通过相机内参算一个很好看的2D图像。真实的3D物体的建模可能还需要继续探索。
就说到这,有什么理解不对的地方,大家指正啊,一起讨论,向各位学习!
Note: 本文没有参考论文原文,全部基于博客,主要是因为希望可以快速入门,入门之后查看论文原文可能才会产生自己的理解叭!
https://blog.csdn.net/weixin_48311163/article/details/119888018
https://zhuanlan.zhihu.com/p/595117334
https://zhuanlan.zhihu.com/p/450540827
https://zhuanlan.zhihu.com/p/449289345
https://zhuanlan.zhihu.com/p/597579341
https://www.bilibili.com/video/BV1dC4y1c7R8/?share_source=copy_web
https://zhuanlan.zhihu.com/p/113662566
https://blog.csdn.net/AYGdexiaotianxin/article/details/107225053
https://blog.csdn.net/koukutou_mikiya/article/details/134834955
https://blog.csdn.net/qq_43742590/article/details/104109103
https://blog.csdn.net/koukutou_mikiya/article/details/134834955
https://blog.csdn.net/su_zy_/article/details/134226262