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