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