劉友群,敖建鋒
(江西理工大學土木與測繪工程學院,江西 贛州 341000)
深度學習是一種建立、模擬人腦進行分析學習的神經網絡,可以通過學習一種深層非線性網絡結構,實現復雜函數逼近,從少量樣本數據集中學習整個數據集本質特征。點云語義分割是三維點云場景理解和分析的關鍵步驟,目前,基于深度學習的2D圖像分割技術已經趨于成熟,但是2D數據往往受遮擋等因素影響,存在一定程度的數據缺失,使得分割的結果不盡如人意,針對這方面的局限性,人們逐漸將注意力轉移到了3D點云數據中。雖然點云數據的嘈雜、稀疏和無序加大了語義分割的難度,但是可以充分利用點云的三維屬性和幾何特征分布等特性,避免轉換成其他規則結構時造成的信息丟失。
因此本文直接利用基于原始點云的PointNet++模型[1]進行點云語義分割,避免了數據轉換時產生的信息丟失。并在原始模型的基礎上進行改進,豐富了網絡輸入端的數據信息,提高了模型的分割精度,得到了較好的分割效果。
為了使點云適用于深度神經網絡,有些研究者將三維點云數據轉換成二維圖像、體素等規則的結構,這樣不但可以避免復雜的點云處理,還可以利用較成熟的基于規則結構的網絡來實現點云的分割。深度學習對二維圖像和體素的分割已經取得了很好的效果,并且已經有很多成熟的算法,加之點云數據也有其獨特的優勢,所以近幾年來研究者逐漸把目光轉向了基于原始點云的網絡模型研究。根據以上幾種思路,基于深度學習的點云分割方法的研究現狀根據基本思想的不同分為以下三類。
該方法的中心思想是先將點云光柵化為2D圖像,或者通過球面、柱面投影的方式將點云的三維坐標投影到二維平面上。
受二維圖像處理的啟發,2015年Su等人提出了基于圖像的多視圖卷積神經網絡(MVCNN)[2],此后點云投影轉換為多視圖的二維圖像的方法開始廣泛應用。2017年,Lawin等人[3]提出了DeePr3ss算法,該方法的思想是先將點云投影到二維圖像上,再將投影到的圖像輸入到CNN中進行分割,最后把圖像分割結果重新投影回點云上,以此來實現點云的分割。2018年,Qin等人提出了一種將ALS點云轉換為多視圖進行地形分類的方法[4],其中,提出了一個TLFnet網絡,該網絡首次利用多視圖CNN進行大規模的ALS點云分割。2019年,Chen等人[5]提出了一種通過過濾原始語義標簽的投票策略來處理投影中標簽錯誤的問題,這在降低標簽錯分概率上取得了很好的效果。2020年,Alonso等人[6]提出了3D-MiniNet網絡,提出了快速近鄰搜索的方法和滑動框搜索球形投影后的像素點。
該方法的中心思想是先將點云體素化,變成體素這類規則的結構,然后使用深度神經網絡對體素化的點云進行特征學習以實現點云的分割。
與深度圖像網絡一樣,最早的深度體素網絡也是2015年誕生的,VoxNet 網絡[7]由Maturana等人提出。同年,Wu等人用卷積DBN網絡構建了一個3D ShapeNets,并首次建立了基于體素的數據集ShapeNet和ModelNet[8]。2016年,國內學者Huang等人[9]提出了一種基于3D-CNN的點云標記算法。隨后,在VoxNet 網絡和ShapeNet的影響下,2017年,Timo Hackel等人提出了FCNVoxNet算法[10],第一次將基于體素的方法用于室外場景分割,并建立了數據集Semantic3D。同年,Tchapmi等人提出了一種網絡架構SEGCloud[11]。2018年,Wang等人提出了多尺度卷積網絡(MSNet)[12]。
近幾年,基于原始點云數據的點云分割方法成為了國內外學者的研究熱點,也成為了點云分割的主流發展方向。
2017年,Qi等人提出的直接對原始點云進行特征學習的網絡架構PointNet[13],隨后Qi等人在同一年又提出了PointNet++[1],PointNet++對PointNet做出了改進。2018年,Jiang 等人參考了的尺度不變特征變換(SIFT)特征子,設計了一個PointSIFT模塊[14]。Li等人提出了PointCNN網絡[15]。Hua等人提出了Pointwise卷積[16]并用來構建神經網絡。Wang等人提出了一種將GCNN和PointNet結合用以點云分割的方法DGCNN(Dynamic Graph CNN)[17]。
為了更好地挖掘點云局部幾何信息,2019年,Komarichev等人提出了環形卷積神經網絡(A-CNN)[18]。Zhang等人對DGCNN做出了改進提出了LDGCNN[19],在DGCNN的基礎上增加了節點的跨層連接,并把轉換網絡用多層感知機(MLP)代替,顯著減小了網絡的復雜度。
PointNet++的主要結構如圖1所示。其基本思想是:采用一種分層抽取特征的思想,可以遞歸地將PointNet循環使用以提取點云局部特征,并采用了多尺度分組(MSG)和多分辨率分組(MRG)來解決點云密度不同的問題。

圖1 PointNet++網絡結構
PointNet++借鑒了卷積神經網絡(CNN)這種多層感受野的思想,設計了一個set abstraction來對點云進行分層提取特征,每一個特征提取層都分為采樣層、分組層和特征提取層三個部分組成,流程如圖2所示。

圖2 Set abstraction流程圖
采樣層:采樣算法使用迭代最遠點采樣方法(FPS)來選擇一些點作為局部區域的中心點,其中心思想是假設一共有n個點,先從所有點云中隨機選擇一個點作為起始點,然后選擇離這個點最遠的點也加入起始點集,而后再從剩余的(n-2)個點中選擇出離起始點集最遠的點并加入到起始點集中,繼續迭代,直到選出需要的個數為止。與隨機采樣法相比較,最遠點采樣法的優勢是可以最大限度地覆蓋所有點。
分組層:又稱聚類層,目的就是要將點云分組聚類劃分成多個局部區域。由PointNet++網絡結構圖可看出,輸入點云的大小為N×(d+c),d為點的坐標維度,c為點的特征維度,在經過采樣層采樣后,選擇了N1×(d+c)的中心點,再經過分組層后得到的每一個局部區域的大小為N1×K×(d+c),K代表局部區域近鄰點的數量,不同組的K的大小不一樣。在PointNet++中采用了球查詢(Ball query)分組算法,其中心思想是把給定的中心點的固定半徑內的近鄰點都選取出來,同時給定近鄰點的個數。與另一種聚類算法K近鄰(KNN)算法相比較,球查詢算法保證了固定的查詢區域尺度,從而使得局部區域特征在空間上更加一般化,這樣更適合對區域進行劃分。
特征提取層:該層是對每一個局部區域通過小型PointNet網絡進行卷積和池化得到的特征作為這個局部區域中心點的特征,輸入數據為點N1的局部區域,數據大小為N1×K×(d+c),輸出數據為由其質心和編碼質心鄰域的局部特征抽象而成的局部區域,大小為N1×(d+c1),c1是這個局部區域的總體特征。為了更方便PointNet網絡進行特征提取,在這一層需先整個局部區域的點的坐標進行歸一化處理,也就是將所有點的坐標轉換成相對于質心的統一坐標系下。公式如下:
(1)

由于采集設備和采集技術的局限,采集到的點集往往在不同區域會密度不均勻。為了使網絡自適應密度不均勻下的特征提取,PointNet++提出了兩種自適應密度的分組聚類方法,分別是多尺度分組方法(MSG)和多分辨率分組方法(MRG),示意圖如圖3所示。

圖3 密度自適應層
多尺度分組(MSG):如圖3(a)所示,其基本思想是產生不同尺度即不同半徑的分組,用特征提取層來提取每個尺度的特征,最后將每個尺度提取出來的特征連結起來形成多尺度特征。
多分辨率分組(MRG):如圖3(b)所示,其中心思想是使每一層的特征都由兩個向量組成,左邊的向量使用幾何抽象層來匯總子區域的特征,右邊的向量則直接使用PointNet對原始點云進行特征提取,根據點云密度對兩邊賦予不同的權重。
最后,對于分類網絡,只需要通過逐層提取出來的局部特征,通過全連接層來總結出全局特征就可以得到分類的結果了。而分割網絡則復雜很多,需要將特征從子采樣點傳播到原始點來獲取原始點的特征,PointNet++使用了interpolate結構,采用了基于距離插值和和跨層跳躍鏈接分層的方法。插值方式采用了K近鄰(KNN)來反向加權求平均,定義如下:
(2)

而后再將插值特征值與點集抽象層的特征值通過跨層跳躍鏈接的方法來連接在一起,然后將連接好的特征值傳遞到PointNet單元中,最后用一些共享的全連接層和ReLU層更新每個點的特征向量。重復此過程,直到將特征傳播回原始點集為止。
實驗平臺為Nvidia Geforce RTX 2070Ti、8GB顯存,在Ubuntu16.04和Python3.6.7下搭建CUDA 10.0、CUDNN 7.6.5、TensorFlow 1.13深度學習環境。實驗采用S3DIS數據集,S3DIS數據集是斯坦福大型室內場景數據集,包含3個不同建筑的6個大型室內區域的270個房間,共標記了13類語義元素。將KITTI數據集劃分為3712份訓練集和3769份驗證集。本文采用S3DIS數據集的Area1-5作為訓練集,Area6作為測試集。
本次PointNet++模型的訓練一共用了23 h。網絡訓練時超參數設置:初始學習率為0.001、初始衰減率為0.5、衰減速度為300000、Batch_size為24、優化方法為Adam、Momentum為0.9、迭代次數為169800、num_point為4096、max_epoch為201。一次性采樣4096個點,每次迭代訓練的點數為24×4096個,每次迭代300000次學習率減半,并對所有訓練樣本迭代201次。由圖4和圖5可以看出:網絡在訓練時隨著迭代次數的不斷增加,loss函數值呈現下降趨勢,最后穩定在了0.04~0.05范圍內,精度也幾乎趨近1。

圖4 損失函數曲線

圖5 訓練期間準確性(a)和損失(b)的演變曲線
訓練后模型的測試樣本如圖6所示,由此可見本文訓練的模型可以對點云較好地進行分割,輸出較平滑的預測邊緣。訓練后模型的總體準確度達到了88.88 %,每個類別的IoU、準確率、召回率和F1-Score的值如表1所示。由表1的定量分析結果可看出,本文訓練的模型對天花板、地板這類邊界明顯的結構元素可以達到很好的分割效果。

表1 各類別分割結果

圖6 使用PointNet++分割的部分結果展示
為了驗證本文訓練的模型的高效性,本文將訓練的模型與其他幾種方法做了比較。比較結果見表2和圖7。MLP是依賴人工提取點云特征的方法,SegCloud是基于體素的方法,SPG是基于原始點云的方法。從表2可以看出,改進后的PointNet++模型只有桌子、椅子和書架的IoU比SPG低,其余5種類別IoU均高于其他模型。由圖7可看出,改進后的模型的mIoU和oAcc都優于其他幾種方法,與原始的PointNet++模型相比,總體準確度提高了6.65 %,可見輸入更豐富的點云信息有助于訓練出更高精度的語義分割模型。

表2 不同模型的各類別IoU對比

圖7 不同模型分割結果的mIoU和oAcc對比
對于桌子、椅子和書架這類家具元素,本文的分割效果不如SPG網絡。SPG網絡不是逐點進行分割,而是將多個點組成的點集看作一個整體,對每個點集進行語義分割,這種方法可以較好地描述相鄰物體之間的關系,這對基于上下文分分類至關重要。圖8展示了桌子的錯分結果,其中,桌面部分點云被識別為沙發,正是由于PointNet++不能很好地處理這種上下文關系導致的。

圖8 桌子的錯分結果示例
針對目前對三維點云進行語義分割使用的點云信息少和分割精度不高的問題,本文利用PointNet++實現三維點云的語義分割,并對PointNet++網絡輸入端的點云信息做了改進,除了使用點云的三維坐標信息之外,還增加了點云RGB信息和所屬房間的歸一化坐標信息。與原始的PointNet++模型相比,總體準確度提高了6.65 %,進一步提高了模型的分割精度。然而由于PointNet++不能很好地描述相鄰物體間的上下文關系,導致對房間內部的家具元素分割的效果不太理想。所以還需要進一步研究何更好的獲取相鄰物體間的上下文關系,以提高模型語義分割的精度。