三維點雲語義分割模型介紹
三維點雲語義分割模型介紹
- 1 三維深度學習簡介
- 2 PointNet
- 2.1 點雲的屬性
- 2.2 key modules
- 2.2.1 Symmetry Function for Unordered Input
- 2.2.2 Local and Global Information Aggregation
- 2.2.3 Joint Alignment Network
- 2.3 網路結構
- 3 PointNet++
- 3.1簡介
- 3.2 key modules
- 3.2.1 Hierarchical Point Set Feature Learning
- 3.2.2 Robust Feature Learning under Non-Uniform Sampling Density
- 3.2.3 Point Feature Propagation for Set Segmentation
- 3.3 網路結構
- 4 PointSIFT
- 5 Exploring Spatial Context for 3D Semantic Segmentation of Point Clouds
- 6 模型除錯
- 相關連結
- 參考部落格
1 三維深度學習簡介
前段時間除錯了上海交大盧策吾教授團隊提出的PointSIFT模型,也在此過程中閱讀了一些三維點雲語義分割的深度學習模型,下面對每個模型進行介紹(在文末會有模型對應的論文),並且展示一下我自己除錯的PointSIFT模型的執行結果。
1.1 三維資料表達方式
目前用於深度學習的三維資料有如下幾種表達方式:
1) 多視角(multi-view):通過多視角二維圖片組合為三維物體,此方法將傳統CNN應用於多張二維視角的圖片,特徵被view pooling procedure聚合起來形成三維物體;
2) 體素(volumetric):通過將物體表現為空間中的體素進行類似於二維的三維卷積(例如,卷積核大小為5 x 5 x 5),是規律化的並且易於類比二維的,但同時因為多了一個維度出來,時間和空間複雜度都非常高,目前已經不是主流的方法了;
3) 點雲(point clouds):直接將三維點雲拋入網路進行訓練,資料量小。主要任務有分類、分割以及大場景下語義分割;
4) 非歐式(manifold graph):在流形或圖的結構上進行卷積,三維點雲可以表現為mesh結構,可以通過點對之間臨接關係表現為圖的結構。
2 PointNet
2.1 點雲的屬性
三維空間中的點雲存在下面三個主要的屬性,文章根據點雲的這三個屬性提出了對應的三個模型從而解決了直接利用點雲進行深度學習存在的問題。
2.1.1 無序性
點雲本質上是一長串點(nx3矩陣,其中n是點數)。在幾何上,點的順序不影響它在空間中對整體形狀的表示,相同的點雲可以由兩個完全不同的矩陣表示,如圖2.2.1所示。
而實際情況下,不論點雲的輸入順序如何,都希望模型能夠提取出相同的特徵。
2.1.2 關聯性
點雲中的每個點不是孤立的,點與點之間存在著關聯,相鄰的許多點可能組成一個具有重要意義的子集,它包含了點雲的區域性特徵。因此希望模型能夠捕捉到點與點之間的關聯、點雲的區域性結構從而提取出點雲的區域性特徵。
2.1.3 不變性
相同的點雲在空間中經過一定的剛性變化(旋轉或平移),點的座標會發生變化,但是模型進行分類或者語義分割的結果不會發生變化。
2.2 key modules
2.2.1 Symmetry Function for Unordered Input
如2.1所述,為了使模型對相同點雲的不同順序的輸出不變,文章中提出了3種方法:1)將不同輸入按一定規則排列成統一的順序;2)將輸入的點雲當成是一個序列用來訓練迴圈神經網路(RNN),通過改變順序來增加訓練資料,從而使得RNN的輸出結果對順序不變;3)通過一個形式簡單的對稱函式聚合每個點的資訊。第3種方法為作者提出,經驗證,第3種方法效果最好,精度可達87.1%。第三種方法如圖2.2.1所示。
第3種方法首先先利用多層神經網路提取每個點的特徵(n x c),最後通過對稱函式g對C維特徵種每一維都選取n個點中對應的最大特徵值或特徵值總和,這樣就可以通過g來解決無序性問題。PointNet採用了max-pooling策略。
2.2.2 Local and Global Information Aggregation
2.2.1中的模型最終輸出了一個向量V(維度為1 x C1),它代表輸入點雲的全域性特徵,對於分類任務來說,可以採用一個全連線層得出分類結果,但是對於分割任務來說需要結合點雲的區域性資訊和全域性資訊。
所以在分割任務中,在得到點雲的全域性特徵後,將全域性特徵和每一個點的特徵進行連線,得到一個矩陣(維度為n x(C1+C2)),此時每個點的特徵中都包含各自的區域性資訊和全域性資訊。
2.2.3 Joint Alignment Network
PointNet通過T-Net這一小型神經網路,通過學習一個C x C的仿射變換矩陣,並在特徵提取之前,將這個矩陣和輸入進行矩陣運算,將輸入變換到一個統一的特徵空間中,使得模型的輸出結果不會因為點雲發生剛性變換後而改變。
2.3 網路結構
PointNet的網路結構如圖2.3.1所示。
圖中藍色部分是處理分類任務時的網路,網路直接採用原始點雲資料作為輸入(n x 3),輸出是點雲在k個類別上的得分。粉色部分是處理分割任務時的額外網路,輸出是每個點在各個類別上的得分(n x m)。
其中,mlp是通過共享權重的卷積實現的,第一層卷積核大小是1 x 3(因為每個點的維度是xyz),之後的每一層卷積核大小都是1 x 1。經過兩個空間變換網路和兩個mlp之後,對每一個點提取1024維特徵,經過max pool變成1x1024的全域性特徵。再經過一個mlp(程式碼中運用全連線)得到k個score,分類網路最後接的loss是softmax。
T-net與一般的網路類似,由特徵提取層、池化層和全連線層組成。T-net在PointNet中應用了2次,第一次是直接對輸入的點雲資料進行變換,第二次是對提取出的64維特徵進行變換。並且PointNet在損失函式中引入了正則化項,使得在第二次應用T-net後習得的特徵變換矩陣近似為一正交矩陣,降低了網路優化的複雜程度。
3 PointNet++
3.1簡介
PointNet只是簡單的將所有點連線起來,只考慮了全域性特徵,但丟失了每個點的區域性資訊。因此在提出PointNet之後不久,作者提出了了PointNet++。
PointNet++基本思想就是:首先選取一些比較重要的點作為每一個區域性區域的中心點,然後在這些中心點的周圍選取k個近鄰點(歐式距離)。再將k個近鄰點作為一個區域性點雲採用PointNet網路來提取特徵。它本質上是PointNet的分層版本,每個圖層都有三個子階段:取樣,分組和特徵提取。然後不斷重複這個過程。此外,作者還測試了不同層級的一些不同聚合方法,以克服取樣密度的差異。
3.2 key modules
3.2.1 Hierarchical Point Set Feature Learning
PointNet使用了一個單獨的max pooling作為對稱函式用於抽取點集的全域性特徵。而PointNet++使用了分層抽取特徵的思想,把每一次叫做set abstraction(SA),SA分為三部分:取樣層(Sampling layer)、分組層(Grouping layer)和特徵提取層(PointNet)。
首先來看取樣層,從稠密的點雲中抽取出一些相對較為重要的中心點,採用最遠點取樣法(farthest point sampling,FPS),相較於隨機取樣FPS演算法可以更好地覆蓋整個點集。取樣層的輸入是n1 x 3,輸出是n2 x 3。
然後是分組層,在上一層提取出的中心點的某個範圍內尋找最近個k近鄰點組成group,尋找鄰近點的方法有球查詢演算法和K-NN演算法。分組層的輸入是中心點n2 x 3和上一層點的特徵n1 x(3+C),輸出是n2 x n_sample x (3+C)。
特徵提取層是將這k個點通過小型PointNet網路進行卷積和pooling得到的特徵作為此中心點的特徵,再送入下一個分層繼續。這樣每一層得到的中心點都是上一層中心點的子集,並且隨著層數加深,中心點的個數越來越少,但是每一箇中心點包含的資訊越來越多。特徵提取層的輸入是n2 x n_sample x (3+C),輸出是n x C2。
因此在實際訓練中,整個SA level的輸入為上一層的中心點(B x n1 x 3)和上一層的提取的特徵(B x n1 x C1),輸出是經過這一層的處理後得到的中心點(B x n2 x 3)和中心點對應區域性區域的特徵(B x n2 x C2)。
3.2.2 Robust Feature Learning under Non-Uniform Sampling Density
在實際情況中,點雲資料很有可能在不同的區域具有不同的密度,這種點集的不均勻性會使模型在密集區域學習到的特徵有可能無法推廣到稀疏的區域,而針對稀疏區域訓練的模型可能無法識別密集區域的區域性結構。
在高密度的情況下,希望模型儘可能接近地檢查點集,以捕獲密集取樣區域中最精細的細節。但是在低密度區域,樣本缺陷會破壞區域性模式,此時我們應該在更大的附近尋找更大規模的模式。所以通過固定範圍選取的固定個數的近鄰點是不合適的,PointNet++提出了兩個解決方案,見圖3.2.1。
a)多尺度分組(Multi-scale grouping,MRG)。MRG在每一個分組層都通過多個尺度來確定每一箇中心點的鄰域範圍,並經過Point提取特徵之後將多個特徵聯合起來,得到一個多尺度的新特徵。在低尺度下,MRG方法的計算量很大。
b)多解析度分組(Multi-resolution grouping,MSG)。如圖3.2.1(b)所示,新特徵通過兩部分連線起來。左邊特徵向量是通過一個SA後得到的,右邊特徵向量是直接對當前group中所有點進行PointNet卷積得到。當點雲密度不均時,可以通過判斷當前group的密度對左右兩個特徵向量給予不同權重:當group中密度很小,左邊向量得到的資訊就沒有對所有group中點提取的特徵可信度更高,於是將右特徵向量的權重提高。以此達到減少計算量的同時解決密度問題。
3.2.3 Point Feature Propagation for Set Segmentation
SA過程在點集上進行了降取樣,而分割任務則需要獲取每一個點的特徵,PointNet++通過feature propagation層(FP)將點的特徵從降取樣點傳遞迴原始點集,在FP中通過利用上一層的點集的特徵內插出更原始的點集的特徵,並且通過skip link將在SA過程中相應的點特徵與內插的特徵連線起來,構成一個新的特徵向量,然後對這個新的特徵向量進行數次卷積。最後不斷重複FP,直到將特徵傳遞迴原始點集。
3.3 網路結構
PointNet++的網路結構如圖3.3.1所示。
圖中右下部分是處理分類任務時的網路,網路直接採用原始點雲資料作為輸入(n x 3),輸出是點雲在k個類別上的得分。右上部分是處理分割任務時的額外網路,輸出是每個點在各個類別上的得分(n x m)。
4 PointSIFT
4.1 key module
4.1.1 Orientation-encoding Convolution
為了使模型更好地捕獲形狀模式,需要編碼在不同方向上的形狀資訊。PointSIFT類比SIFT演算法提出了方向編碼卷積這一方法:對於一個給定點p,以它為中心的8個卦限代表了8個不同的方向。在每個卦限中,PointSIFT都在搜尋半徑r內搜尋最近的點,以這個最近的點的特徵f代表這個卦限。為了捕捉8個方向的特徵,PointSIFT進行了3次方向編碼卷積,在卷積後每個點的特徵都以一個d維的向量來表徵。方向編碼卷積的示意圖如圖4.1.1所示。
4.2 網路結構
PointSIFT的網路結構如圖4.2.1所示。
PointSIFT網路的輸入是原始點雲資料(n x 3),對於語義分割任務,輸出是每一個在各個類別上的得分(n x m)。
如圖4.2.1所示,PointSIFT網路分為兩大部分,分別是編碼(下采樣)和解碼(上取樣)。PointSIFT首先先通過一個MLP提取點雲資料的特徵(實際模型中這部分MLP和PointSIFT結合起來了),對每個點都得到一個64維的特徵向量(n x 64),然後利用PointNet++的SA module進行了3次下采樣,點的數量變化:8192->1024->256->64。對於解碼部分,PointSIFT同樣利用PointNet++中的FP module進行了3次上取樣,點的數量變化:64->256->1024->8192。並且在上取樣和下采樣的過程中,PointSIFT module是插入在上下兩個解碼(編碼)層之間的。模型的最後接了全連線層,得到每個點的類別得分。
在實驗中,通過將PointSIFT module插到兩個SA之間可以捕捉到所有的點,從而有效的避免在下采樣過程中點的資訊損失。
5 Exploring Spatial Context for 3D Semantic Segmentation of Point Clouds
5.1 簡介
PointNet是3D點雲語義分割方面邁出了一大步,它直接處理非結構化的點雲並且取得了較好的語義分割結果。但是,PointNet將輸入的點細分為一個個塊(個人理解為訓練模型時的一個個Batch)並且獨立的處理這些Block。在本文中,作者在PointNet的基礎上提出了兩種擴充套件模型,增大了模型在3D場景中的感受野,從而使模型可以處理更大尺度的空間場景。
5.2 key modules
5.2.1 Input-Level Context
Input-level context是直接對輸入的點雲進行處理,通過同時考慮一系列Block而不是像PointNet中考慮一個個單獨的Block,一組中的Block之間共享上下文資訊。Block有兩種選取方式,一種是在位置相同,但是尺度不同(Multi-Scale Blocks);另一種是從相鄰的格網中選取(Grid Blocks)。
1) Multi-Scale Blocks。通過隨機選取一個D維的點作為中心,然後在中心點特定半徑內選取N個點,將它們組合成一個Block。通過改變不同的半徑從而得到Multi-Scale Blocks,Multi-Scale Blocks如圖5.2.1所示。
2) Grid Blocks。Grid blocks是一組2 x 2的格網領域。每個Block位置不同但是尺度相同,如圖5.2.2所示。
5.2.2 Consolidation Units(CU)
CU和RCU均是處理Output-level context,它們將合併得到的塊特徵。先是CU的處理方式:CU先通過MLP將之前階段得到的特徵集對映到更高維的空間,然後應用max-pooling生成公共塊特徵,然後將該特徵與MLP得到的O個高維特徵進行連線。
5.2.3 Recurrent Consolidation Units(RCU)
RCU將來自空間鄰近塊的塊特徵序列作為輸入,並返回更新後的塊特徵序列。RCU是通過GRU實現的。GRU具有學習遠端依賴性的能力,範圍可以是時間上的也可以是空間上的,GRU在看到塊特徵的全部輸入序列後才會返回更新的塊特徵,GRU在其內部儲存器中保留有關場景的資訊,並根據新的觀察結果進行更新,通過這種機制來整合和共享所有輸入的資訊。
5.3 網路結構
5.3.1 MS-CU
MS-CU網路結構如圖5.3.1所示。
網路的輸入是三個多尺度的Blocks,每一個Block都含有N個D維的點(不一定是3維的,除了座標資訊外還有可能包括標準化後的座標以及點的RGB資訊等)。通過一個類似PointNet的機制學習每一個Scale下的block的特徵(MLP->max-pooling)。然後將塊特徵(1 x 384)和輸入特徵進行連線,將連線後的特徵作為一系列CU的輸入,網路最後接一個MLP輸出每一個點在所有類別上的得分(N x M)。
最開始,每個點只能得到它們各自的特徵,連線了塊特徵後,每個點還得到了其相鄰點的特徵,通過一系列CU後,這種共享特徵得到了反覆的加強。
5.3.2 GB-RCU
GB-RCU網路結構如圖5.3.1所示。
GB-RCU網路的輸入是4個來自相鄰格網的blocks,每個blocks中都包含由N個D維的點。它通過一個共享權重的MLP和max-pooling學習4個塊的特徵(4 x 1 x 64,區別於MS-CU),所有的塊特徵通過一個RCU共享各自的空間上下文,然後RCU返回更新後的塊特徵。更新後的塊特徵(1 x 64)和原始塊特徵(1 x 64)一起附加到輸入特徵(N x 64)。最後接一個MLP用於計算每一個點在各個類別上的得分(N x M)。
6 模型除錯
6.1 模型訓練
6.1.1模型輸入
調式的模型為PointSIFT,初次除錯模型輸入的是利用RGB-D相片反演出的點雲資料(ScanNet資料集),屬於不同類的點具有不同類別的標籤,如圖6.1.1所示。
6.1.2 模型輸出
對於語義分割任務,模型的輸出是每個點所屬的類別,如圖6.1.2所示。
目前訓練模型在測試集上的精度為83%(論文中為86%)。
6.2 模型呼叫
6.2.1 資料處理
利用三維鐳射掃描器對室內進行掃描,得到室內點雲資料,點雲資料量約為30000000,直接用於模型預測過於稠密,因此對點雲進行抽稀,並對一些噪聲點進行處理,最後得到點296242個。對資料進行剖分,分為3個場景,前兩個場景各100000個點,最後一個場景96242個點。室內圖見6.2.1。
6.2.2 語義分割結果
呼叫模型對點雲資料進行預測,預測的一些結果如圖6.2.2所示,其中紅色代表地板;綠色代表牆體;藍色代表椅子;黃色代表桌子;白色代表剩餘的傢俱;黑色代表未定義。
前三張圖是利用OpenCV進行視覺化的,最後一張室內全景圖是利用專業的三維鐳射點雲軟體進行顯示。
相關連結
PointNet
論文 https://arxiv.org/abs/1612.00593
Github https://github.com/charlesq34/pointnet
PointNet++
論文 https://arxiv.org/abs/1706.02413
Github https://github.com/charlesq34/pointnet2
PointSIFT
論文 https://arxiv.org/abs/1807.00652
Github https://github.com/MVIG-SJTU/pointSIFT
參考部落格
https://blog.csdn.net/Felaim/article/details/81088936
https://blog.csdn.net/qq_15332903/article/details/80224387
相關文章
- OLAP多維語義模型(一)模型
- 鐳射雷達點雲語義分割學習筆記之RangeNet++筆記
- 31-語義分割
- 大型語言模型(Large Language Models)的介紹模型
- 谷歌開源最新語義影像分割模型DeepLab-v3+谷歌模型
- 谷歌開源最新語義影象分割模型DeepLab-v3+谷歌模型
- 案例分享:自動駕駛3D點雲語義分割資料標註自動駕駛3D
- 【譯】停止濫用div! HTML語義化介紹HTML
- 【譯】停止濫用div!HTML語義化介紹HTML
- NLPIR系統的中文語義分析模式介紹模式
- 8.3 BERT模型介紹模型
- 常用語義分割資料集
- 硬核解讀KubeEdge基於大模型邊雲協同的機器人語義分割演算法大模型機器人演算法
- [譯]LINQ TO SQL 介紹(定義資料模型類) – Part.2SQL模型
- Python語言的特點有哪些?九大特點介紹!Python
- 語義分割的標準度量MIoU
- Pixellib語義分割-影像背景替換
- 主流程式語言的介紹及特點
- Go語言介紹Go
- shell 語法介紹
- JavaScript 語法介紹JavaScript
- 三維掃描系列001 點雲緒論
- Redis元件介紹(三)Redis元件
- Linux中的IO模型介紹Linux模型
- JSP 自定義標籤介紹JS
- Bootstrap Blazor 元件介紹 Table (二)自定義模板列功能介紹bootBlazor元件
- DNS常用術語介紹DNS
- 8 語言模型簡介模型
- Burp Suite使用介紹(三)UI
- 簡單介紹Lua中三種迴圈語句的使用
- Zookeeper 節點特性介紹
- 華為雲 · 雲桌面 Workspace(介紹)
- osg三維場景中拾取滑鼠在模型表面的點選點模型
- Jumpserver基礎運維-01介紹Server運維
- Freedgo工具-思維導圖介紹Go
- RBAC_許可權模型介紹模型
- ChatGPT-4o模型功能介紹ChatGPT模型
- 網路 IO 模型簡單介紹模型