別及3DGS優(yōu)化全流程詳解)
1. 3DGS與NeRF的區(qū)別NeRFNeural Radiance Fields和3DGS3D Gaussian Splatting是當(dāng)前三維場(chǎng)景重建與渲染領(lǐng)域的兩大主流技術(shù)它們?cè)诒硎痉绞?、渲染流程、性能和?yīng)用場(chǎng)景上存在顯著差異。1.1 表示方式NeRF采用隱式神經(jīng)表示。場(chǎng)景被建模為一個(gè)連續(xù)函數(shù)輸入空間位置和觀察方向輸出該點(diǎn)的顏色和體密度。# NeRF隱式函數(shù)表示 (F_{\theta}(\mathbf{x}, \mathbfcj3uvhbzvbv) \rightarrow (\mathbf{c}, \sigma))3DGS采用顯式3D高斯表示。場(chǎng)景由一組離散的、可學(xué)習(xí)的3D高斯橢球構(gòu)成。每個(gè)高斯橢球由以下參數(shù)定義位置均值協(xié)方差矩陣控制橢球的形狀和方向不透明度顏色通過(guò)球諧函數(shù)SH系數(shù)表示1.2 渲染流程N(yùn)eRF基于體渲染Volume Rendering。沿相機(jī)光線采樣多個(gè)點(diǎn)通過(guò)神經(jīng)網(wǎng)絡(luò)查詢每個(gè)點(diǎn)的顏色和密度然后通過(guò)數(shù)值積分如分層采樣合成最終像素顏色。體渲染公式其中為透射率。3DGS基于可微光柵化Differentiable Rasterization。將每個(gè)3D高斯橢球投影到2D圖像平面形成2D高斯核然后通過(guò)alpha-blending按深度排序合成像素顏色。投影后的2D協(xié)方差矩陣其中為視圖變換矩陣為投影雅可比矩陣。像素顏色合成公式alpha-blending其中為按深度排序后覆蓋該像素的高斯集合。1.3 性能與特性對(duì)比特性NeRF3DGS表示方式隱式神經(jīng)網(wǎng)絡(luò)顯式3D高斯集合渲染速度慢需多次網(wǎng)絡(luò)前向快可微光柵化實(shí)時(shí)訓(xùn)練速度慢數(shù)小時(shí)至數(shù)天快數(shù)分鐘至數(shù)小時(shí)顯存占用較低網(wǎng)絡(luò)參數(shù)較高存儲(chǔ)大量高斯參數(shù)編輯性困難隱式表示容易顯式可增刪改高斯壓縮性一般網(wǎng)絡(luò)權(quán)重較好可量化、剪枝質(zhì)量高連續(xù)細(xì)節(jié)好高近年已接近NeRF2. 3DGS優(yōu)化全流程3DGS的優(yōu)化是一個(gè)從稀疏點(diǎn)云初始化為起點(diǎn)通過(guò)可微渲染、損失計(jì)算、參數(shù)更新、自適應(yīng)密度控制等步驟迭代優(yōu)化的過(guò)程。2.1 初始化通常從運(yùn)動(dòng)恢復(fù)結(jié)構(gòu)SfM得到的稀疏點(diǎn)云開(kāi)始。每個(gè)點(diǎn)云點(diǎn)被初始化為一個(gè)各向同性的3D高斯位置點(diǎn)云坐標(biāo)協(xié)方差初始為球體不透明度顏色SH系數(shù)初始為視圖無(wú)關(guān)的漫反射顏色2.2 可微渲染與損失函數(shù)每一輪迭代對(duì)訓(xùn)練視圖進(jìn)行可微渲染得到預(yù)測(cè)圖像并與真實(shí)圖像比較計(jì)算損失。常用損失函數(shù)為L(zhǎng)1損失與SSIM損失的加權(quán)和其中。2.3 參數(shù)優(yōu)化使用梯度下降法如Adam更新所有高斯的參數(shù)位置協(xié)方差矩陣實(shí)際優(yōu)化縮放和旋轉(zhuǎn)四元數(shù)不透明度球諧系數(shù)協(xié)方差矩陣由縮放和旋轉(zhuǎn)參數(shù)重建其中為由四元數(shù)轉(zhuǎn)換的旋轉(zhuǎn)矩陣。2.4 自適應(yīng)密度控制這是3DGS優(yōu)化的核心機(jī)制用于動(dòng)態(tài)增加克隆/分裂或刪除修剪高斯以更好地覆蓋場(chǎng)景幾何。克隆對(duì)于位置梯度大的高斯位于重建不足區(qū)域?qū)⑵鋸?fù)制一份并沿位置梯度方向輕微擾動(dòng)。分裂對(duì)于尺度過(guò)大協(xié)方差矩陣特征值過(guò)大的高斯將其分裂為兩個(gè)更小的高斯以增加局部細(xì)節(jié)。修剪定期移除不透明度低于閾值如0.005或體積過(guò)小的高斯以控制總數(shù)。2.5 優(yōu)化流程偽代碼# 初始化 gaussians initialize_from_sfm(point_cloud) optimizer Adam(gaussians.parameters()) for iteration in range(max_iterations): # 1. 可微渲染 rendered_image differentiable_rasterization(gaussians, camera_pose) # 2. 計(jì)算損失 loss (1 - lambda) * L1_loss(rendered_image, gt_image) lambda * (1 - SSIM(rendered_image, gt_image)) # 3. 反向傳播 loss.backward() optimizer.step() optimizer.zero_grad() # 4. 自適應(yīng)密度控制每N次迭代執(zhí)行 if iteration % density_control_interval 0: # 克隆梯度大的高斯 clone_gaussians_with_large_gradients(gaussians) # 分裂尺度過(guò)大的高斯 split_large_gaussians(gaussians) # 修剪不透明度過(guò)低的高斯 prune_opaque_gaussians(gaussians, threshold0.005) # 5. 重置不透明度可選避免飽和 reset_opacity(gaussians)2.6 收斂與輸出優(yōu)化完成后得到一組優(yōu)化的3D高斯集合可用于實(shí)時(shí)渲染在新視角下通過(guò)光柵化快速生成圖像。場(chǎng)景編輯直接修改、添加或刪除特定高斯。壓縮與傳輸對(duì)高斯參數(shù)