3DGS原理解析 | 我的知識理解分享
本文經自動駕駛之心公眾號授權轉載,轉載請聯系出處。
Neural Radiance Fields也就是NeRF,是一種新穎的view synthesis方法,通過優化一個MLP,并使用volumetric ray-marching方法實現了3D場景的隱式表示,但該方法要求costly訓練和渲染才能得到較高質量的結果。
3D Gaussian Splatting的出現解決了NeRF的問題,并且同為Radiance Field,3D Gaussian實現了更快的訓練和渲染并且能夠保證渲染圖象的質量(equal or better quality than the previous implicit radiance field approaches)。這個方法在某些數據集上實現了state-of-art質量的結果以及real-time rendering
3D Gaussian
首先需要著重理解3D Gaussian是什么
在光柵化方法中,我們會將點組裝為一個個基本圖元,其中最常用的圖元就是三角形,也就是場景都是由多個三角形面片組成,我們通過光柵化方法將多個三角形畫到屏幕上。
但在3DGS算法中,渲染的基本圖元變為了3D Gaussian(想象成一個三維空間的橢球體)
多個3D Gaussian會組合重疊
物體表面法線對于場景渲染十分關鍵,傳統的3D重建方法在使用稀疏數據估計物體表面法線上面臨挑戰,而使用3D Gaussian來表示場景時,可以不需要法線就可以捕獲場景的結構。
3D Gaussian的簡單公式表示是:
3D高斯函數的形式就是一個橢球體:
3D 高斯函數的中心點由 均值向量(mean vector)決定(上面的公式中默認均值是0,所以沒有顯示),橢球體的三個主軸對應著高斯分布的協方差矩陣的特征向量,而主軸的長度則對應著特征值的平方根。這也就是說,協方差矩陣決定了高斯分布在 3D 空間中的形狀、大小以及方向。我們再給這個橢球顏色與透明度,來讓多個3D Gaussian的組合能夠形成高質量圖像。然后我們就得到了3DGS算法中定義一個3D Gaussian的參數:
- Position (Mean μ): location (XYZ)
- Covariance Matrix (Σ): rotation and scaling
- Opacity ( ): Transparency,這個參數會在alpha blending階段時與相乘
- Color (RGB) or Spherical Harmonics (SH) coefficients
3D Gaussian中,協方差矩陣只有在正半定時才有物理意義(或者說協方差矩陣必須是正半定的才行),但傳統梯度下降方法很難去對矩陣施加此類約束,可能優化過程中打破了協方差矩陣的正半定性,所以不能用傳統梯度下降法。或者說不能將協方差矩陣作為一個優化參數直接優化。
還有一點是,我們能夠通過三維空間中的三個點定義任意的三角形一樣,我們想要通過某種方式獲取任意的橢球形狀。
協方差矩陣的幾何意義是,表示這個橢圓球在空間中的形狀(縮放)和方向(旋轉)。協方差矩陣是一個正定矩陣,可以通過某種方式進行矩陣分解。而3D Gaussian中有一種特征值分解,具體形式為:
- 協方差矩陣是一個3 X 3 矩陣
- Q是由特征向量組成的正交矩陣(旋轉矩陣)。
上面提到過,主軸的長度則對應著特征值的平方根,也就是說可以進一步分解,那么就得到了3DGS原論文中的形式:
- R是四元數表示的旋轉矩陣(此矩陣要保持normalization)
那么不直接對協方差矩陣優化,而是將R,S作為優化參數優化,就可以保持協方差矩陣的正半定。
通過定義R,S以及location(也就是均值),我們可以得到三維空間中所有形式的3D Gaussian。
NeRF的特點就是,它是一個隱式表達的連續的空間,可以使用神經網絡進行優化,但無法完全利用GPU進行rendering的加速;傳統的使用三角形等Mesh進行的渲染,是顯式的離散的空間,可以利用GPU的并行計算來加速渲染,但無法使用神經網絡進行優化。而對于3DGS來說,單個3D Gaussian是連續的,可以使用神經網絡優化,多個3D Gaussian可以利用GPU進行并行渲染,在兩者之間有一個平衡。
Splatting
3D Gaussian是3D物體,要生成圖像(就像常規光柵化渲染一樣)就需要將其投影到2D平面上。
我們需要實現某種方式,能夠將多個3D Gaussian投影到2D image上來渲染結果。
而論文中給出的方式是,替換協方差矩陣為:
具體來說,仿照渲染管線的流程,假如一個初始的3D Gaussian是在模型空間的話,協方差矩陣就相當于模型變換,將3D Gaussian轉換到了世界空間。然后W是View Transform Matrix,將3D Gaussian轉換到了相機空間。J是Jocobian Matrix,是用來近似Project Transfor Matrix實現Project Transform。
FAST DIFFERENTIABLE RASTERIZER
假設現在我們已經得到了用于表示整個場景的大量3D Gaussian,現在我們要將其渲染到image上。
為了加速渲染,3DGS選擇使用Tile-based rasterization,將Image切為一個個16 * 16的tile,每個tile像一個小image一樣獨立計算顏色值,最后多個Tile拼成image的顏色。
考慮到每個3D Gaussian投影到2D image時可能會投影到多個tile,處理方法是如果一個Gaussian投影與多個tile相交,就實例化多次Gaussian,每個Gaussian instance都會得到一個結合view space depth和tile ID得到的key。然后基于這些key,使用single fast GPU Radix sort進行排序。
如下圖中,黃色Gaussian投影影響了Tile1和2,其他Guassian投影同理;在另一張圖中,我們給出了一個Gaussian投影到多個Tile后,多次實例化以及排序的操作。
之后,每個Tile分別進行Alpha Blending,計算像素顏色值得到圖像。
INITIALIZATION
假如我們已經有方法對3DGS模型進行一步步的優化,那我們要如何開始呢?
在3DGS中,使用的是一種cv算法,Structure from Motion SfM算法來從輸入圖像中得到一組點云。SfM的基本思路是利用多張包含相同場景不同部分的圖像,通過追蹤圖像中的共同特征,估算出相機的運動路徑(即相機的外參,包括位置和平移)以及場景的三維點云結構。而3DGS算法就要利用從SfM算法中得到的初始點云進行初始化。
得到三維點云結構后,算法會將每個點云轉換為3D Gaussian,以此為基礎訓練模型優化。
OPTIMIZATION
Gradient Descent for Parameter OptimizationDesLoss的計算方法很容易想到,就是用同一個視角下,模型生成的圖片與實際的訓練集圖片的對比。
使用隨機梯度下降SGD,對Mean、Covariance Matrix、α、Color進行參數優化。
Loss結合了L1和D-SSIM(Structural Dissimilarity Index)。
原論文中,=0.2
Adaptive Densification
使用SfM算法初始化了一系列稀疏點之后,adaptive densification方法會動態調整3D Gaussians的數量和密度。
densify簡單來說就是,under-reconstructed區域克隆small Gaussians以及在high-variance(我覺得就是Over-reconstructed)區域分離large Gaussian。
The Process behind 3D Gaussian Splatting
- 使用SfM(Structure from Motion)初步創建一組point cloud
- 將步驟1創建的point cloud轉換為3D Gaussian
- 使用SGD訓練。訓練過程是將3D Gaussian使用differentiable Gaussian rasterization方法rasterize到圖像上,通過生成圖像與真實圖像來計算loss值,調整參數,實現自動densification調整
- Differentiable Gaussian Rasterization
Conclusion
這篇文章對3DGS算法進行了簡單的介紹,作為基礎簡單了解。
下篇文章會深入論文,介紹更多的實現細節。
重要資源
https://github.com/MrNeRF/awesome-3D-gaussian-splatting