操:從照片到實(shí)時(shí)三維場(chǎng)景重建)
最近一段時(shí)間三維重建領(lǐng)域最熱的關(guān)鍵詞已經(jīng)從“NeRF”悄悄換成了“高斯飛濺”。如果你關(guān)注過(guò) CV 頂會(huì)論文或者三維視覺(jué)相關(guān)的開(kāi)源倉(cāng)庫(kù)大概率已經(jīng)見(jiàn)過(guò)這個(gè)名字也知道它的全稱叫 3D Gaussian Splatting通常縮寫為 3DGS。但真正值得開(kāi)發(fā)者關(guān)心的可能并不是“它比 NeRF 快了多少”這個(gè)表面結(jié)論而是它背后那套完全不同的場(chǎng)景表達(dá)方式把連續(xù)場(chǎng)景拆成上百萬(wàn)個(gè)可微分的三維高斯橢球再通過(guò)光柵化渲染到屏幕。這種“用粒子表達(dá)連續(xù)世界”的思路既繞開(kāi)了神經(jīng)輻射場(chǎng)的體渲染計(jì)算瓶頸又保持了照片級(jí)的渲染質(zhì)量才是它能在短短一年多時(shí)間里快速落地的真正原因。這篇文章會(huì)從實(shí)際工程出發(fā)先把高斯飛濺解決的核心問(wèn)題講清楚再拆解它的原理和訓(xùn)練流程最后給出一套可以在本地跑通的完整操作路徑。無(wú)論你是剛接觸三維視覺(jué)的開(kāi)發(fā)者還是正在做數(shù)字孿生、自動(dòng)駕駛仿真、VR 展示項(xiàng)目的工程師都可以照著本文的步驟和實(shí)踐建議做一次完整的場(chǎng)景重建實(shí)驗(yàn)。1. 這篇文章真正要解決的問(wèn)題在正式介紹高斯飛濺之前先想一個(gè)問(wèn)題如果你手里有一組從不同角度拍攝的照片比如幾十張手機(jī)拍攝的室內(nèi)場(chǎng)景照片你希望把它們變成“可以自由旋轉(zhuǎn)、縮放、從任意視角觀看”的三維模型過(guò)去你會(huì)怎么做傳統(tǒng)做法是走攝影測(cè)量流程。先把照片輸入到類似 COLMAP 的工具里做特征提取和稀疏重建得到相機(jī)位姿和稀疏點(diǎn)云再用 MVS多視角立體匹配生成密集點(diǎn)云最后經(jīng)過(guò)網(wǎng)格重建、紋理映射才能得到一個(gè)可以導(dǎo)入游戲引擎或三維軟件使用的模型。這條路線的缺點(diǎn)是明顯的中間環(huán)節(jié)多、參數(shù)敏感、計(jì)算時(shí)間以小時(shí)計(jì)而且植被、玻璃、反光表面這類場(chǎng)景經(jīng)常重建失敗。換句話說(shuō)傳統(tǒng)流程擅長(zhǎng)處理“建筑級(jí)”的剛性場(chǎng)景但不擅長(zhǎng)處理“復(fù)雜材質(zhì)、細(xì)節(jié)豐富”的真實(shí)環(huán)境。后來(lái)有了 NeRF。NeRF 通過(guò)一個(gè)多層感知機(jī)網(wǎng)絡(luò)把場(chǎng)景編碼成連續(xù)的顏色場(chǎng)和密度場(chǎng)渲染時(shí)從相機(jī)發(fā)射射線沿著射線采樣一堆空間點(diǎn)逐一查詢網(wǎng)絡(luò)輸出再做累加合成。這個(gè)方案在重建質(zhì)量和細(xì)節(jié)還原上比傳統(tǒng) MVS 強(qiáng)很多尤其是對(duì)復(fù)雜反射和半透明表面的表現(xiàn)力幾乎碾壓傳統(tǒng)方法。但它的代價(jià)也很大訓(xùn)練慢單個(gè)場(chǎng)景往往要訓(xùn)練數(shù)小時(shí)甚至更久渲染慢因?yàn)槊總€(gè)像素都要走大量神經(jīng)網(wǎng)絡(luò)前向推理同時(shí)場(chǎng)景是隱式表達(dá)很難直接編輯、切割或做二次處理。高斯飛濺的出現(xiàn)正好同時(shí)解決這兩個(gè)問(wèn)題。從方法歸屬上說(shuō)它屬于顯式場(chǎng)景表達(dá)每個(gè)三維高斯都有明確的中心位置、協(xié)方差矩陣、顏色和不透明度像一堆“模糊的小點(diǎn)”懸浮在空間中。訓(xùn)練時(shí)我們用圖像梯度對(duì)這些點(diǎn)做位置、形狀、顏色和透明度的迭代優(yōu)化使最終渲染結(jié)果逼近真實(shí)照片渲染時(shí)經(jīng)過(guò)排序和光柵化直接畫出這些橢球體不再需要神經(jīng)網(wǎng)絡(luò)推理也不再需要沿射線逐點(diǎn)采樣。所以如果你正在做以下事情高斯飛濺值得你重點(diǎn)關(guān)注需要用有限數(shù)量的照片快速生成高質(zhì)量的三維場(chǎng)景需要渲染速度足夠快甚至達(dá)到實(shí)時(shí)幀率需要場(chǎng)景可編輯、可定位、可嵌入現(xiàn)有三維引擎需要一種比 NeRF 更容易工程化的三維重建方案。一句話概括高斯飛濺真正降低的是“從一組照片到可交互三維場(chǎng)景”的工程成本。它把三維重建從“小時(shí)級(jí)加服務(wù)器級(jí)”往“分鐘級(jí)加單卡可跑”推進(jìn)了一大步。本文會(huì)按“原理—環(huán)境—實(shí)操—排錯(cuò)—工程建議”的順序把它講透。2. 三維重建技術(shù)演進(jìn)與高斯飛濺的定位要理解高斯飛濺最好先把它放進(jìn)三維重建的技術(shù)脈絡(luò)里。下表對(duì)比了傳統(tǒng)重建、NeRF 和高斯飛濺三種路線在關(guān)鍵維度上的差異技術(shù)路線場(chǎng)景表達(dá)方式訓(xùn)練速度渲染速度可編輯性硬件門檻適用場(chǎng)景傳統(tǒng)攝影測(cè)量MVS點(diǎn)云 / 網(wǎng)格 / 紋理中等快一般低測(cè)繪、建筑、靜態(tài)物體NeRF神經(jīng)網(wǎng)絡(luò)隱式場(chǎng)慢慢差較高科研、離線高質(zhì)量渲染3D Gaussian Splatting顯式三維高斯集合快實(shí)時(shí)好中等交互應(yīng)用、實(shí)時(shí)渲染、AR/VR從這個(gè)對(duì)比可以看出高斯飛濺并不是憑空冒出來(lái)的它是三維重建“顯式 vs 隱式”反復(fù)拉鋸之后找到的一個(gè)新平衡點(diǎn)。前面的章節(jié)提到NeRF 的優(yōu)點(diǎn)是渲染質(zhì)量高但它是隱式表達(dá)這意味著場(chǎng)景信息被編碼在神經(jīng)網(wǎng)絡(luò)權(quán)重里看不到、摸不著、剪不開(kāi)。如果你想在重建結(jié)果里做“刪除某個(gè)物體”“平移某個(gè)區(qū)域”這樣的操作是極其痛苦的。高斯飛濺則完全不一樣場(chǎng)景中的每個(gè)三維高斯都是一個(gè)可獨(dú)立操作的對(duì)象你可以按空間位置做裁剪也可以改變某一組高斯的屬性甚至把多個(gè)場(chǎng)景的高斯合并到一起。這種顯式特性讓它在工程落地上擁有天然優(yōu)勢(shì)。再往深處看3D Gaussian Splatting 的定位本質(zhì)上是一個(gè)“可微光柵化器”。論文作者把場(chǎng)景建模成上百萬(wàn)個(gè)三維高斯分布訓(xùn)練的第一步是用 SfM運(yùn)動(dòng)恢復(fù)結(jié)構(gòu)點(diǎn)云做初始化第二步是迭代優(yōu)化每個(gè)高斯的參數(shù)第三步是自適應(yīng)地對(duì)高斯進(jìn)行分裂、克隆和剪枝。渲染時(shí)所有高斯先按深度排序再投影到二維平面上與圖像像素做 alpha blending 合成。整個(gè)過(guò)程完全可微因此可以用 SGD 或 Adam 來(lái)逐步優(yōu)化參數(shù)。對(duì)開(kāi)發(fā)者來(lái)說(shuō)這里真正值得注意的點(diǎn)是高斯飛濺雖然看起來(lái)像“點(diǎn)云渲染”但它和普通點(diǎn)云有本質(zhì)區(qū)別。普通點(diǎn)云是離散的從一個(gè)角度看不到的點(diǎn)換一個(gè)角度依然看不到但高斯飛濺的每個(gè)元素是一個(gè)連續(xù)的“軟橢球”覆蓋一個(gè)局部區(qū)域通過(guò)透明度混合能夠表達(dá)連續(xù)表面同時(shí)保留一定的非剛性表達(dá)能力。這也是為什么高斯飛濺在渲染效果上遠(yuǎn)遠(yuǎn)好過(guò)傳統(tǒng)的“點(diǎn)云上色”但在效率上又遠(yuǎn)快于 NeRF 的原因。3. 高斯飛濺的核心原理拆解這一節(jié)會(huì)把 3D Gaussian Splatting 論文中的核心設(shè)計(jì)拆成幾個(gè)部分來(lái)理解。不追求把所有數(shù)學(xué)公式都推一遍而是重點(diǎn)說(shuō)明“每一層設(shè)計(jì)解決什么問(wèn)題”方便后續(xù)實(shí)操時(shí)定位問(wèn)題。3.1 三維高斯場(chǎng)景的最小單元高斯飛濺用“三維高斯分布”作為場(chǎng)景的基本表示。一個(gè)三維高斯可以理解為一個(gè)在空間中中心密度最高、向四周逐漸衰減的橢球體。它的數(shù)學(xué)參數(shù)包括中心位置高斯球在三維空間中的坐標(biāo)協(xié)方差矩陣決定橢球的形狀、大小和朝向顏色通常用球諧函數(shù)系數(shù)表示以便從不同視角觀察時(shí)顏色連續(xù)變化而不會(huì)出現(xiàn)生硬高光不透明度控制這個(gè)高斯對(duì)最終色彩合成的影響權(quán)重。場(chǎng)景初始化時(shí)通常使用 COLMAP 生成的稀疏點(diǎn)云作為每個(gè)高斯的中心。后續(xù)的訓(xùn)練過(guò)程就是不斷調(diào)整這些參數(shù)使渲染結(jié)果和真實(shí)拍攝圖像之間的誤差逐漸變小。3.2 可微光柵化渲染不再依賴射線追蹤NeRF 渲染時(shí)要沿視線方向采樣很多點(diǎn)計(jì)算量非常大。高斯飛濺則用了類似傳統(tǒng)圖形管線中的光柵化思路先把每個(gè)三維高斯投影到圖像平面上變成一個(gè)二維高斯形狀然后對(duì)所有投影到同一像素區(qū)域的高斯按照深度由近到遠(yuǎn)排序從前往后做 alpha 合成。這里的關(guān)鍵操作是“對(duì)高斯做分塊剪裁”論文中稱之為 tile-based rasterization。GPU 渲染時(shí)把圖像分成許多小塊tile每個(gè)小塊對(duì)應(yīng)一個(gè)線程塊共享同一組高斯數(shù)據(jù)減少重復(fù)排序開(kāi)銷。這個(gè)設(shè)計(jì)讓渲染速度大幅提升使得在訓(xùn)練完成后場(chǎng)景可以在普通消費(fèi)級(jí)顯卡上以實(shí)時(shí)幀率渲染。從開(kāi)發(fā)者角度看這一階段最容易混淆的概念是高斯飛濺并沒(méi)有真正“畫”出一個(gè)高斯的閉合表面每個(gè)高斯只是對(duì)場(chǎng)景局部顏色和密度的軟性擬合。因此渲染結(jié)果看起來(lái)會(huì)有“軟糖質(zhì)感”尤其是邊框、邊緣、細(xì)小結(jié)構(gòu)等區(qū)域可能出現(xiàn)模糊或飛濺狀偽影。這也是很多人在初學(xué)時(shí)誤以為“高斯飛濺效果不如 NeRF 精細(xì)”的原因——從某些靜態(tài)對(duì)比圖來(lái)看確實(shí)如此但在動(dòng)態(tài)旋轉(zhuǎn)、縮放和實(shí)時(shí)交互場(chǎng)景中高斯飛濺的總體體驗(yàn)要強(qiáng)很多。3.3 自適應(yīng)控制決定場(chǎng)景密度的關(guān)鍵機(jī)制訓(xùn)練一個(gè)高斯飛濺場(chǎng)景并不是簡(jiǎn)單地學(xué)固定數(shù)量的三維高斯而是在訓(xùn)練過(guò)程中動(dòng)態(tài)調(diào)整高斯數(shù)量。這一步叫自適應(yīng)密度控制大概邏輯是當(dāng)一個(gè)高斯覆蓋的區(qū)域在多個(gè)視角下出現(xiàn)了明顯的幾何缺失或顏色錯(cuò)誤時(shí)就把這個(gè)高斯分裂成兩個(gè)或者在其附近克隆一個(gè)新高斯當(dāng)一個(gè)高斯的不透明度很低、對(duì)最終圖像幾乎無(wú)貢獻(xiàn)時(shí)就把它刪除降低計(jì)算量當(dāng)一個(gè)高斯變得特別大、把遠(yuǎn)處區(qū)域的細(xì)節(jié)抹平時(shí)也把它拆分或縮小。正是因?yàn)橛辛诉@一步高斯飛濺才能從初始稀疏點(diǎn)云出發(fā)逐步生長(zhǎng)出覆蓋整個(gè)場(chǎng)景細(xì)節(jié)的高密度點(diǎn)集。實(shí)際重建一個(gè)室內(nèi)場(chǎng)景最終高斯數(shù)量通常在幾十萬(wàn)到數(shù)百萬(wàn)之間。3.4 損失函數(shù)與優(yōu)化訓(xùn)練損失主要由兩部分構(gòu)成L1 顏色損失和 SSIM 結(jié)構(gòu)相似性損失。前者保證逐像素顏色逼近后者保證局部結(jié)構(gòu)清晰。兩個(gè)損失的加權(quán)組合是訓(xùn)練過(guò)程中唯一直接監(jiān)督信號(hào)。這種簡(jiǎn)潔的設(shè)計(jì)讓 3D Gaussian Splatting 可以被快速工程化——數(shù)據(jù)準(zhǔn)備完成后只需要一個(gè) PyTorch 訓(xùn)練腳本就能完成全部?jī)?yōu)化。從實(shí)際工程角度如果想深入優(yōu)化一個(gè)場(chǎng)景通常可以調(diào)整的是損失權(quán)重、學(xué)習(xí)率、迭代次數(shù)、初始點(diǎn)云密度等。但首次上手時(shí)建議先用默認(rèn)參數(shù)跑通全流程再去動(dòng)這些超參數(shù)。4. 環(huán)境準(zhǔn)備與前置條件開(kāi)始實(shí)操之前先確認(rèn)硬件和軟件環(huán)境。下面的說(shuō)明以通用實(shí)踐為準(zhǔn)具體版本請(qǐng)以你下載的倉(cāng)庫(kù)當(dāng)前狀態(tài)為準(zhǔn)不要機(jī)械照搬舊教程。4.1 硬件要求GPU建議 NVIDIA 顯卡顯存 8GB 以上。訓(xùn)練一個(gè)普通室內(nèi)場(chǎng)景8GB 顯存屬于“能跑但偏緊”如果想重建大場(chǎng)景或高分辨率圖像建議 12GB 以上。內(nèi)存16GB 起步建議 32GB。加載多張高清圖像和中間緩存時(shí)內(nèi)存占用會(huì)比較明顯。磁盤預(yù)留 20GB 以上空間用來(lái)存放原始圖像、中間特征、點(diǎn)云模型和訓(xùn)練結(jié)果。4.2 軟件依賴主要依賴包括Ubuntu 20.04 或 22.04Windows 也可以跑但編譯環(huán)境會(huì)多踩一些坑CUDA 11.8 或更高版本版本請(qǐng)以顯卡驅(qū)動(dòng)和 PyTorch 的匹配關(guān)系為準(zhǔn)Python 3.8 或更高版本PyTorch 1.13 或更高版本需與 CUDA 版本匹配COLMAP用于從圖像生成稀疏點(diǎn)云和相機(jī)參數(shù)三個(gè)子模塊diff-gaussian-rasterization、simple-knn、submodules/diff-gaussian-rasterization。一個(gè)常見(jiàn)誤區(qū)是很多人以為高斯飛濺是一種“開(kāi)箱即用”的工具下載倉(cāng)庫(kù)后直接跑即可。實(shí)際上它需要編譯包含 CUDA 代碼的光柵化器子模塊編譯過(guò)程會(huì)遇到很多環(huán)境問(wèn)題這是新手最容易卡住的地方。4.3 準(zhǔn)備原始數(shù)據(jù)數(shù)據(jù)來(lái)源有兩種。第一種是自己拍攝圖像建議使用手機(jī)或相機(jī)繞著目標(biāo)勻速拍攝 50 到 300 張照片注意相鄰照片之間保持足夠的重疊度目標(biāo)物體盡量覆蓋畫面中心另一種是使用公開(kāi)數(shù)據(jù)集比如 Mip-NeRF 360、Tanks and Temples 等。無(wú)論哪種建議把圖像統(tǒng)一放到一個(gè)文件夾下例如data/input。拍攝時(shí)需要注意避免過(guò)度運(yùn)動(dòng)模糊快門速度盡量快避免重復(fù)拍攝同一角度的照片要讓相機(jī)位置沿軌跡變化場(chǎng)景光照盡量穩(wěn)定不要拍一會(huì)兒開(kāi)燈一會(huì)兒關(guān)燈對(duì)反光強(qiáng)烈、透明玻璃占比很大的場(chǎng)景高斯飛濺重建難度高需要額外處理。5. 從照片到場(chǎng)景完整實(shí)操流程下面以gaussian-splatting官方倉(cāng)庫(kù)為例演示從原始圖片到可交互三維場(chǎng)景的標(biāo)準(zhǔn)流程。操作中需要執(zhí)行的具體命令以你實(shí)際 clone 的倉(cāng)庫(kù) README 為準(zhǔn)這里展示的是通用思路。5.1 克隆倉(cāng)庫(kù)與安裝依賴git clone --recursive https://github.com/graphdeco-inria/gaussian-splatting.git cd gaussian-splatting # 創(chuàng)建虛擬環(huán)境 conda env create --file environment.yml conda activate gaussian_splatting這里使用--recursive參數(shù)是因?yàn)閭}(cāng)庫(kù)包含子模塊而子模塊包含了關(guān)鍵的 CUDA 光柵化實(shí)現(xiàn)。如果沒(méi)有加這個(gè)參數(shù)后面編譯時(shí)會(huì)提示找不到子模塊目錄。5.2 準(zhǔn)備數(shù)據(jù)目錄官方倉(cāng)庫(kù)約定數(shù)據(jù)目錄按照data/scene_name/來(lái)組織其下有input文件夾存放原圖images文件夾存放經(jīng)過(guò) COLMAP 處理后的圖像。為了省省磁盤和加快處理通常先用image_resize.py把圖像縮放到合適分辨率。python convert.py -s data/roomconvert.py會(huì)自動(dòng)完成以下操作讀取data/room/input下的原始圖像使用 COLMAP 提取特征做特征匹配輸出相機(jī)位姿和稀疏點(diǎn)云將圖像縮放并寫入data/room/images生成訓(xùn)練需要的sparse/0目錄內(nèi)含cameras.bin、images.bin、points3D.bin。只要這個(gè)命令成功完成后續(xù)訓(xùn)練就只是讓 GPU 去“學(xué)習(xí)”這些數(shù)據(jù)。如果這里失敗后面的訓(xùn)練不可能成功。5.3 開(kāi)始訓(xùn)練訓(xùn)練命令相對(duì)簡(jiǎn)單python train.py -s data/room -m output/room其中-s指定數(shù)據(jù)目錄-m指定輸出目錄。命令執(zhí)行后程序會(huì)經(jīng)過(guò)以下階段讀取相機(jī)參數(shù)和稀疏點(diǎn)云初始化三維高斯在訓(xùn)練循環(huán)中每迭代若干次就對(duì)渲染圖像和原圖計(jì)算 L1 與 SSIM 損失并反向傳播更新所有高斯參數(shù)定期執(zhí)行自適應(yīng)密度控制新增或刪除高斯保存檢查點(diǎn)。訓(xùn)練過(guò)程中終端會(huì)輸出每步的迭代次數(shù)和損失值。在 8GB 顯存的 GPU 上一個(gè) 100 張照片左右的場(chǎng)景訓(xùn)練幾萬(wàn)步通常需要 20 到 40 分鐘。實(shí)際時(shí)間取決于圖像分辨率、GPU 型號(hào)和迭代次數(shù)不要拿論文里的“幾分鐘”作為硬性預(yù)期那通常是在特定配置下的優(yōu)化結(jié)果。訓(xùn)練結(jié)束后output/room目錄下會(huì)生成多個(gè)文件其中比較重要的是point_cloud/目錄保存每一次保存點(diǎn)云時(shí)的三維高斯參數(shù)cameras.json相機(jī)參數(shù)描述cfg_args訓(xùn)練配置信息。5.4 渲染與導(dǎo)出訓(xùn)練完成后可以運(yùn)行渲染腳本以訓(xùn)練好的模型生成指定視角的圖像python render.py -m output/room該命令會(huì)遍歷驗(yàn)證集視角輸出渲染圖像到output/room/test目錄。同時(shí)你可以在根目錄運(yùn)行可視化腳本啟動(dòng)一個(gè)實(shí)時(shí)的交互窗口用鼠標(biāo)拖拽旋轉(zhuǎn)視角。如果需要導(dǎo)出可供其他三維軟件或引擎使用的網(wǎng)格官方倉(cāng)庫(kù)還提供了簡(jiǎn)單工具可以用 Marching Cubes 從點(diǎn)云和高斯中提取網(wǎng)格。不過(guò)要注意3D Gaussian Splatting 的定位并不是傳統(tǒng)三維網(wǎng)格重建它導(dǎo)出的網(wǎng)格質(zhì)量和網(wǎng)格化后的精細(xì)度通常不如原生渲染效果好。如果你需要的是帶貼圖的三角網(wǎng)格傳統(tǒng) MVS 流程可能仍然更合適。5.5 一個(gè)最小示例驗(yàn)證環(huán)境是否正常在跑完整訓(xùn)練之前建議先用官方倉(cāng)庫(kù)提供的示例場(chǎng)景驗(yàn)證環(huán)境。具體做法是下載一個(gè)已經(jīng)處理好的公開(kāi)場(chǎng)景數(shù)據(jù)放到data/目錄下直接執(zhí)行訓(xùn)練命令。這樣可以把“環(huán)境問(wèn)題”和“數(shù)據(jù)問(wèn)題”分開(kāi)排查。如果連現(xiàn)成數(shù)據(jù)都訓(xùn)練失敗那就先解決編譯和依賴問(wèn)題如果現(xiàn)成數(shù)據(jù)訓(xùn)練成功而自己的數(shù)據(jù)失敗問(wèn)題大概率出在拍攝質(zhì)量和 COLMAP 處理上。6. 訓(xùn)練效果與質(zhì)量驗(yàn)證訓(xùn)練完成后怎么判斷場(chǎng)景重建得好不好不能只看訓(xùn)練損失因?yàn)閾p失只反映了對(duì)訓(xùn)練視角的擬合程度不代表其他新視角的效果。更可靠的做法是分幾步驗(yàn)證。6.1 觀察新視角渲染用官方可視化工具載入訓(xùn)練結(jié)果從訓(xùn)練視角之外的任意角度觀察場(chǎng)景。重點(diǎn)看以下區(qū)域邊緣輪廓是否清晰有沒(méi)有大片模糊或重影細(xì)長(zhǎng)結(jié)構(gòu)如電線、樹(shù)枝、欄桿是否發(fā)生斷裂大面積光滑表面如白墻、玻璃有沒(méi)有斑駁的偽影視角轉(zhuǎn)動(dòng)時(shí)高光區(qū)域的顏色是否連續(xù)變化還是突然閃爍。如果發(fā)現(xiàn)新視角下很多區(qū)域是“霧狀”的往往說(shuō)明訓(xùn)練輪數(shù)不足或拍攝圖像數(shù)量不夠、視角覆蓋不全。6.2 量化指標(biāo)對(duì)比在評(píng)測(cè)腳本中通常會(huì)使用 PSNR、SSIM、LPIPS 三個(gè)指標(biāo)衡量渲染質(zhì)量。PSNR 越高越好SSIM 越接近 1 越好LPIPS 越低越好。初次實(shí)驗(yàn)時(shí)可以拿自己的結(jié)果和官方倉(cāng)庫(kù) README 中的示例數(shù)據(jù)做對(duì)比但不要期待完全一致因?yàn)橛布?、分辨率、迭代次?shù)都會(huì)影響結(jié)果。6.3 用測(cè)試視角做交叉驗(yàn)證如果拍攝時(shí)能額外采集一部分“測(cè)試視角”照片不參與訓(xùn)練專門用來(lái)驗(yàn)證就能更客觀地評(píng)估泛化能力。把測(cè)試照片輸入渲染腳本計(jì)算渲染結(jié)果和真實(shí)照片之間的差異。這是判斷“過(guò)擬合訓(xùn)練視角”的最直接方法。6.4 注意分辨率對(duì)質(zhì)量的影響圖像分辨率直接影響訓(xùn)練速度、顯存占用和最終質(zhì)量。分辨率過(guò)低細(xì)節(jié)紋理丟失嚴(yán)重分辨率過(guò)高訓(xùn)練時(shí)間和顯存開(kāi)銷成倍上升。常見(jiàn)做法是先縮放到 1600 像素左右觀察效果后再?zèng)Q定是否需要更高分辨率。如果你想做最終展示場(chǎng)景可以先用低分辨率做快速實(shí)驗(yàn)確定參數(shù)后再用高分辨率正式訓(xùn)練。7. 常見(jiàn)問(wèn)題與排查思路從社區(qū)反饋和實(shí)際經(jīng)驗(yàn)看以下問(wèn)題是上手高斯飛濺時(shí)最常見(jiàn)的幾類。問(wèn)題現(xiàn)象可能原因排查方式解決方案編譯 submodule 報(bào)錯(cuò)克隆時(shí)沒(méi)有加--recursive檢查子模塊目錄是否存在在倉(cāng)庫(kù)目錄執(zhí)行g(shù)it submodule update --init --recursiveCUDA 版本不匹配PyTorch 與 CUDA 工具鏈沖突執(zhí)行python -c import torch; print(torch.__version__)按 PyTorch 官方提示重裝匹配版本的 CUDA 和 PyTorchconvert.py 找不到 COLMAPCOLMAP 未安裝或未加入 PATH終端執(zhí)行colmap -h安裝 COLMAP 并確認(rèn)可執(zhí)行文件在 PATH稀疏重建失敗圖像質(zhì)量差、紋理特征少查看 COLMAP 輸出日志增加照片數(shù)量避免純色墻壁等弱紋理區(qū)域調(diào)整特征提取參數(shù)訓(xùn)練時(shí)顯存不足圖像分辨率過(guò)高、高斯數(shù)量過(guò)多查看nvidia-smi顯存占用降低圖像分辨率減少初始迭代次數(shù)關(guān)閉其他占用顯存的程序新視角出現(xiàn)嚴(yán)重霧狀偽影訓(xùn)練不充分或相機(jī)位姿不準(zhǔn)查看損失曲線和相機(jī)軌跡增加訓(xùn)練迭代檢查 COLMAP 重建的相機(jī)軌跡是否平滑渲染幀率低高斯數(shù)量太多、未分塊優(yōu)化觀察高斯數(shù)量使用官方 render 腳本的 tile-based 路徑不自行實(shí)現(xiàn) CPU 渲染W(wǎng)indows 編譯失敗依賴庫(kù)路徑和 CUDA 工具鏈配置不當(dāng)查看 CMake 編譯日志優(yōu)先用 Linux 環(huán)境或按官方 Windows 說(shuō)明逐項(xiàng)配置場(chǎng)景中玻璃和鏡面效果差3D GS 對(duì)純鏡面反射表達(dá)有限觀察是否與真實(shí)物理不符減少鏡面場(chǎng)景或在拍攝時(shí)避免高光反射大面積入鏡這里面最值得新手留意的是前三個(gè)環(huán)境類問(wèn)題。很多人花大量時(shí)間調(diào)訓(xùn)練參數(shù)結(jié)果發(fā)現(xiàn)卡在編譯環(huán)節(jié)白白消耗精力。建議按“子模塊 → CUDA 匹配 → COLMAP 可用 → 現(xiàn)成數(shù)據(jù)訓(xùn)練通過(guò) → 自有數(shù)據(jù)訓(xùn)練”的順序逐層推進(jìn)。7.1 訓(xùn)練過(guò)程中怎么判斷是否正常從終端輸出中可以看到損失值和當(dāng)前迭代步數(shù)。正常情況下?lián)p失應(yīng)當(dāng)整體下降中間有些抖動(dòng)很正常。如果損失長(zhǎng)時(shí)間不降或者反而上升可能是學(xué)習(xí)率設(shè)置不合適也可能數(shù)據(jù)中的相機(jī)位姿有嚴(yán)重錯(cuò)誤。此時(shí)不建議盲目加迭代次數(shù)而應(yīng)該回頭檢查 COLMAP 輸出的相機(jī)軌跡和稀疏點(diǎn)云數(shù)量。7.2 輸出結(jié)果中有大量飛濺偽影“飛濺”這個(gè)詞本身描述了渲染時(shí)高斯被投影到畫面上留下的痕跡。如果看到渲染圖上出現(xiàn)很多細(xì)長(zhǎng)的小塊通常是某些高斯在空間中被拉成了異常細(xì)長(zhǎng)的形狀。一種處理方式是在訓(xùn)練后修剪掉體積過(guò)小或透明度過(guò)高的高斯另一種方式是在訓(xùn)練中調(diào)整正則化相關(guān)參數(shù)讓高斯形狀更均勻。8. 最佳實(shí)踐與工程化建議如果前面幾步都跑通了下面這些建議能讓你在真實(shí)項(xiàng)目中少走很多彎路。8.1 數(shù)據(jù)采集規(guī)范固定相機(jī)參數(shù)盡量使用定焦鏡頭環(huán)繞目標(biāo)時(shí)相鄰照片角度差控制在 5 到 15 度之間光圈不要開(kāi)太大保持整個(gè)畫面清晰室內(nèi)場(chǎng)景要保證光照均勻不要出現(xiàn)大面積過(guò)曝或死黑不要只拍一個(gè)環(huán)形圈要增加俯拍、仰拍否則重建頂面和底面會(huì)失敗。8.2 訓(xùn)練參數(shù)調(diào)整順序進(jìn)入調(diào)參階段后優(yōu)先改這些參數(shù)圖像分辨率決定訓(xùn)練速度和顯存占用優(yōu)先調(diào)整迭代次數(shù)影響細(xì)節(jié)收斂程度和過(guò)擬合風(fēng)險(xiǎn)損失權(quán)重L1 和 SSIM 的權(quán)重影響邊緣銳度和顏色還原學(xué)習(xí)率通常保持默認(rèn)即可除非損失劇烈震蕩初始點(diǎn)云密度稀疏點(diǎn)云數(shù)量過(guò)少時(shí)可以在 convert 階段抽出更多特征點(diǎn)。調(diào)參時(shí)每次只改一個(gè)變量并記錄結(jié)果。不要同時(shí)改分辨率、迭代次數(shù)和損失權(quán)重否則很難定位到底是什么導(dǎo)致的改善或劣化。8.3 場(chǎng)景管理與版本控制高斯飛濺的產(chǎn)物本質(zhì)上是點(diǎn)云文件加訓(xùn)練配置。建議把原始照片、COLMAP 中間結(jié)果、訓(xùn)練輸出、導(dǎo)出網(wǎng)格分開(kāi)存放方便復(fù)現(xiàn)和對(duì)比。多輪實(shí)驗(yàn)可以使用類似下面的目錄結(jié)構(gòu)projects/room_scan/ ├── input/ # 原始照片 ├── processed/ # convert.py 生成的數(shù)據(jù) ├── runs/ │ ├── exp_1600_30000/ │ ├── exp_2000_40000/ │ └── exp_1200_20000/ └── reports/ # 截圖、指標(biāo)記錄8.4 與三維引擎集成如果想把高斯飛濺場(chǎng)景嵌入 UE、Unity 或 Web 應(yīng)用不能直接使用官方訓(xùn)練腳本的輸出而是需要轉(zhuǎn)換成對(duì)應(yīng)平臺(tái)支持的格式。目前社區(qū)中已經(jīng)有多種插件和轉(zhuǎn)換器可以把訓(xùn)練好的高斯模型打包成引擎可加載的格式。選擇插件時(shí)要注意版本匹配并重點(diǎn)測(cè)試大場(chǎng)景的加載和渲染性能。8.5 安全與合規(guī)提醒三維重建技術(shù)本質(zhì)上是對(duì)物理世界的數(shù)字化在采集公共空間、他人財(cái)產(chǎn)、敏感建筑、人臉等數(shù)據(jù)前務(wù)必確認(rèn)合規(guī)授權(quán)遵守?cái)?shù)據(jù)采集和模型發(fā)布的相關(guān)規(guī)定。不要拍攝和發(fā)布涉及他人隱私、商用受限或安全敏感的場(chǎng)景。公開(kāi)發(fā)布模型時(shí)建議檢查是否包含可識(shí)別的人臉、車牌等敏感信息必要時(shí)先做脫敏處理。8.6 性能優(yōu)化方向如果場(chǎng)景規(guī)模很大比如整個(gè)園區(qū)、體育場(chǎng)、大型展廳幾十萬(wàn)張圖片的規(guī)模會(huì)讓訓(xùn)練和渲染都面臨挑戰(zhàn)。常見(jiàn)優(yōu)化方向包括對(duì)空間做分塊訓(xùn)練再合并相鄰塊的高斯使用更稀疏的采樣策略減少冗余高斯使用多卡并行或分布式訓(xùn)練在渲染端做裁剪只渲染視野內(nèi)的點(diǎn)。這些方向都需要對(duì) 3DGS 的結(jié)構(gòu)有較深理解實(shí)際項(xiàng)目中可以按需研究。9. 總結(jié)與后續(xù)學(xué)習(xí)方向從接觸這個(gè)概念到完成一次場(chǎng)景重建實(shí)驗(yàn)?zāi)銜?huì)發(fā)現(xiàn)高斯飛濺真正打動(dòng)開(kāi)發(fā)者的點(diǎn)不是某一個(gè)“魔法參數(shù)”而是它重新定義了三維場(chǎng)景表達(dá)和渲染之間關(guān)系的思路。它用上百萬(wàn)個(gè)顯式三維高斯替代了隱式神經(jīng)網(wǎng)絡(luò)體素場(chǎng)用可微光柵化替代了射線采樣用顯著更低的算力成本換來(lái)了接近甚至超過(guò)傳統(tǒng)方案的效果。這套設(shè)計(jì)思路本身就值得深入學(xué)習(xí)。如果你接下來(lái)想繼續(xù)深入建議按下面順序推進(jìn)讀完 3D Gaussian Splatting 的原始論文理解每個(gè)公式在代碼中對(duì)應(yīng)哪一部分閱讀官方訓(xùn)練腳本的源碼重點(diǎn)看高斯參數(shù)在優(yōu)化器中如何更新嘗試用你自己的手機(jī)拍攝一個(gè)物體走完“采集 → 重建 → 渲染”全流程如果對(duì)實(shí)時(shí)應(yīng)用感興趣研究如何通過(guò)分塊和剪裁提高大場(chǎng)景渲染幀率關(guān)注后續(xù)的改進(jìn)工作例如動(dòng)態(tài)場(chǎng)景、結(jié)構(gòu)化表示、光照編輯等方向。在做實(shí)際項(xiàng)目時(shí)請(qǐng)記住一件事高斯飛濺不是萬(wàn)能的三維重建解決方案它在復(fù)雜反射、純色區(qū)域、超大尺度場(chǎng)景上仍然有明確的短板。判斷一個(gè)項(xiàng)目是否適合用高斯飛濺核心看三個(gè)條件是否有多視角照片、是否需要實(shí)時(shí)交互、是否接受點(diǎn)云式而非網(wǎng)格式的最終表達(dá)。三個(gè)條件都滿足這個(gè)技術(shù)大概率會(huì)給你帶來(lái)很好的體驗(yàn)如果只滿足其中一個(gè)建議再對(duì)比傳統(tǒng)重建和其他方法再做決定。建議把這篇文章收藏備用。當(dāng)你以后在訓(xùn)練中遇到編譯失敗、顯存不足或結(jié)果模糊時(shí)再回來(lái)看第 5 節(jié)和第 7 節(jié)的內(nèi)容很多問(wèn)題都能快速定位。