NY

3DGS 的表示、渲染與優化

弱紋理場景中的高斯表示與重建
技術筆記 神經渲染 3D Gaussian Splatting 3DGS 輻射場 新視角合成 可微渲染 點基渲染 SfM 球諧函數

新視角合成與 3DGS 的計算路徑

給定同一個靜態場景的多張照片,以及每張照片對應的相機內參和位姿,任務是在訓練數據之外生成新的觀察視角。這個問題稱為新視角合成(Novel View Synthesis,NVS)。完成這項任務需要先建立可供渲染的場景表示,再依照目標相機的位置與方向生成圖像。

NeRF 使用神經網絡表示連續的輻射場。渲染目標視角時,每個像素向場景發出一條光線,沿光線採樣多個空間位置,查詢各位置的顏色與密度,最後以體積渲染累積成像。這條路徑具有很強的表示能力,高分辨率圖像卻會帶來大量空間採樣與網絡推理。

3D Gaussian Splatting(以下簡稱 3DGS)沿用多視角圖像監督,場景表示改為一組可學習的三維高斯。渲染時,高斯由三維空間投影到目標相機的圖像平面,再經光柵化與 Alpha 混合合成像素。NeRF 的計算順序是「像素—光線採樣—場景查詢」,3DGS 則是「三維圖元—圖像投影—像素合成」;後者更適合 GPU 並行處理,也由此獲得實時渲染能力 [1, 2]

Instant-NGP、Plenoxels、Mip-NeRF 360 與 3DGS 在自行車場景上的渲染結果、訓練時間、PSNR 和幀率對比
自行車場景中,3DGS 在 $6$ 分鐘訓練後以 $135$ FPS 渲染並達到 $23.6\,\mathrm{dB}$;訓練 $51$ 分鐘後為 $25.2\,\mathrm{dB}$ 和 $93$ FPS。圖中同時列出 Instant-NGP、Plenoxels 與 Mip-NeRF 360,把質量、訓練時間和渲染速度放在同一視角下比較 [1]

原論文的總覽圖把這條路徑連同訓練時的梯度反傳放在同一張圖中:SfM 點雲提供初始幾何,高斯經投影與光柵化形成圖像,圖像誤差再經反向傳播送回投影、密度控制與高斯參數。

3DGS 的優化與渲染流程
3DGS 的優化與渲染流程;黑色箭頭表示運算流程,藍色箭頭表示梯度反傳 [1]

3DGS 將場景表示的基本單元直接納入優化:每個高斯的參數會連續更新,高斯數量也會隨訓練增減。渲染器在生成圖像的同時,還需要為局部基底的移動、縮小和增生提供梯度信號。後文的公式推導將沿著這條梯度鏈展開。

三維高斯的場景表示

3DGS 使用 SfM(Structure from Motion)估計相機位姿,並利用 SfM 附帶生成的稀疏點雲初始化高斯中心。對第i個高斯,可以把其狀態概括為

Gi=(μi,si,qi,αi,hi).

各部分的含義如下:

參數含義主要作用
μiR3三維中心決定高斯在世界中的位置
siR3三個主軸尺度決定橢球沿不同方向的大小
qi旋轉四元數決定橢球主軸朝向
αi[0,1)可學習不透明度控制高斯對像素的遮擋與貢獻
hi球諧係數表示隨觀察方向變化的顏色

若使用三階球諧,也就是L=3,單個高斯以浮點數實際存儲的參數量為

3μ+3s+4q+1α+3(L+1)SH2=59.

四元數雖然存儲四個量,歸一化後只有三個旋轉自由度。以 FP32 計算,59 個量佔 236 bytes;一百萬個高斯僅模型參數就約為 225 MiB,尚未計入 Adam 的一、二階動量與光柵化器的臨時數據。這個簡單的估算已經說明,3DGS 的實時渲染速度不等於表示本身輕量,壓縮與結構化存儲會成為後續研究的重要分支。

以中心μi和協方差Σi定義的三維高斯核為

Gi(x)=exp[12(xμi)TΣi1(xμi)].

式中省略了機率密度函數的歸一化係數。3DGS 將高斯核用作具有空間範圍的軟圖元:核函數描述影響力從中心向外衰減的方式,可學習不透明度αi控制其幅值。

協方差的尺度—旋轉參數化

梯度更新若直接作用於任意3×3矩陣,可能破壞協方差所需的半正定性。3DGS 分別學習尺度與旋轉,再由兩者構造Σi

Si=diag(si),Σi=R(qi)SiSiTR(qi)T.

這種寫法便於實現,並從構造上保證了半正定性。對任意向量z,有

zTΣiz=zTRSSTRTz=STRTz220.

只要尺度保持為正、旋轉四元數經過歸一化,這個矩陣就始終具有合理的橢球幾何意義。實現中令無約束變量ρiR3經指數函數映射為尺度,並以 Sigmoid 映射不透明度:

si=exp(ρi),αi=sigmoid(oi).

Ri的第k個列向量記作ri,k,協方差還可以展開成

Σi=Ridiag(e2ρi,1,e2ρi,2,e2ρi,3)RiT=k=13e2ρi,kri,kri,kT.

所以它的三個特徵值正好是e2ρi,k,有限尺度下嚴格大於零;對數尺度的導數為

Σiρi,k=2e2ρi,kri,kri,kT.

這裡有一個很實用的含義:ρ的加法更新對應s的乘法縮放。不同大小的高斯可以共用相近量級的優化步長,梯度也始終沿著合法橢球的主軸調整。協方差參數化由此同時提供幾何約束與數值尺度的整理。

各向異性提高了表示的緊湊性。球形高斯只有一個尺度,覆蓋牆面時需要堆疊大量小球;可旋轉、可拉伸的橢球能貼近牆面、葉片、欄杆或物體邊界,用較少圖元描述具有方向性的局部結構。

原論文將收斂後的高斯縮小至原尺度的 60%,藉此顯露平時被 splatting 覆蓋的橢球輪廓。通風柵的細長葉片由方向一致的扁平高斯排列而成,直觀呈現了協方差對局部形狀的刻畫。

各向異性高斯對局部幾何的貼合
各向異性高斯對局部幾何的貼合;右側分別為正常渲染與縮小至 60% 後的高斯 [1]

球諧係數與視角相關顏色

同一個位置從不同方向觀看時,顏色可能因高光等效應而改變。3DGS 為每個高斯保存球諧(Spherical Harmonics,SH)係數,將觀察方向d上的顏色寫成

ci(d)==0Lm=hi,mYm(d).

原文所稱的四個 SH bands 對應=0,1,2,3,因此每個顏色通道共有

=03(2+1)=(3+1)2=16

個基底係數。訓練從零階的基礎顏色開始,再逐步加入更高階頻帶。這能降低角度觀測不足時,高階方向成分過早吸收誤差所造成的不穩定。

SH 描述的是外觀隨方向的變化。光源、材質與反射仍未被顯式建模,因此這些係數可以擬合一部分視角相關現象,卻不會自動給出物理正確的反照率或光照分解。

三維高斯的二維投影

渲染時,世界空間中的三維橢球會被投影成圖像平面上的二維橢圓。中心點遵循普通的相機投影,橢圓形狀則由協方差在透視投影下的變換決定。

設高斯中心經世界到相機變換後為

xc=[xcyczc]T=Rcwμi+tcw.

針孔相機的投影函數為

π(xc)=[fxxc/zc+cxfyyc/zc+cy],

所以二維中心是μi=π(xc)。透視除法屬於非仿射變換,協方差無法直接套用線性變換規則。3DGS 在高斯中心附近對π做一階泰勒展開:

π(xc+Δx)π(xc)+JiΔx,

其中投影雅可比矩陣為

Ji=[fx/zc0fxxc/zc20fy/zcfyyc/zc2].

這個雅可比可以直接從透視除法的微分得到。以水平座標u=fxxc/zc+cx為例,

du=fxzcdxcfxxczc2dzc,

垂直座標同理。它也揭示了深度的作用:相同的三維位移在近處產生更大的像素位移,沿深度方向的擾動還會被xc/zc2yc/zc2放大。

把高斯中心附近的世界空間偏移記為隨機向量Δxw,滿足

E[Δxw]=0,E[ΔxwΔxwT]=Σi.

相機空間偏移為Δxc=RcwΔxw,一階投影偏移為ΔpJiΔxc。因此二維協方差可以逐步推出:

Σi=E[ΔpΔpT]JiRcwE[ΔxwΔxwT]RcwTJiT=JiRcwΣiRcwTJiT.

原論文將它寫成

Σ=JWΣWTJT.

該式採用圍繞高斯中心的局部仿射近似,未精確涵蓋整個橢球的非線性透視變換。xc/zc的二階導數包含1/zc22xc/zc3,因此高斯相對深度越大、中心越靠近相機,忽略的二階項越明顯。光柵化器使用 near-plane guard band 排除極端高斯,背後對應的正是這個近似條件。

得到二維中心與二維協方差後,高斯在像素p上的 footprint 為

gi(p)=exp[12(pμi)T(Σi)1(pμi)],

其有效不透明度則是

ai(p)=αigi(p).

「Splatting」即將一個三維高斯繪製成具有面積、方向和軟邊界的二維橢圓核,使其影響周圍一組像素。實現中不可能遍歷無限支撐域,因而會取馬氏距離閾值τ

Di2(p)=(pμi)T(Σi)1(pμi)τ2.

這個橢圓在水平與垂直方向的最大半徑分別為

rx=τ(Σi)11,ry=τ(Σi)22.

[μi,xrx,μi,x+rx]×[μi,yry,μi,y+ry]可快速得到軸對齊包圍盒,再判定它與哪些 tiles 相交。協方差投影公式到 tile 光柵化之間的連接,正是這個有限橢圓包圍盒。

Alpha 混合與像素合成

一個像素通常被多個高斯覆蓋。將它們按相機深度由近到遠排列後,像素顏色為

C(p)=i=1NTi(p)ai(p)ci(d),

其中

Ti(p)=j=1i1[1aj(p)]

是光線到達第i個高斯前仍未被遮擋的透射率。若考慮背景顏色cbg,還可以補上

TN+1(p)cbg.

實際計算時不需要反覆展開乘積,可以使用前向遞推:

C0=0,T1=1,Ci=Ci1+Tiaici,Ti+1=Ti(1ai).

每處理一個高斯,只更新一次顏色與透射率。當Ti足夠接近零,更遠的高斯對結果和梯度都幾乎沒有影響,提前終止(early termination)因而同時具有圖像形成與計算上的依據。

這個式子與 NeRF 離散體積渲染的圖像形成模型非常接近。差別在於,NeRF 通常從體密度σi和採樣間隔δi計算

ai=1exp(σiδi),

3DGS 直接學習高斯的不透明度αi,再乘上二維高斯 footprint。兩類方法都以「透射率 × 當前不透明度 × 顏色」累積像素,圖元與不透明度的來源則各不相同。

高斯核對二維中心可微:

giμi=gi(p)(Σi)1(pμi).

Alpha 混合對不透明度的梯度也能寫出很直觀的形式。令C>k表示第k個高斯後方所有內容(包括背景)在局部重新歸一化後的合成顏色,則整個像素可拆成

C=C<k+Tk[akck+(1ak)C>k].

ak求導可得

Cak=Tk(ckC>k).

這個式子比「整條鏈可微」更能說明訓練行為。前方圖元已接近不透明時,Tk很小,後方高斯很難獲得梯度;當高斯顏色與其後方合成色接近時,調整不透明度同樣不會顯著改變圖像。位置、顏色與不透明度因此存在互相補償的空間,僅靠圖像損失未必能得到唯一或幾何正確的場景。

圖像誤差仍可經過混合、二維 footprint、投影和協方差參數化,一路反向傳播至三維位置、尺度、旋轉、不透明度與 SH 係數。上面的梯度分析也預示了兩個常見問題:遮擋後方的幾何學得較慢,具有相似顏色的錯誤高斯則可能長時間留在場景中。

Tile-based 光柵化器與實時渲染

如果每個像素各自搜索所有高斯並排序,計算仍然會非常昂貴。3DGS 的 CUDA 光柵化器採用 tile-based 流程:

  1. 將圖像平面劃分成16×16像素的 tiles。
  2. 做視錐裁剪,只保留可能影響圖像的高斯;論文實現以高斯的 99% 置信區間判斷相交,並用 guard band 排除投影不穩定的極端高斯。
  3. 計算每個二維高斯覆蓋哪些 tiles;若跨越多個 tile,就為每個相交 tile 生成一份索引。
  4. 將 tile ID 與視空間深度組合成排序鍵,使用 GPU radix sort 一次完成分組與近似的深度排序。
  5. 每個 tile 由一個線程塊(thread block)處理。高斯數據分批載入共享內存(shared memory),tile 內的像素執行各自的 Alpha 混合。
  6. 當某個像素的不透明度已接近飽和,就停止處理更遠的高斯;當 tile 內所有像素都飽和,整個 block 可以提前結束。

M為視錐內高斯數,K為高斯與 tile 相交後生成的實例數,P為像素數,n¯為提前終止前每個像素實際混合的平均高斯數。忽略固定次數的 radix-sort passes,主要工作量可以概括為

O(M)投影與裁剪+O(K)複製、排序與分組+O(Pn¯)像素混合.

這個估算說明渲染時間並非只由高斯總數決定。大 footprint 會同時推高Kn¯,深度重疊嚴重的場景也會增加n¯;反過來,即使模型包含很多高斯,只要大多數高斯很小、可快速裁剪,仍可能維持較高幀率。評估壓縮或剪枝方法時,僅報告高斯數量容易漏掉真正的光柵化負擔。

tile 層級排序會讓某些高斯交疊情況下的 Alpha 混合帶有近似性。原論文指出,當訓練收斂且 splat 接近像素尺度時,這類近似通常不會形成可見偽影。統一的 tile 列表同時帶來規則的內存訪問和大規模並行計算。

反向傳播會重用前向已排序的 tile 列表,從後向前遍歷並恢復所需的中間量,免去為每個像素保存任意長度混合歷史的開銷。3DGS 設計中容易被公式掩蓋的一點是,實時性來自表示、近似排序、內存布局與停止條件共同配合,單獨把高斯投影公式搬到 GPU 並不會自然得到同樣的速度。

渲染質量、速度與存儲開銷

原論文在 Mip-NeRF 360 數據集上同時報告圖像指標、訓練時間、渲染幀率與模型存儲 [1]

方法SSIM ↑PSNR ↑LPIPS ↓訓練FPS存儲
Mip-NeRF 3600.79227.690.23748 h0.068.6 MB
3DGS-7k0.77025.600.2796 min 25 s160523 MB
3DGS-30k0.81527.210.21441 min 33 s134734 MB

7k30k迭代之間,PSNR 提高1.61dB,LPIPS 從0.279降到0.214,模型存儲則從523MB 增加到734MB,幀率從160降到134。訓練後期增加的圖元和外觀容量改善了質量,也同時增加投影、排序和存儲成本。

Mip-NeRF 360 的三項質量數值由 3DGS 論文從原工作轉錄,效率數據也受實現與硬件影響,因此這張表更適合用來讀取數量級和方法內部的質量—成本曲線。若要比較當代實現,還需要統一 GPU、分辨率、渲染代碼與計時邊界。

高斯集合的優化與密度控制

3DGS 在更新高斯連續參數的同時,也會離散地調整高斯集合。兩類操作交錯進行,大致可以寫成:

flowchart TD A["SfM 相機與稀疏點雲"] --> B["初始化高斯位置、尺度、不透明度與顏色"] B --> C["抽取訓練視角"] C --> D["投影與 tile 光柵化"] D --> E["合成圖像"] E --> F["計算重建損失"] F --> G["反向傳播並更新高斯參數"] G -->|"下一次迭代"| C G -.->|"每隔若干迭代"| H["Clone / Split / Prune / Opacity Reset"] H --> C

初始化

3DGS 從 SfM 稀疏點的位置開始。每個初始高斯先設為各向同性,其尺度參考最近三個 SfM 點的平均距離。這提供了比完全隨機分布更可靠的幾何起點,但初始點仍遠不足以覆蓋完整表面,因此必須在訓練中增密。

Clone:欠重建區域的複製

論文以視空間位置梯度的平均幅值判斷哪些高斯仍在努力移動以降低誤差。若第i個高斯在Mi次可見觀測中的二維中心為μi,m,可以把這個統計量概括成

gi=1Mim=1MiLmμi,m2.

gi超過閾值,而且高斯尺度較小,通常表示現有圖元太少、無法覆蓋附近結構。此時複製一個同尺度高斯,並沿位置梯度方向移動副本。

Clone 同時增加高斯數量與局部覆蓋體積,適合補上欠重建區域。不過gi是屏幕空間信號,會受到焦距、圖像分辨率、相機距離與可見視角數影響。固定的0.0002閾值具有明顯的數據與實現尺度,難以視為場景幾何誤差的普適界線。

Split:大尺度高斯的分裂

位置梯度與高斯尺度同時偏大,通常說明單一圖元負責的範圍過廣。3DGS 以兩個較小高斯取代它:新中心從原高斯分布中採樣,尺度除以實驗設定的1.6

Split 主要提高局部表示分辨率,使一個模糊的大橢球逐漸分工成數個能貼近細節的小橢球。這裡可以檢查「分裂後體積延續」的含義。若以一個協方差橢球的尺度體積

VidetΣi=si,xsi,ysi,z

衡量,兩個 child 的三軸尺度都除以1.6時,總尺度體積與 parent 的比值為

VchildrenVparent=21.630.488.

所以論文所描述的體積延續,更適合解讀為兩個新中心對原空間覆蓋範圍的延續,協方差橢球體積並未嚴格守恆。1.6是經驗設定,它同時增加基底數量並收縮單個基底的支撐域。

不透明度也有類似問題。若把一個有效不透明度ap的 parent 換成n個完全重合、顏色相同的 children,每個 child 的不透明度為ac,合成後為

aeff=1(1ac)n.

要求分裂前後立即保持相同遮擋量,應取

ac=1(1ap)1/n.

3DGS 的密度控制沒有把這類守恆式設為硬約束,分裂後仍交給圖像損失、不透明度重置與剪枝共同修正。從這個角度看,clone 與 split 更接近模型結構的啟發式搜索,並不保持某個連續場完全等價的解析細分。

自適應增密的兩種情形
自適應增密的兩種情形:欠重建區域複製小高斯,過度粗糙的區域分裂大高斯 [1]

Prune:剪枝與不透明度重置

持續增密會令高斯數量失控,也會留下漂浮點。3DGS 會移除不透明度低於閾值、世界空間尺度過大或屏幕 footprint 過大的高斯;訓練中還會周期性把不透明度重置到接近零,讓有穩定圖像貢獻的高斯重新獲得較高不透明度,其餘高斯則在後續剪枝中消失。

原論文的參考設定包括:預熱後每 100 次迭代做一次增密,以平均視空間位置梯度0.0002作為候選閾值,並每 3000 次迭代重置不透明度。這些數字屬於論文實驗的超參數,會隨數據尺度、圖像分辨率與方法改動而調整。

3DGS 的完整管線

上述機制可分成三個彼此咬合的循環:

循環輸入與輸出解決的問題
表示循環尺度、旋轉合法協方差讓高斯能貼合具有方向性的局部幾何
渲染循環3D 高斯2D splat像素以可微、可並行的方式生成訓練圖像與新視角
結構循環梯度統計clone / split / prune讓圖元數量與空間分布跟著場景複雜度改變

N為當前高斯數量,ΘN為全部連續參數,訓練目標可以抽象成

minN,ΘNmL(R(ΘN;Cm),Im),

其中R是可微光柵化器,Cm是第m個相機。Adam 在固定N時更新ΘN;clone、split 與 prune 則改變N和參數空間本身。這是一個混合了連續參數與離散結構的優化問題,原方法以交替啟發式操作近似求解。

更合適的理解是把一組高斯看成可增刪的局部基底。位置、尺度、旋轉、SH 與不透明度是基底的係數和形狀,圖像梯度衡量現有基底能否解釋觀測,增密則在殘差較大的位置增加自由度。Prune 和 opacity reset 承擔近似的複雜度控制,儘管目標函數裡沒有顯式寫出βN這類模型規模懲罰。這個視角也能解釋為何單純沿用高斯表示、卻拿掉密度控制,通常很難重現完整 3DGS 的效果。

3DGS 的表示範圍

場景表示與物體表面

3DGS 的直接目標是新視角圖像質量,輸出為一組體積式高斯圖元,沒有三角網格所具備的拓撲連接關係。高斯中心和扁平橢球經常落在表面附近;可測量表面、法線或網格仍需要額外幾何約束或表面提取。

高斯的方向與外觀屬性

每個高斯除了位置,還有完整的方向性尺度、不透明度和視角相關顏色;投影後的二維 footprint 也會隨相機與深度改變。「帶半徑的點」不足以描述協方差投影與 Alpha 混合所帶來的行為。

與體積渲染的關係

3DGS 與體積渲染共享相近的 Alpha 合成形式。它直接光柵化顯式高斯圖元,沒有沿光線積分連續密度,渲染中還包含局部投影與 tile 級排序近似。

增密機制的判據

3DGS 根據視空間位置梯度選取候選,再由尺度區分 clone 與 split,並以剪枝和不透明度重置抑制冗餘。這套判據分別處理欠重建、過度粗糙的表示與無效圖元。

限制與適用範圍

3DGS 具備顯式結構、快速訓練、實時高分辨率渲染,以及比普通點雲更連續靈活的表示,同時受到以下條件限制 [2]

  • 它依賴已標定的多視角圖像與足夠可靠的 SfM 初始化;稀疏視角或錯誤位姿會直接影響結果。
  • 優化目標以圖像重建為主,幾何可以被外觀補償,因而不保證表面精確。
  • SH 能擬合視角相關顏色,但不會自然分離材質、光照、陰影與幾何誤差。
  • 數十萬乃至數百萬個高斯會帶來存儲與顯存成本。
  • 大型、近相機或交疊複雜的高斯會放大投影與排序近似造成的偽影。
  • 3DGS 面向靜態場景,沒有直接處理物體運動、形變或時間一致性。

後續 3DGS 研究由此延伸出抗混疊、幾何正則、壓縮、大場景、稀疏輸入、動態建模、材質與光照解耦等方向。

結語

3DGS 最值得延續的思想,是讓場景基底、可微渲染與 GPU 執行模型彼此配合。協方差給局部基底以方向和尺度,投影雅可比把三維擾動傳到像素,Alpha 混合建立遮擋與梯度,tile 光柵化器再把這些計算整理成 GPU 能高效執行的數據流。高斯集合還能在訓練中改變規模,表示容量由殘差逐步長出來。

這條管線也留下了清楚的近似邊界:透視投影只在中心附近線性化,tile 共用排序不能涵蓋所有逐像素深度關係,圖像損失允許外觀補償幾何,clone 與 split 又依賴視空間閾值和經驗倍率。後續研究中的抗混疊、幾何正則、重新參數化與更穩定的密度控制,都可以追溯到其中某一處近似。

理解 3DGS 時,還需要追問每個公式向實現做了哪些讓步:協方差如何變成有限包圍盒,透射率何時讓梯度消失,分裂是否真的守恆,高斯數量又如何影響 tile 實例數。沿著這些問題往下走,後續方法的改動位置與代價會比單純記住一張流程圖清晰得多。

參考文獻

  1. Kerbl B, Kopanas G, Leimkühler T, et al.. 3D Gaussian Splatting for Real-Time Radiance Field Rendering[J]. ACM Transactions on Graphics, 2023, 139:1–139:14.↩1 ↩2 ↩3 ↩4 ↩5 ↩6
  2. Chen G, Wang W. A survey on 3d gaussian splatting[J]. ACM Computing Surveys, 2024.↩1 ↩2
Copyright © Nishikori Yui. All rights reserved.