論文:https://arxiv.org/pdf/2312.16084
代碼:https://github.com/minghanqin/LangSplat
文章目錄
- 一、3D language field
- 二、回顧 Language Fields的挑戰
- 三、使用SAM學習層次結構語義
- 四、Language Fields 的 3DGS
- 五、開放詞匯查詢(Open-vocabulary Querying)
- 六、實驗
- 代碼實現
一、3D language field
??早期構建三維特征場的嘗試包括蒸餾特征場[20]和神經特征融合場[43]。他們通過跨多個視圖將LSeg [21]或DINO [4]特征提煉為一個NeRF,學習了3D一致特征。Shen等人[39]通過將clip征提取成NeRF,進一步提取特征場進行few-shot 語言引導的自動操作。[Panoptic lifting for 3d scene understanding with neural fields. CVPR 2023][In-place scene labelling and understanding with implicit scene representation. ICCV 2021]將語義信息嵌入到NeRF中,例如,Semantic NeRF [54]在NeRF中聯合編碼外觀和幾何語義,用于新的語義視圖合成。LERF [18] 是第一個將CLIP特性嵌入到NeRF中的公司,它利用強大的CLIP表示方式實現了開放詞匯表的3D查詢。DINO特性也被用于監督LERF,以提高其性能。Liu等人[Weakly supervised 3d open-vocabulary segmentation.NeurIPS 2023]還利用CLIP和DINO特征訓練NeRF模型用于3D開放詞匯分割。
??
二、回顧 Language Fields的挑戰
??輸入圖像 I ∈ R 3 × H × W I∈R^{3×H×W} I∈R3×H×W;取一組校準圖像{ I t ∣ t = 1 , 2 , . . . , T I_t|t=1,2,...,T It?∣t=1,2,...,T}作為輸入,用其訓練一個3D Language Fields Φ Φ Φ。大多數現有的方法使用CLIP編碼器 V V V 提取圖像特征,監督3D語言字段 Φ Φ Φ,利用CLIP對齊的文本圖像潛在空間,促進開放詞匯表查詢。然而, CLIP嵌入是由圖像對齊的,而不是由像素對齊的 。即 V ( I t ) ∈ R D V(I_t)∈R^D V(It?)∈RD是一個圖像級的特征,而我們需要一個像素對齊的語言嵌入 L t ∈ R D × H × W L_t∈R^{D×H×W} Lt?∈RD×H×W。同時,像素對齊的語言特征具有點模糊性 ,對象上的單個點有助于影響區域的多個語義層次(例如,貓耳朵上的一個點,同時指向貓的耳朵、貓頭和整個貓,應該被三種類型的文本查詢激活)
??為了解決問題,現有方法[18,24]從裁剪后的圖像patch中提取出CLIP特征的層次結構,即對坐標為 v = ( w , h ) v=(w,h) v=(w,h)的像素,在不同物理尺度下,以v為中心patch中獲得相應的CLIP特征,patch可以完全包含對象。多尺度patch方法有兩個局限性。首先,patch特征是不精確的,因為它們經常包含額外的上下文對象信息,導致過度平滑的語言域,對象邊界模糊。為了緩解不穩定的問題,大多數方法[18,24]利用額外的像素對齊的DINO特性來監督網絡。但是,學習到的三維語言特征仍然不精確,如圖1所示。其次,推理需要在多個尺度上同時渲染,才能找到最優尺度。隨著尺度的數量可能高達30 [18],大大降低了推理速度。
??除了渲染目標,三維建模方法的選擇也很重要。大多數現有的方法[2,43]都使用NeRF來進行3D表示,它們在每個3D點上學習一個語言特征,然后將該語言特征渲染到圖像上,類似于彩色渲染。然而,基于NeRF的方法受到其耗時的渲染過程的限制;同時,在實際應用中,特別是在智能機器人等領域,對高效開放詞匯查詢的需求也很高。
三、使用SAM學習層次結構語義
??SAM 可以準確地將一個像素與周圍屬于同一對象的像素進行分組,從而將圖像分割成多個邊界清晰的對象掩模。利用SAM,我們可以捕獲三維場景中對象的語義層次,為每個輸入圖像提供準確和多尺度的分割map。
??具體來說,使用32×32的規則網格進行point 提示,獲得三個不同語義級別 mask: M 0 s 、 M 0 p 、 M 0 w M_0^s、M_0^p、M_0^w M0s?、M0p?、M0w?,分別代表子部分、部分和整個物體。然后根據IoU評分、stability評分和mask之間的重疊率,去除集合的冗余mask。過濾后的mask 集合為: M s 、 M p 、 M w M^s、M^p、M^w Ms、Mp、Mw,將場景劃分為語義上有意義的區域,用于提取區域CLIP特征。在數學上,所獲得的像素對齊的語言嵌入為( M l ( v ) M^l (v) Ml(v)表示在語義級別 l l l上,像素 v v v屬于的mask):
??從3D語言場景中渲染的每個像素,現在都擁有一個與精確的語義上下文相一致的CLIP特性。這種對齊減少了模糊性,并提高了基于語言的查詢的準確性。我們可以學習一個準確的三維語言場,即使沒有常用的DINO正則化。我們基于SAMs的方法的另一個優點是預定義的 語義尺度。由于我們對“整體”、“部分”和“子部分”級別有不同的分割映射,因此我們可以在這些預定義的尺度上直接查詢三維語言字段。這就消除了跨多個絕對尺度進行密集搜索的需要,從而使查詢過程更加高效。
四、Language Fields 的 3DGS
??在獲得了一組二維圖像{ L t l ∣ t = 1 , . . . , T L^l_t|t=1,...,T Ltl?∣t=1,...,T}上的語言嵌入后,我們可以通過建模三維點和二維像素之間的關系來學習三維語言場景。3DGS明確地將三維場景表示為各向異性三維高斯分布的集合,每個高斯 G ( x ) G (x) G(x) 由均值 μ ∈ R 3 μ∈R^3 μ∈R3和協方差矩陣Σ參數化:
其中 c i c_i ci?是第 i i i個高斯值的顏色,N表示tile中的高斯值, C ( v ) C(v) C(v)是像素v處的渲染顏色, α i = o i G i 2 D ( ? ) α_i = o_iG_i^{2D}(·) αi?=oi?Gi2D?(?)。 o i o_i oi?是第 i i i個高斯的不透明度, G i 2 D ( ? ) G_i^{2D}(·) Gi2D?(?)表示投影到二維上的第i個高斯的函數。
??本文提出了3D language GS,它用三個language embedding { f s , f p , f w f^s,f^p,f^w fs,fp,fw}來增強每個3DGS。這些嵌入來自于CLIP特征。增強的高斯函數被稱為三維語言高斯,采用基于tile的光柵化器來保持渲染效率:
F l ( v ) F^l(v) Fl(v)表示語義級別 l l l在像素 v v v處渲染的語言嵌入。通過將語言信息直接合并到3DGS中,3DLanguage Fields 能夠響應基于語言的查詢。
?? 由于CLIP嵌入是高維特征,直接在CLIP潛在空間上學習 f l f^l fl顯著增加了內存和時間成本。與學習沒有球諧系數的RGB顏色相比,學習512維CLIP特征使存儲3D高斯數據的內存需求增加了35倍以上,很容易導致L1 cache內存耗盡。為了降低內存成本和提高效率,我們 引入了一種場景級別的 language autoencoder,將場景中的CLIP嵌入映射到一個較低維的潛在空間,從而減少了內存需求。CLIP模型使用4億對(圖像、文本)對進行訓練,它的d維潛在空間可能非常緊湊,因為它需要在這個空間中對齊任意的文本和圖像。然而,Language Fields Φ Φ Φ 是特定于場景的,可以利用場景先驗來壓縮CLIP特征。事實上,對于每個輸入圖像,我們將得到數百個被SAM mask,明顯小于CLIP訓練中使用的圖像數量。因此,一個場景中所有的mask都稀疏地分布在CLIP潛在空間中,允許我們使用一個場景特定的 Autoencoder進一步壓縮這些CLIP特征
??編碼器 E E E將 D D D維CLIP特征 L t l ( v ) ∈ R D L^l_t(v)∈R^D Ltl?(v)∈RD映射到 H t l ( v ) = E ( L t l ( v ) ) ∈ R D H_t^l(v) = E(L^l_t (v))∈R^D Htl?(v)=E(Ltl?(v))∈RD,其中d?D。解碼器 Ψ Ψ Ψ從壓縮表示重構原始CLIP嵌入。Autoencoder 在CLIP嵌入上重建目標為 ( d a e d_{ae} dae?表示距離函數,具體采用 l 1 l_1 l1?和余弦距離損失):
?? 讓Language Gaussian 在特定場景的latent space 中學習 language embedding,而不是CLIP潛在空間,有 f l ∈ R d f^l∈R^d fl∈Rd。實驗取d = 3(模型效率和準確性的均衡)。與直接建模D維CLIP嵌入相比,我們的方法通過合并場景先驗顯著降低了內存成本。語言嵌入的優化目標:
??推理遵循等式(4),將language embedding 從3D渲染到2D,并使用場景特定解碼器 Ψ Ψ Ψ恢復CLIP圖像嵌入 Ψ ( F t l ) ∈ R D × H × W Ψ(F_t^l)∈R^{D×H×W} Ψ(Ftl?)∈RD×H×W,這允許使用CLIP文本編碼器進行開放詞匯表查詢。
??
五、開放詞匯查詢(Open-vocabulary Querying)
??由于CLIP模型提供的圖像和文本之間的對齊空間,學到的3D language field 支持開放詞匯表3D查詢,包括開放詞匯表3D對象定位和開放詞匯表3D語義分割。許多現有的開放詞匯表三維語義分割方法[24]通常從一個類別列表中選擇類別,其中包括圖像中出現的類別。然而,獲得一個全面的野外場景類別列表是具有挑戰性的。與它們不同的是,我們的方法在給定任意文本查詢時生成精確的對象mask。
??按照LERF計算language embeddinig ? i m g ?_{img} ?img? 與每個文本查詢 ? q r y ?_{qry} ?qry?的相關性得分(其中, ? c a n o n i ?^i_{canon} ?canoni?是從“object”, “things”, “stuff”,
和“texture”中選擇的預定義規范短語的CLIP嵌入):
每個文本查詢可以得到三個相關性映射,表示在特定的語義級別上的結果。遵循在LERF 的策略,選擇產生最高相關性得分的語義level。對于三維對象定位任務,我們直接選擇相關性得分最高的點。對于三維語義分割任務,我們過濾出相關性分數低于所選閾值的點,并預測剩余區域的對象mask。
六、實驗
??數據集。LERF數據集[18]是使用iPhone的app多攝像頭捕獲的,由復雜的野外場景組成,為三維對象定位任務設計的, 這里我們通過注釋文本查詢的地面真相掩碼來擴展LERF數據集,允許在LERF數據集上評估開放詞匯表的三維語義分割。由于用于三維對象定位的原始LERF注釋相對簡單,因此在某些場景下的性能已經接近飽和。因此,我們進一步手動注釋了其他具有挑戰性的定位樣本,以更好地評估方法的性能。我們報告了在LERF [18]后的三維對象定位任務的定位精度,并報告了三維語義分割任務的IoU結果。 我們還使用了3DOVS數據集[24],包含了不同pose和背景下捕獲的長尾對象的集合。這個數據集是為開放詞匯表三維語義分割開發的,其中提供了完整的類別列表。 其他方法使用完整的列表來生成預測的掩碼,而我們只使用查詢類別來生成相應的掩碼。mIoU度量用于這個數據集
??實驗細節。圖像語言特征提取,使用OpenCLIP ViT-B/16模型;SAM使用ViT-H模型來分割二維mask;每個場景先使用3DGS來訓練一個RGB,訓練3萬次迭代,每個場景都包含大約250萬個點;然后固定三維高斯的所有其他參數,如均值和不透明度來訓練我們的三維language gaussian。在這個階段,只有語言特征是可學習的。語言特性訓練3萬次迭代,Autoencoder由一個MLP實現512維的CLIP特征壓縮;1440×1080分辨率的場景,模型在NVIDIA RTX-3090 GPU上進行了25分鐘訓練,大約需要4GB的內存。
??LERF數據集上算法對比。表1:算法達到84.3%的總體準確率,優于LERF;表2顯示了三維語義分割的IoU結果,比LERF好14.0%
??可視化分析。圖1按照[20]PCA成分分析,可視化了學習到的三維language field。可以看到,LERF學習到的特征不能生成物體之間的清晰的邊界,而我們的方法僅使用CLIP特征給出精確的物體形狀。圖3和圖4中展示了對象定位和語義分割的可視化結果。我們觀察到,LERF產生的激活區域更分散,而我們的激活區域更集中,與LERF產生的激活區域相比,我們的激活區域可以更好地符合真實形狀
??
??
??消融實驗:
代碼實現
- 安裝環境
# 1.克隆項目到本地
git clone https://github.com/minghanqin/LangSplat.git --recursive# 2.安裝依賴包
conda env create --file environment.yml
conda activate langsplat# 3.安裝 sam
pip install git+https://github.com/facebookresearch/segment-anything.git
# 4.克隆并安裝 segment-anything-langsplat
git clone https://github.com/minghanqin/segment-anything-langsplat.git
cd segment-anything-langsplat
pip install .
- 準備數據(數據應為以下格式)
<dataset_name>
|---images
| |---<image 0>
| |---<image 1>
| |---...
|---input
| |---<image 0>
| |---<image 1>
| |---...
|---output
| |---<dataset_name>
| | |---point_cloud/iteration_30000/point_cloud.ply
| | |---cameras.json
| | |---cfg_args
| | |---chkpnt30000.pth
| | |---input.ply
|---sparse|---0|---cameras.bin|---images.bin|---points3D.bin
- 開始訓練(分為5步執行,可直接執行process.sh)
# 1: 生成場景的 Language Feature。圖片需要放在 <dataset_name>中的"input" 文件夾
python preprocess.py --dataset_path data/lego(這是我自己的路徑) # 2.訓練 Autoencoder,得到低維的 3-dims Language Feature
cd autoencoder
python train.py --dataset_path /home/xzz/LangSplat/data/lego(這是我自己的路徑) --dataset_name lego --encoder_dims 256 128 64 32 3 --decoder_dims 16 32 64 128 256 256 512 --lr 0.0007python test.py --dataset_name $dataset_path --output
# 3.最終訓練語言場for level in 1 2 3
dopython train.py -s $dataset_path -m output/${casename} --start_checkpoint $dataset_path/$casename/chkpnt30000.pth --feature_level ${level}# e.g. python train.py -s data/sofa -m output/sofa --start_checkpoint data/sofa/sofa/chkpnt30000.pth --feature_level 3
done# 4.對不同level分割結果的渲染
for level in 1 2 3
do# render rgbpython render.py -m output/${casename}_${level}# render language featurespython render.py -m output/${casename}_${level} --include_feature# e.g. python render.py -m output/sofa_3 --include_feature
done