劉友群,敖建鋒
(江西理工大學(xué)土木與測(cè)繪工程學(xué)院,江西 贛州 341000)
深度學(xué)習(xí)是一種建立、模擬人腦進(jìn)行分析學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò),可以通過學(xué)習(xí)一種深層非線性網(wǎng)絡(luò)結(jié)構(gòu),實(shí)現(xiàn)復(fù)雜函數(shù)逼近,從少量樣本數(shù)據(jù)集中學(xué)習(xí)整個(gè)數(shù)據(jù)集本質(zhì)特征。點(diǎn)云語義分割是三維點(diǎn)云場(chǎng)景理解和分析的關(guān)鍵步驟,目前,基于深度學(xué)習(xí)的2D圖像分割技術(shù)已經(jīng)趨于成熟,但是2D數(shù)據(jù)往往受遮擋等因素影響,存在一定程度的數(shù)據(jù)缺失,使得分割的結(jié)果不盡如人意,針對(duì)這方面的局限性,人們逐漸將注意力轉(zhuǎn)移到了3D點(diǎn)云數(shù)據(jù)中。雖然點(diǎn)云數(shù)據(jù)的嘈雜、稀疏和無序加大了語義分割的難度,但是可以充分利用點(diǎn)云的三維屬性和幾何特征分布等特性,避免轉(zhuǎn)換成其他規(guī)則結(jié)構(gòu)時(shí)造成的信息丟失。
因此本文直接利用基于原始點(diǎn)云的PointNet++模型[1]進(jìn)行點(diǎn)云語義分割,避免了數(shù)據(jù)轉(zhuǎn)換時(shí)產(chǎn)生的信息丟失。并在原始模型的基礎(chǔ)上進(jìn)行改進(jìn),豐富了網(wǎng)絡(luò)輸入端的數(shù)據(jù)信息,提高了模型的分割精度,得到了較好的分割效果。
為了使點(diǎn)云適用于深度神經(jīng)網(wǎng)絡(luò),有些研究者將三維點(diǎn)云數(shù)據(jù)轉(zhuǎn)換成二維圖像、體素等規(guī)則的結(jié)構(gòu),這樣不但可以避免復(fù)雜的點(diǎn)云處理,還可以利用較成熟的基于規(guī)則結(jié)構(gòu)的網(wǎng)絡(luò)來實(shí)現(xiàn)點(diǎn)云的分割。深度學(xué)習(xí)對(duì)二維圖像和體素的分割已經(jīng)取得了很好的效果,并且已經(jīng)有很多成熟的算法,加之點(diǎn)云數(shù)據(jù)也有其獨(dú)特的優(yōu)勢(shì),所以近幾年來研究者逐漸把目光轉(zhuǎn)向了基于原始點(diǎn)云的網(wǎng)絡(luò)模型研究。根據(jù)以上幾種思路,基于深度學(xué)習(xí)的點(diǎn)云分割方法的研究現(xiàn)狀根據(jù)基本思想的不同分為以下三類。
該方法的中心思想是先將點(diǎn)云光柵化為2D圖像,或者通過球面、柱面投影的方式將點(diǎn)云的三維坐標(biāo)投影到二維平面上。
受二維圖像處理的啟發(fā),2015年Su等人提出了基于圖像的多視圖卷積神經(jīng)網(wǎng)絡(luò)(MVCNN)[2],此后點(diǎn)云投影轉(zhuǎn)換為多視圖的二維圖像的方法開始廣泛應(yīng)用。2017年,Lawin等人[3]提出了DeePr3ss算法,該方法的思想是先將點(diǎn)云投影到二維圖像上,再將投影到的圖像輸入到CNN中進(jìn)行分割,最后把圖像分割結(jié)果重新投影回點(diǎn)云上,以此來實(shí)現(xiàn)點(diǎn)云的分割。2018年,Qin等人提出了一種將ALS點(diǎn)云轉(zhuǎn)換為多視圖進(jìn)行地形分類的方法[4],其中,提出了一個(gè)TLFnet網(wǎng)絡(luò),該網(wǎng)絡(luò)首次利用多視圖CNN進(jìn)行大規(guī)模的ALS點(diǎn)云分割。2019年,Chen等人[5]提出了一種通過過濾原始語義標(biāo)簽的投票策略來處理投影中標(biāo)簽錯(cuò)誤的問題,這在降低標(biāo)簽錯(cuò)分概率上取得了很好的效果。2020年,Alonso等人[6]提出了3D-MiniNet網(wǎng)絡(luò),提出了快速近鄰搜索的方法和滑動(dòng)框搜索球形投影后的像素點(diǎn)。
該方法的中心思想是先將點(diǎn)云體素化,變成體素這類規(guī)則的結(jié)構(gòu),然后使用深度神經(jīng)網(wǎng)絡(luò)對(duì)體素化的點(diǎn)云進(jìn)行特征學(xué)習(xí)以實(shí)現(xiàn)點(diǎn)云的分割。
與深度圖像網(wǎng)絡(luò)一樣,最早的深度體素網(wǎng)絡(luò)也是2015年誕生的,VoxNet 網(wǎng)絡(luò)[7]由Maturana等人提出。同年,Wu等人用卷積DBN網(wǎng)絡(luò)構(gòu)建了一個(gè)3D ShapeNets,并首次建立了基于體素的數(shù)據(jù)集ShapeNet和ModelNet[8]。2016年,國內(nèi)學(xué)者Huang等人[9]提出了一種基于3D-CNN的點(diǎn)云標(biāo)記算法。隨后,在VoxNet 網(wǎng)絡(luò)和ShapeNet的影響下,2017年,Timo Hackel等人提出了FCNVoxNet算法[10],第一次將基于體素的方法用于室外場(chǎng)景分割,并建立了數(shù)據(jù)集Semantic3D。同年,Tchapmi等人提出了一種網(wǎng)絡(luò)架構(gòu)SEGCloud[11]。2018年,Wang等人提出了多尺度卷積網(wǎng)絡(luò)(MSNet)[12]。
近幾年,基于原始點(diǎn)云數(shù)據(jù)的點(diǎn)云分割方法成為了國內(nèi)外學(xué)者的研究熱點(diǎn),也成為了點(diǎn)云分割的主流發(fā)展方向。
2017年,Qi等人提出的直接對(duì)原始點(diǎn)云進(jìn)行特征學(xué)習(xí)的網(wǎng)絡(luò)架構(gòu)PointNet[13],隨后Qi等人在同一年又提出了PointNet++[1],PointNet++對(duì)PointNet做出了改進(jìn)。2018年,Jiang 等人參考了的尺度不變特征變換(SIFT)特征子,設(shè)計(jì)了一個(gè)PointSIFT模塊[14]。Li等人提出了PointCNN網(wǎng)絡(luò)[15]。Hua等人提出了Pointwise卷積[16]并用來構(gòu)建神經(jīng)網(wǎng)絡(luò)。Wang等人提出了一種將GCNN和PointNet結(jié)合用以點(diǎn)云分割的方法DGCNN(Dynamic Graph CNN)[17]。
為了更好地挖掘點(diǎn)云局部幾何信息,2019年,Komarichev等人提出了環(huán)形卷積神經(jīng)網(wǎng)絡(luò)(A-CNN)[18]。Zhang等人對(duì)DGCNN做出了改進(jìn)提出了LDGCNN[19],在DGCNN的基礎(chǔ)上增加了節(jié)點(diǎn)的跨層連接,并把轉(zhuǎn)換網(wǎng)絡(luò)用多層感知機(jī)(MLP)代替,顯著減小了網(wǎng)絡(luò)的復(fù)雜度。
PointNet++的主要結(jié)構(gòu)如圖1所示。其基本思想是:采用一種分層抽取特征的思想,可以遞歸地將PointNet循環(huán)使用以提取點(diǎn)云局部特征,并采用了多尺度分組(MSG)和多分辨率分組(MRG)來解決點(diǎn)云密度不同的問題。
圖1 PointNet++網(wǎng)絡(luò)結(jié)構(gòu)
PointNet++借鑒了卷積神經(jīng)網(wǎng)絡(luò)(CNN)這種多層感受野的思想,設(shè)計(jì)了一個(gè)set abstraction來對(duì)點(diǎn)云進(jìn)行分層提取特征,每一個(gè)特征提取層都分為采樣層、分組層和特征提取層三個(gè)部分組成,流程如圖2所示。
圖2 Set abstraction流程圖
采樣層:采樣算法使用迭代最遠(yuǎn)點(diǎn)采樣方法(FPS)來選擇一些點(diǎn)作為局部區(qū)域的中心點(diǎn),其中心思想是假設(shè)一共有n個(gè)點(diǎn),先從所有點(diǎn)云中隨機(jī)選擇一個(gè)點(diǎn)作為起始點(diǎn),然后選擇離這個(gè)點(diǎn)最遠(yuǎn)的點(diǎn)也加入起始點(diǎn)集,而后再從剩余的(n-2)個(gè)點(diǎn)中選擇出離起始點(diǎn)集最遠(yuǎn)的點(diǎn)并加入到起始點(diǎn)集中,繼續(xù)迭代,直到選出需要的個(gè)數(shù)為止。與隨機(jī)采樣法相比較,最遠(yuǎn)點(diǎn)采樣法的優(yōu)勢(shì)是可以最大限度地覆蓋所有點(diǎn)。
分組層:又稱聚類層,目的就是要將點(diǎn)云分組聚類劃分成多個(gè)局部區(qū)域。由PointNet++網(wǎng)絡(luò)結(jié)構(gòu)圖可看出,輸入點(diǎn)云的大小為N×(d+c),d為點(diǎn)的坐標(biāo)維度,c為點(diǎn)的特征維度,在經(jīng)過采樣層采樣后,選擇了N1×(d+c)的中心點(diǎn),再經(jīng)過分組層后得到的每一個(gè)局部區(qū)域的大小為N1×K×(d+c),K代表局部區(qū)域近鄰點(diǎn)的數(shù)量,不同組的K的大小不一樣。在PointNet++中采用了球查詢(Ball query)分組算法,其中心思想是把給定的中心點(diǎn)的固定半徑內(nèi)的近鄰點(diǎn)都選取出來,同時(shí)給定近鄰點(diǎn)的個(gè)數(shù)。與另一種聚類算法K近鄰(KNN)算法相比較,球查詢算法保證了固定的查詢區(qū)域尺度,從而使得局部區(qū)域特征在空間上更加一般化,這樣更適合對(duì)區(qū)域進(jìn)行劃分。
特征提取層:該層是對(duì)每一個(gè)局部區(qū)域通過小型PointNet網(wǎng)絡(luò)進(jìn)行卷積和池化得到的特征作為這個(gè)局部區(qū)域中心點(diǎn)的特征,輸入數(shù)據(jù)為點(diǎn)N1的局部區(qū)域,數(shù)據(jù)大小為N1×K×(d+c),輸出數(shù)據(jù)為由其質(zhì)心和編碼質(zhì)心鄰域的局部特征抽象而成的局部區(qū)域,大小為N1×(d+c1),c1是這個(gè)局部區(qū)域的總體特征。為了更方便PointNet網(wǎng)絡(luò)進(jìn)行特征提取,在這一層需先整個(gè)局部區(qū)域的點(diǎn)的坐標(biāo)進(jìn)行歸一化處理,也就是將所有點(diǎn)的坐標(biāo)轉(zhuǎn)換成相對(duì)于質(zhì)心的統(tǒng)一坐標(biāo)系下。公式如下:
(1)
由于采集設(shè)備和采集技術(shù)的局限,采集到的點(diǎn)集往往在不同區(qū)域會(huì)密度不均勻。為了使網(wǎng)絡(luò)自適應(yīng)密度不均勻下的特征提取,PointNet++提出了兩種自適應(yīng)密度的分組聚類方法,分別是多尺度分組方法(MSG)和多分辨率分組方法(MRG),示意圖如圖3所示。
圖3 密度自適應(yīng)層
多尺度分組(MSG):如圖3(a)所示,其基本思想是產(chǎn)生不同尺度即不同半徑的分組,用特征提取層來提取每個(gè)尺度的特征,最后將每個(gè)尺度提取出來的特征連結(jié)起來形成多尺度特征。
多分辨率分組(MRG):如圖3(b)所示,其中心思想是使每一層的特征都由兩個(gè)向量組成,左邊的向量使用幾何抽象層來匯總子區(qū)域的特征,右邊的向量則直接使用PointNet對(duì)原始點(diǎn)云進(jìn)行特征提取,根據(jù)點(diǎn)云密度對(duì)兩邊賦予不同的權(quán)重。
最后,對(duì)于分類網(wǎng)絡(luò),只需要通過逐層提取出來的局部特征,通過全連接層來總結(jié)出全局特征就可以得到分類的結(jié)果了。而分割網(wǎng)絡(luò)則復(fù)雜很多,需要將特征從子采樣點(diǎn)傳播到原始點(diǎn)來獲取原始點(diǎn)的特征,PointNet++使用了interpolate結(jié)構(gòu),采用了基于距離插值和和跨層跳躍鏈接分層的方法。插值方式采用了K近鄰(KNN)來反向加權(quán)求平均,定義如下:
(2)
而后再將插值特征值與點(diǎn)集抽象層的特征值通過跨層跳躍鏈接的方法來連接在一起,然后將連接好的特征值傳遞到PointNet單元中,最后用一些共享的全連接層和ReLU層更新每個(gè)點(diǎn)的特征向量。重復(fù)此過程,直到將特征傳播回原始點(diǎn)集為止。
實(shí)驗(yàn)平臺(tái)為Nvidia Geforce RTX 2070Ti、8GB顯存,在Ubuntu16.04和Python3.6.7下搭建CUDA 10.0、CUDNN 7.6.5、TensorFlow 1.13深度學(xué)習(xí)環(huán)境。實(shí)驗(yàn)采用S3DIS數(shù)據(jù)集,S3DIS數(shù)據(jù)集是斯坦福大型室內(nèi)場(chǎng)景數(shù)據(jù)集,包含3個(gè)不同建筑的6個(gè)大型室內(nèi)區(qū)域的270個(gè)房間,共標(biāo)記了13類語義元素。將KITTI數(shù)據(jù)集劃分為3712份訓(xùn)練集和3769份驗(yàn)證集。本文采用S3DIS數(shù)據(jù)集的Area1-5作為訓(xùn)練集,Area6作為測(cè)試集。
本次PointNet++模型的訓(xùn)練一共用了23 h。網(wǎng)絡(luò)訓(xùn)練時(shí)超參數(shù)設(shè)置:初始學(xué)習(xí)率為0.001、初始衰減率為0.5、衰減速度為300000、Batch_size為24、優(yōu)化方法為Adam、Momentum為0.9、迭代次數(shù)為169800、num_point為4096、max_epoch為201。一次性采樣4096個(gè)點(diǎn),每次迭代訓(xùn)練的點(diǎn)數(shù)為24×4096個(gè),每次迭代300000次學(xué)習(xí)率減半,并對(duì)所有訓(xùn)練樣本迭代201次。由圖4和圖5可以看出:網(wǎng)絡(luò)在訓(xùn)練時(shí)隨著迭代次數(shù)的不斷增加,loss函數(shù)值呈現(xiàn)下降趨勢(shì),最后穩(wěn)定在了0.04~0.05范圍內(nèi),精度也幾乎趨近1。
圖4 損失函數(shù)曲線
圖5 訓(xùn)練期間準(zhǔn)確性(a)和損失(b)的演變曲線
訓(xùn)練后模型的測(cè)試樣本如圖6所示,由此可見本文訓(xùn)練的模型可以對(duì)點(diǎn)云較好地進(jìn)行分割,輸出較平滑的預(yù)測(cè)邊緣。訓(xùn)練后模型的總體準(zhǔn)確度達(dá)到了88.88 %,每個(gè)類別的IoU、準(zhǔn)確率、召回率和F1-Score的值如表1所示。由表1的定量分析結(jié)果可看出,本文訓(xùn)練的模型對(duì)天花板、地板這類邊界明顯的結(jié)構(gòu)元素可以達(dá)到很好的分割效果。
表1 各類別分割結(jié)果
圖6 使用PointNet++分割的部分結(jié)果展示
為了驗(yàn)證本文訓(xùn)練的模型的高效性,本文將訓(xùn)練的模型與其他幾種方法做了比較。比較結(jié)果見表2和圖7。MLP是依賴人工提取點(diǎn)云特征的方法,SegCloud是基于體素的方法,SPG是基于原始點(diǎn)云的方法。從表2可以看出,改進(jìn)后的PointNet++模型只有桌子、椅子和書架的IoU比SPG低,其余5種類別IoU均高于其他模型。由圖7可看出,改進(jìn)后的模型的mIoU和oAcc都優(yōu)于其他幾種方法,與原始的PointNet++模型相比,總體準(zhǔn)確度提高了6.65 %,可見輸入更豐富的點(diǎn)云信息有助于訓(xùn)練出更高精度的語義分割模型。
表2 不同模型的各類別IoU對(duì)比
圖7 不同模型分割結(jié)果的mIoU和oAcc對(duì)比
對(duì)于桌子、椅子和書架這類家具元素,本文的分割效果不如SPG網(wǎng)絡(luò)。SPG網(wǎng)絡(luò)不是逐點(diǎn)進(jìn)行分割,而是將多個(gè)點(diǎn)組成的點(diǎn)集看作一個(gè)整體,對(duì)每個(gè)點(diǎn)集進(jìn)行語義分割,這種方法可以較好地描述相鄰物體之間的關(guān)系,這對(duì)基于上下文分分類至關(guān)重要。圖8展示了桌子的錯(cuò)分結(jié)果,其中,桌面部分點(diǎn)云被識(shí)別為沙發(fā),正是由于PointNet++不能很好地處理這種上下文關(guān)系導(dǎo)致的。
圖8 桌子的錯(cuò)分結(jié)果示例
針對(duì)目前對(duì)三維點(diǎn)云進(jìn)行語義分割使用的點(diǎn)云信息少和分割精度不高的問題,本文利用PointNet++實(shí)現(xiàn)三維點(diǎn)云的語義分割,并對(duì)PointNet++網(wǎng)絡(luò)輸入端的點(diǎn)云信息做了改進(jìn),除了使用點(diǎn)云的三維坐標(biāo)信息之外,還增加了點(diǎn)云RGB信息和所屬房間的歸一化坐標(biāo)信息。與原始的PointNet++模型相比,總體準(zhǔn)確度提高了6.65 %,進(jìn)一步提高了模型的分割精度。然而由于PointNet++不能很好地描述相鄰物體間的上下文關(guān)系,導(dǎo)致對(duì)房間內(nèi)部的家具元素分割的效果不太理想。所以還需要進(jìn)一步研究何更好的獲取相鄰物體間的上下文關(guān)系,以提高模型語義分割的精度。