感謝B站意の茗的講解。
論文地址:https://arxiv.org/abs/2308.04079
項目主頁:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
概述
- 從已有點云模型出發(fā)(sfm),以每個點為中心建立可學(xué)習(xí)的3D高斯表達(dá),Splatting方法進(jìn)行渲染,實現(xiàn)高分辨率實時渲染。(推動NERF加速方向)
- 能用訓(xùn)練好的點云在windows上進(jìn)行實時渲染。隨機初始化點云,不提供初始點云也行,在訓(xùn)練過程中可以對點云進(jìn)行生長和修剪。(一般NeRF需要從COLMAP計算相機位姿,此時已經(jīng)得到初始點云。)
- 用instant-NGP的速度,實現(xiàn)了mid-nerf360的渲染質(zhì)量。
總體介紹
1、文章簡介(主要思想和貢獻(xiàn))
- 引入了一種各向異性(anisotropic)的3D高斯分布作為高質(zhì)量、非結(jié)構(gòu)化的輻射場表達(dá)。
從sfm點云出發(fā),以每個點為中心生成3D高斯分布。
各向異性:從各個方向上看過去長得都不一樣,即把一個點往不同相機位姿上投影的時候投出的樣子不一樣。 - 實現(xiàn)了使用GPU進(jìn)行快速可微的渲染,允許各向異性的拋雪球(Splatting)和快速反向傳播。
拋雪球Splatting:圖形學(xué)中用三維點進(jìn)行渲染的方法,將三維點視為雪球往圖像平面拋,雪球在平面留下擴(kuò)散痕跡,這些點的擴(kuò)散痕跡疊加在一起構(gòu)成最后的圖像。
是一種方便的針對點云的渲染方法,是渲染速度比NeRF快的原因。 - 提出了針對3D高斯特性的優(yōu)化方法,并同時進(jìn)行自適應(yīng)密度控制。
儲存在點里的高斯函數(shù),需要在反向傳播的時候進(jìn)行優(yōu)化更新。根據(jù)梯度自適應(yīng)調(diào)整點云分布(Adaptive Density
Control部分)。 若某點3D高斯太大,不能擬合此處細(xì)節(jié),則對其進(jìn)行分割,用兩個點表達(dá)。
若某位置點太多太密集,用不到太多的3D高斯,則將這些吞并為一個3D高斯。
2、預(yù)備知識(3D高斯的公式推導(dǎo))
-
一維高斯分布的概率密度函數(shù):x服從均值μ方差σ2的高斯分布
-
擴(kuò)展到三維高斯分布的概率密度函數(shù):假設(shè)a,b,c均服從0,1正態(tài)分布,且相互獨立
-
對于一般的情況(注意粗體是向量,斜體是標(biāo)量) 給出一個3*1向量x=[x,y,z]T,其中想,y,z可能并不是獨立同分布,因此做線性變換。
把均值不一定為0的,方差不一定為1(不滿足上述N(0,1))的[x,y,z]T,變換到均值為μ方差為1的[a,b,c]T。 矩陣表示:其中,均值向量的E(x)為x的均值。 (x-μ)表示x,y,z減去各自的均值,即將數(shù)據(jù)分布中心化。
-
變換矩陣A對[x,y,z]進(jìn)行線性組合,讓[x,y,z]變成[a,b,c] 變換后帶入到上式p(v)中,即
-
轉(zhuǎn)化為x的概率密度函數(shù) 兩邊積分
dv換成dx:求雅克比矩陣,把dv里的v換成包含x的表達(dá)式
so,向量x的概率密度函數(shù)
-
1維高斯用均值和方差表示->多維高斯用均值向量(μ)和協(xié)方差矩陣表示。
-
把變換矩陣A轉(zhuǎn)化成協(xié)方差矩陣(對稱矩陣,能進(jìn)行特征值分解)。
-
矩陣U的每一列都是相互正交的特征向量,單位向量。Λ矩陣對角線元素是協(xié)方差矩陣的特征值(矩陣論內(nèi)容)。
-
一組正交基乘一個對角陣,構(gòu)成線性變換
-
變換矩陣A=UΛ{1/2},協(xié)方差矩陣Λ=AT(UU^T=I)
-
完整的3D高斯概率密度函數(shù)(橢球,形狀有Σ決定)
3、相關(guān)工作(point-NeRF和Plenoxels)
從CG角度,梳理了基于點的渲染方法
與NeRF相關(guān)的兩個工作:
3.1 Point-NeRF:第一個用點云做NeRF的工作
- 從點云出發(fā)構(gòu)建輻射場(同3DGS),然后為每個點提取一個特征(特征向量),存儲在點里。
- 體渲染:從相機光心發(fā)出的穿透像素的采樣射線,采樣射線上取采樣點,采樣點周邊一定范圍內(nèi)的三維點的特征向量被取出來之后做插值,得到采樣位置的特征表達(dá),將這個特征解碼得到采樣位置的顏色和體密度。堆疊整條射線上的點,得到像素RGB的值。(NeRF常見思路)
3D高斯從CG出發(fā),點里存儲物理含義更加明確的3D高斯,避開了Point-NeRF對抽象特征的學(xué)習(xí)過程,從而讓訓(xùn)練更加收斂
渲染方面,3D高斯的Splatting更傳統(tǒng),效率更高。Point-NeRF浪費了點云攜帶的精確幾何信息,存儲的特征向量表征了點的空間信息,但插值,MLP之后可能會擬合出一個不符合實際情況的幾何構(gòu)造出來(空間信息儲存在抽象特征中),不像高斯分布有明確的幾何中心(三維點峰值,告訴系統(tǒng)這有很高的不透明度)。
3D高斯比Point-NeRF,點云對整個模型起到的錨定作用更強,最大程度上用到初始 - 點云表達(dá)的空間幾何信息。 自適應(yīng)點云生長和剔除
3.2 Plenoxels(沒有神經(jīng)網(wǎng)絡(luò)的輻射場)
- 同樣繼承很多NeRF要素(體素、三線性插值、體渲染)
- 體素格點存儲球諧函數(shù)(spherical harmonic)系數(shù),系數(shù)做插值得到采樣位置的球諧函數(shù)。
- 拋棄了常用的MLP和隱式特征,用更顯式的CG的球諧函數(shù)。3DGS同用傳統(tǒng)但高效的方法,提高模型表達(dá)能力的下線,并結(jié)合可微和可學(xué)習(xí)思想,拉高模型擬合的上限。
具體方法
1、可微的3D高斯Splatting
1.1 每個點存儲數(shù)據(jù)
- Position(Mean):點的位置xyz,也是3D高斯分布的均值向量。
- Covariance matrix:協(xié)方差矩陣,決定高斯(綠色橢球)形狀和方向。
- Opacity α :不透明度,用于渲染Splatting把它往圖像平面上投的時候,擴(kuò)散痕跡通過不透明度疊加在一起。
- Spherical harmonics:球諧函數(shù),擬合視角相關(guān)的外觀。用一組正交基的線性組合來擬合光場。
1.2 為什么選擇3D高斯
需要選擇一種圖元能夠在擁有場景表達(dá)能力的同時可微,而且顯式地支持快速渲染。3D高斯點云里的參數(shù)可以再迭代優(yōu)化的過程中更新,并且能夠容易地用splat的方法投影到2D圖像,做很快的α混合(渲染)。
其他人構(gòu)建輻射場的方法:把每個點視為帶方向的小平面,但方向需要準(zhǔn)確的表面法向量信息,難以從稀疏的sfm模型中得到精確地法向量。(3DGS不需要法向量)
1.3 3D高斯的定義:協(xié)方差矩陣控制3DGS的形狀
相較于前面推導(dǎo)的表達(dá)式:
- 去掉了均值μ:因為高斯分布以點為中心,xyz均值就在點上,已經(jīng)中心化了。所以將均值設(shè)為0。
- 去掉了exp前面的系數(shù):系數(shù)為了控制整個概率密度函數(shù)積分為1,但此處不需要,而是讓整個分布的大小自由控制。
協(xié)方差矩陣的物理含義:為什么這個矩陣能夠控制3DGS的形狀(下面例子是二維的,實際是三維)
A為線性變換,把任意一個分布變換到均值μ方差1的范圍內(nèi),如圖所示(二維分布,先y方向壓縮,再繞原點旋轉(zhuǎn)一定角度)
因此矩陣A構(gòu)造:變換矩陣A=旋轉(zhuǎn)矩陣R*縮放(尺度變換)矩陣S
-
優(yōu)化:在迭代優(yōu)化過程中,優(yōu)化矩陣A的內(nèi)容,即可改變高斯橢球的形狀、大小、方向等幾何外觀(點里存儲的數(shù)據(jù)),從而使它在Splatting的時候投影出正確的效果。
旋轉(zhuǎn)矩陣的優(yōu)化:不適合直接讓3*3的旋轉(zhuǎn)矩陣參與優(yōu)化,因此用四元數(shù)參與優(yōu)化并轉(zhuǎn)化。將參數(shù)從9個降低到4個,而且能保持協(xié)方差矩陣的半正定性質(zhì),同時四元數(shù)方便插值。
-
求導(dǎo):如何讓矩陣A對尺度s和四元數(shù)q求偏導(dǎo)?論文附錄有推導(dǎo)過程。
-
渲染:橢球怎樣投影成平面的圖像?CG有深入研究,對協(xié)方差矩陣做變換即可,文中引用的01年文獻(xiàn)有說明。
2、優(yōu)化與自適應(yīng)密度控制
2.1 優(yōu)化
- 每個點里存儲的上述四個數(shù)據(jù)都要參與優(yōu)化。
- 優(yōu)化策略:隨機梯度下降(Stochastic Gradient Descent)
- 自寫CUDA核心加速
- 快速光柵化,提高效率
- Sigmoid和Exponential激活函數(shù):Sigmoid函數(shù)限制不透明度在[0,1)之內(nèi);協(xié)方差矩陣?yán)锏某叨扔弥笖?shù)激活函數(shù)(常規(guī)細(xì)節(jié))。
- 損失函數(shù): L1 loss,渲染圖像和GT圖像求光度誤差,按一定比例λ加上SSIM結(jié)構(gòu)相似性的誤差。
小實驗:用3DGS這種緊湊的表達(dá)方式,確實能在優(yōu)化之后擬合復(fù)雜的幾何細(xì)節(jié)。
渲染了一張圖像后把3DGS Shrink,收縮到原來的60%,細(xì)節(jié)仍然在(但也可能是點云的功勞)。文章來源:http://www.zghlxwxcb.cn/news/detail-793453.html
2.2 點云密度自適應(yīng)控制
- 使系統(tǒng)能夠從稀疏的,質(zhì)量不高的初始點云,甚至是隨機初始化的點云里擬合出比較好的模型。
- 每隔一定迭代次數(shù),移除不透明度α小于閾值(接近透明)的點。
- 對重建不充分的區(qū)域進(jìn)行處理:往往有較大的梯度。 欠重建Under-reconstruction:clone
過重建Over-reconstruction:split
判斷重建是否充分的依據(jù):梯度。更新點的位置的時候如果梯度太大,說明這個位置誤差比較大,需要修正的量比較大。梯度超過閾值,執(zhí)行densify操作。
在第一行克隆的過程中按梯度方向安置新的點。 怎么區(qū)分上述兩種情況:方差大,說明這個3DGS很大,需要分割;方差小,,,克隆。 - 靠近相機的地方可能學(xué)出一些floaters(可能是漂浮的一些東西),屬于模型的錯誤重建。因此周期性的把不透明度重置為0,去除floaters,后續(xù)學(xué)習(xí)中真正要用到的點的不透明度將會回到正確的值,不用的不透明度太低的點會被剔除。
- 周期性移除較大的高斯用于避免重疊。
3、快速可微光柵化
Tile-based Rasterizer(渲染不僅僅是splatting)
- 把整個圖像分為16*16個tiles(區(qū)塊),每個tile視錐內(nèi)挑選可視的3DGS。
- 對于每個視錐內(nèi)只取置信度大于99%的高斯,實例化為一個個高斯對象,包含所在tile的id以及對應(yīng)視域下的深度,并按深度排序。(不需要逐像素地進(jìn)行排序,突破了傳統(tǒng)光柵化的瓶頸)
- 排序之后,按這些GS到圖像平面的深度值的排序順序,從近到遠(yuǎn)往對應(yīng)的tile上做splat。把splat留下的痕跡做堆疊累積,直到不透明度飽和(為1)。每個tile單獨開一個線程塊,可以認(rèn)為所有tile上的光柵化(從堆疊的splat痕跡中去劃分像素網(wǎng)格,生成像素值)是并行運行的。
- 有像素的不透明度達(dá)到飽和,就停止對應(yīng)的線程。(而不是所有像素都飽和之后才停止,加速)
- 渲染完圖像,求出誤差反向傳播的時候,就可以根據(jù)剛才的排序來找到需要優(yōu)化的GS。在tile的尺度上回溯做了splat的點。(之前的工作中,這種像素誤差傳遞需要對每個像素記下哪些點位顏色做了貢獻(xiàn)。)之前的NeRF方法為了加速訓(xùn)練過程中的渲染往往不會做全圖的渲染,而是隨機選取一定數(shù)量的像素點采樣來求誤差。而本文每次迭代都在做全圖的渲染,因此圖像會有更高的收斂速度和更高的訓(xùn)練效率。
總結(jié)流程:文章來源地址http://www.zghlxwxcb.cn/news/detail-793453.html
- 從初始的sfm點云出發(fā),以每個點為中心生成3DGS。
- 用相機參數(shù)把點投影到圖像平面上(splatting)。
- 從splatting的痕跡中tile-based光柵化,得到渲染圖像,將渲染圖像和GT求LOSS,反向傳播。
- 自適應(yīng)的密度控制模塊根據(jù)傳遞到點上的梯度,來決定是否需要對3DGS做分割或者克隆。梯度傳遞到3DGS里面對其存儲的那幾個參數(shù)進(jìn)行更新。
到了這里,關(guān)于3D Gaussian Splatting for Real-Time Radiance Field Rendering 閱讀筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!