胡 昊 尹 令,2 張素敏,2 溫志坤 朱紀民 林潤恒
(1.華南農(nóng)業(yè)大學(xué)數(shù)學(xué)與信息學(xué)院 廣州 510642)
(2.國家生豬種業(yè)工程技術(shù)研究中心 廣州 510642)
點云分割作為三維點云處理任務(wù)中的關(guān)鍵技術(shù),在三維計算機視覺場景下得到了非常廣泛的應(yīng)用。在通過激光雷達獲取的城市場景點云中,將馬路、建筑、路燈、花壇、行道樹等場景中的元素進行區(qū)分,實現(xiàn)了對大規(guī)模場景中的各種物體進行精細化處理[1~2]。在醫(yī)療數(shù)據(jù)處理領(lǐng)域,使用基于深度學(xué)習(xí)的點云模型分割三維頸椎骨的各組成部分[3],在分割的基礎(chǔ)上再進行生物力學(xué)分析,提高了醫(yī)療輔助診斷的自動化水平。在建筑建模領(lǐng)域,采用多視圖CNN 能夠?qū)⒔ㄖ仡愋瓦M行自動化分類,并取得了良好的效果[4]。在無人機精準飛行領(lǐng)域,基于深度學(xué)習(xí)的點云網(wǎng)絡(luò)對激光雷達掃描到的物體進行了精準分割,且具有良好的實時性[5]。在智慧農(nóng)業(yè)領(lǐng)域,采用深度相機對植物點云進行采集,再將采集到的數(shù)據(jù)送入神經(jīng)網(wǎng)絡(luò)將植物的葉和莖進行分割,有助于選擇育種以及性狀分析[6]。一種基于二維圖像以及深度信息的點云二次分割方法被提出用于在復(fù)雜背景中提取出水果的輪廓[7]。
基于三維點云的牲畜尺參數(shù)自動測量是目前智能養(yǎng)殖業(yè)的研究熱點。但在現(xiàn)實場景中,通過深度設(shè)備獲取的牲畜點云存在數(shù)據(jù)散亂、密度大的特點,因此數(shù)據(jù)處理的效果不佳。采用深度學(xué)習(xí)的方法先對豬體點云各部分進行分割,在分割的基礎(chǔ)上再進行體尺測量點定位,將有助于提升測量的準確率。
基于深度學(xué)習(xí)的點云分割方法是計算機三維視覺的研究熱點之一,按照其基本思想可分為以下三類[26~28]。第一類是將三維點云數(shù)據(jù)轉(zhuǎn)化為二維圖像的處理方法[8~11],其主要通過在不同角度將原始點云投影到二維平面,從而得到多個二維圖像,再通過神經(jīng)網(wǎng)絡(luò)對多視圖進行聚合,最后輸出結(jié)果。第二類是基于體素網(wǎng)格的方法[12~14],該類方法將原始點云轉(zhuǎn)化為了體素小立方體,再通過3D 卷積神經(jīng)網(wǎng)絡(luò)進行分割。前兩種方法均需要消耗大量時間和資源進行數(shù)據(jù)預(yù)處理,而第三類方法是直接對原始點云進行處理。PointNet[15]首次采取了端到端的處理模式,主要解決了點云通過深度網(wǎng)絡(luò)進行編碼過程中,保證其原有的置換不變性,能夠直接將原始點云作為深度網(wǎng)絡(luò)的輸入進行分割。然而,PointNet 不具備在度量空間點中捕捉布局信息的能力,極大地限制了對細節(jié)的識別能力以及對大規(guī)模復(fù)雜場景的普適性。為改進PointNet 的不足,PointNet++網(wǎng)絡(luò)[16]增加了逐層抽象結(jié)構(gòu),通過計算度量空間中的距離,增加上下文比例來提取目標點云的局部空間特征,取得了更好的效果。馬利等[17]通過在PointNet 中引入跳躍連接,提取不同層次的特征,更好地捕捉了三維手部姿態(tài)。姚鉞等[18]在PointNet++的基礎(chǔ)上加入了自頂向下的網(wǎng)絡(luò)分支,將原網(wǎng)絡(luò)的中間特征融入最終預(yù)測網(wǎng)絡(luò),獲得了更好的分類效果。為了增強獲取局部特征的能力,吳軍等[19]將自注意力機制引入了PointNet++,提高了場景語義分割的精度。
活體牲畜獲取的點云數(shù)量龐大,且局部會存在空洞或者缺失,不同姿態(tài)使得牲畜點云各部分分割特征不明顯,因此為對豬體點云進行部分精確的分割,本文在PointNet++的基礎(chǔ)上采用了Octree 結(jié)構(gòu)改進了采樣層和分組層,使其能夠更好地在大規(guī)模點云數(shù)據(jù)中捕捉到豬體由于不用姿態(tài)所引起的非剛性變化,充分提取不同層次下的局部信息,獲得了更好的部分分割效果。
在試驗場地采集通道的上、左、右三個方向分別設(shè)置Kinect相機,當(dāng)目標豬體進入數(shù)據(jù)采集區(qū)域時,三個方向的相機會同時采集點云,再經(jīng)過配準,去除背景以及去噪等預(yù)處理后,即可獲得完整的豬體三維點云數(shù)據(jù)[20~21]。所獲得的豬體點云因個體不同,在進入采集區(qū)域的姿態(tài)不同,因此數(shù)據(jù)之間存在較大差異。
PointNet++采用了逐層抽象結(jié)構(gòu),如圖1 所示。相比于PointNet 結(jié)構(gòu),PointNet++具備了在不同尺度下提取空間信息的能力,代替了PointNet 直接提取整體點云特征的做法,能夠在不同尺度局部區(qū)域使用PointNet 對點云進行特征提取,再進行特征拼接。PointNet++分割網(wǎng)絡(luò)結(jié)構(gòu)包括分層點集特征學(xué)習(xí)和集合分割點特征傳播兩個部分。分層點集特征學(xué)習(xí)分為兩個集合抽象(Set Abstraction)模塊,每個集合抽象模塊又包含采樣層(Sampling Layer)、分組層(Grouping Layer)、PointNet層[22]。其中,采樣層使用最遠點采樣(Farthest Point Sampling,F(xiàn)PS)選取點云數(shù)據(jù)的部分特征點。分組層的作用是按照球查詢(Ball Query)方法選取采樣中心點的鄰域點,將選出的各個子點云送入PointNet層,運用局部區(qū)域的信息編碼成特征向量。
圖1 PointNet++網(wǎng)絡(luò)結(jié)構(gòu)
2.3.1 基于八叉樹的點云劃分與采樣
PointNet++通過最遠點采樣的方法提取局部特征點進行編碼,在ShapeNetCore[23]數(shù)據(jù)集上取得了很好的部分分割效果。然而,雖然與隨機采樣相比,在給定相同數(shù)量的采樣點情況下,最遠點采樣方法能更好地提取ShapeNetCore 數(shù)據(jù)集中的特征點,但是對于在真實場景下通過Kinect相機所采集到的豬體點云數(shù)據(jù),最遠點采樣無法精確捕捉不同姿態(tài)下豬體點云的非剛性形變,因為最遠點采樣更關(guān)注的是點與點之間的距離,而八叉樹下采樣法是基于空間結(jié)構(gòu)的均勻采樣,能夠很好地保留豬體點云空間結(jié)構(gòu)信息,其本身層次化的樹結(jié)構(gòu)不僅能劃分出體素相鄰點,且更適合后續(xù)PointNet 層進行逐層的局部特征提取。
采用八叉樹進行豬體點云分組及采樣算法步驟如下:
步驟1)采用最小立方體對豬體點云包圍。
步驟2)設(shè)置最大八叉樹深度即最多可細分的次數(shù)N,將初始點云包圍盒的立方體劃分為8個均勻大小的子立方體。
步驟3)判斷沒有子節(jié)點的立方體內(nèi)是否包含點云。若包含點云且沒有達到最大遞歸深度,繼續(xù)對該立方體進行細分,劃分到8 個子立方體。若沒有或達到最大遞歸深度則停止細分。
步驟4)若子立方體所分配到的單位元元素數(shù)量為0或為1,則該子立方體停止劃分。
步驟5)重復(fù)步驟3)和步驟4)進行遞歸劃分直到達到最大遞歸深度,使用不同層數(shù)八叉樹劃分豬體點云過程如圖2所示。
圖2 不同層數(shù)八叉樹結(jié)構(gòu)劃分豬體點云
步驟6)假設(shè)任意立方體內(nèi)包含n個點,那么此立方體內(nèi)第i個點的坐標則為(xi,yi,zi),計算中點pmid坐標(xmid,ymid,zmid)。
步驟7)計算體素內(nèi)所有點到中點pmid的距離并進行排序,將距離中點pmid最近點作為特征點pfeature進行采樣,選取第2 到k+1 個距離較小值點作為特征點pfeature的鄰近點:
式(1)中Sort為排序函數(shù),d為距離函數(shù)。如圖3 所示,紅色點為采樣特征點,與紅色點在同一立方體內(nèi)的黑色點為其鄰域點。
圖3 采用八叉樹進行豬體點云采樣及分組
2.3.2 改進PointNet++的分割網(wǎng)絡(luò)算法
采用八叉樹改進PointNet++采樣和分組方式的豬體點云部位分割網(wǎng)絡(luò)具體結(jié)構(gòu)如圖4 所示,算法步驟如下:
圖4 改進后的PointNet++具體網(wǎng)絡(luò)結(jié)構(gòu)
步驟1)輸入為經(jīng)過預(yù)處理后的單個完整豬體點云數(shù)據(jù)[ ]N×npoint×6 ,其中N為批處理輸入豬體點云數(shù)據(jù)的數(shù)量,npoint為單個豬體點云的點云點數(shù)。
步驟2) 將豬體點云進行八叉樹采樣及分組。其中,采用5 層八叉樹結(jié)構(gòu)進行采樣及分組,采樣中心點的個數(shù)為n1,中心點鄰域內(nèi)的點的最大數(shù)量(nsample)為64。
步驟3)對同一分組內(nèi)的局部點云進行卷積(Convolution,Conv),其中一維卷積公式如下:
式(2)中w1,w2…wk為濾波器,x1,x2…xk為信號序列,K為濾波器長度。為簡單起見,這里假設(shè)卷積的輸出yt的下標t從K開始。二維卷積的公式如下:
式(3)中X∈RM×N,濾波器W∈RU×V,一般U?M,V?N,這里假設(shè)卷積的輸出Yij的下標(i,j)從(U,V)開始。
步驟4)采用批量歸一化(Batch normalizaion,Bn)的方法提高網(wǎng)絡(luò)的學(xué)習(xí)效率。假設(shè)有N個樣本,對于每一維的特征x,先計算其均值和方差:
然后,將特征x(n)減去均值,再除以標準差,得到新的特征值x(n):
步驟5)采用Relu 函數(shù)對神經(jīng)網(wǎng)絡(luò)的線性層進行激活,再通過最大池化(Max Pooling)對卷積層提取到的局部特征的進行特征選擇,降低特征維度,得到局部特征向量[N×1024×256] 。具體地,對于一個局部區(qū)域Rdm,n,選擇該區(qū)域所有神經(jīng)元的最大值表示該區(qū)域:
式(7)中xi為局部區(qū)域內(nèi)每個神經(jīng)元的值。
步驟6)重復(fù)步驟2)~5),這里采用4層八叉樹結(jié)構(gòu)進行采樣及分組,采樣中心點的個數(shù)為n2,中心點鄰域內(nèi)的點的數(shù)量為128,得到特征向量[N×256×512] 。
步驟7)采用PointNet 對整體點云進行全局特征向量編碼。
步驟8)經(jīng)過分層點集特征學(xué)習(xí)后,對輸入的特征點進行二次抽樣,利用IDW(Inverse Distance Weighted)插值算法,將采樣點的特征傳遞回原始點集,得到[N×4096×256] 的數(shù)據(jù)。其中,IDW 插值的公式如下:
式(8)中,f為插值的特征值,d(x,xi)為x,xi的距離,p為d(x,xi)的指數(shù),k為鄰域點的個數(shù)(默認情況使用p=2,k=3),wi為x,xi距離平方的倒數(shù),j為點云的索引編號,C為任意常數(shù)。
步驟9)再對原始點集特征向量進行卷積,批量標準化和激活函數(shù)處理,并使用反向傳播(Back propagation,Bp)算法對卷積網(wǎng)絡(luò)中參數(shù)進行調(diào)整,當(dāng)l+1 為卷積層時,假設(shè)特征映射輸入為Z(l+1)∈RM'×N'×P,其中第p( )1 ≤p≤P個特征映射的輸入為
式(9)中W(l+1,p)和b(l+1,p)為第l+1 層的卷積核以及偏置,共有P×D個卷積核和P個偏置。第l層的第d個特征映射的誤差項為
式(10)中?~為寬卷積,rot 180()· 表示旋轉(zhuǎn)180°。
步驟10)使用Softmax回歸對豬體點云每個點進行分類預(yù)測,其中類別標簽y∈{ }1,2…,C,C=8分別對應(yīng)著豬體的八個部位(左前腿、右前腿、左后腿、右后腿、耳朵、頭部、尾巴、身體)。給定一個點x,采用Softmax回歸預(yù)測的屬于c的條件概率為
式(11)中wc是第c類的權(quán)重向量,則Softmax決策函數(shù)可以表示為
本文訓(xùn)練模型系統(tǒng)環(huán)境為Intel i5-11400 CPU,RTX2060 GPU,6GB 顯存,深度學(xué)習(xí)框架Pytorch1.4,Cuda10.0。設(shè)置模型初始學(xué)習(xí)率(Learning Rate)為0.001,衰減率(Learning Rate Decay)為0.5,每20輪迭代輪數(shù)衰減一次,模型訓(xùn)練每次輸入點云數(shù)量批尺寸(Batch Size)為4。圖5對比了采用八叉樹改進后的PointNet++網(wǎng)絡(luò)與PointNet++基礎(chǔ)網(wǎng)絡(luò)訓(xùn)練過程的mIoU 與OA 變化。由圖5 所示,改進后的PointNet++獲得了更好的學(xué)習(xí)能力,在經(jīng)過40 輪左右的訓(xùn)練后,幾乎已經(jīng)收斂,在100 輪的訓(xùn)練中最佳的mIoU 為88.27%,OA 為96.97%。而原PointNet++網(wǎng)絡(luò)在60 輪訓(xùn)練后才逐漸收斂,在100輪的訓(xùn)練中最佳mIoU 為85.12%,OA 為94.45%。實驗結(jié)果證明,改進后的PointNet++網(wǎng)絡(luò)在豬體點云數(shù)據(jù)集上具有更強的學(xué)習(xí)能力。
圖5 訓(xùn)練過程性能指標變化
采集的活體豬點云其姿態(tài)呈現(xiàn)多樣性,從不同視角觀察可以分為不同姿態(tài),俯視圖的豬體點云姿態(tài)可大致分為直線型、左扭頭型、右扭頭型,側(cè)視圖的豬體點云姿態(tài)可大致分為平視型、微低頭型、重低頭型,共9 種姿態(tài)。為了進一步驗證本文采用八叉樹結(jié)構(gòu)對PointNet++網(wǎng)絡(luò)改進的有效性,以9 種姿態(tài)的豬體點云為測試樣本,在PointNet++基礎(chǔ)上采用平面擬合的方法計算法向量(+Normal),在第一個逐層抽象模塊使用Octree 的采樣與分組方式(+Octree1),在第二個逐層抽象模塊使用Octree 的采樣與分組方式(+Octree2)進行不同模塊組合下的消融實驗,如表1 所示。表2 為在不同模塊組合下的分割結(jié)果。由表2 可知,相比于基礎(chǔ)模型PointNet++的分割結(jié)果,采用平面擬合的方法計算法向量信息(+Normal)后,除去Post8 外其他類別的mIoU 均有提升,法向量作為點云各點的屬性包含了重要的空間信息。在第一個逐層抽象模塊改用八叉樹結(jié)構(gòu)進行采樣與分組(+Octree1)之后,對所有類別的分割精確度均有提高,尤其對于Post6,Post9 等扭頭且低頭的不規(guī)則姿態(tài)豬體點云的分割效果提升更為明顯。第二個逐層抽象模塊改用八叉樹結(jié)構(gòu)進行采樣與分組(+Octree2)的方式,從各個姿態(tài)的分割結(jié)果上來看,相比于PointNet++基礎(chǔ)結(jié)構(gòu)雖有提高,但是提升效果不如前者(+Octree1),原因是第一次采樣在原始豬體點云上進行的,基于八叉樹的采樣方式比最遠點采樣能保留更多豬體點云的空間結(jié)構(gòu)信息,而第二次采樣是在第一次采樣的基礎(chǔ)上再進行采樣,是第一次采樣更細節(jié)化,因此第一次采樣更關(guān)鍵。兩個逐層抽象模塊均使用Octree 的采樣與分組方式并使用法向量(Octree-PointNet++)的模型,在除了Post4 的其他姿態(tài)的豬體點云分割結(jié)果上均取得了最佳,總體的平均mIoU 和OA 相較于原PointNet++模型分別提升了3.04%、4.54%。
表1 用于消融實驗的不同模塊說明
表2 不同姿態(tài)的豬體點云數(shù)據(jù)的消融實驗結(jié)果(單位:%)
注:粗體表示最優(yōu)結(jié)果,Post1為直線平視型、Post2為直線微低頭型、Post3為直線重低頭型、Post4為左扭頭平視型、Post5為左扭頭微低頭型、Post6為左扭頭重低頭型、Post7為右扭頭平視型、Post8為右扭頭微低頭型、Post9為右扭頭重低頭型。
圖6 所示為部分姿態(tài)豬體點云的可視化結(jié)果,圖中每列表示一類姿態(tài),每行表示對應(yīng)結(jié)果。從第1、2 列相對簡單的姿態(tài)來看,原始的PointNet++模型會把部分頭部的點云分成是耳朵,還會把部分身體的點云分成是尾巴。+Normal 分割效果雖有提升,但是對于頭部和耳朵的分割仍然不理想。+Octree1 和+Octree2 對于局部細節(jié)的捕捉能力明顯更強,基本可以將耳朵與頭部分割開來。第3、4 列為較復(fù)雜的扭頭且重低頭的姿態(tài),PointNet++網(wǎng)絡(luò)對于此類姿態(tài)的分割結(jié)果較為糟糕,由于豬在低頭時腿部離頭部很近,還會出現(xiàn)左右腳交叉的現(xiàn)象,因此會把部分頭部點云看成是腿部,左腿分為了右腿。+Normal 的分割結(jié)果雖有所改善,但仍然不理想,會把頭部分為了后腿。+Octree1 和+Octee2 分割的效果要明顯由于前二者,但是對于一些細節(jié)的分割仍然存在不足??梢钥闯鯫ctree-PointNet++無論是對于復(fù)雜姿態(tài)還是相對標準的姿態(tài),其分割效果都理想,除去分割邊界不如人工數(shù)據(jù)處理得平滑之外,基本與手工標記無異。
圖6 部分姿態(tài)豬體點云部分分割可視化效果對比
不同的點云分割算法在我們采集的數(shù)據(jù)集上的分割效果如表3 所示。PointNet++根據(jù)其點云采樣及分組方式的不同分為單一范圍分組(ssg,single-scale grouping),即通過深度網(wǎng)絡(luò)提取在相同半徑下的點云局部空間特征,以及多尺度范圍分組(msg,Multi-scale grouping),即在不同分組半徑下提取點云局部信息,再編碼成特征向量。從結(jié)果上看,msg版本的平均分割精確率要略優(yōu)于ssg。相比于PointNet 直接對原始點云整體提取特征的方法,PointNet++的層次化特征提取模式具備了更好的分割效果。3D Point in 2D Space[24]是將三維點云降維為二維數(shù)據(jù),再通過U-Net 網(wǎng)絡(luò)進行分割,DG-CNN[25]則是先對原始輸入點云構(gòu)建圖結(jié)構(gòu),增強了點之間的關(guān)聯(lián)性,再送入Edge-Conv 進行處理。然而,在實際的豬體點云分割實驗中,兩者的分割效果均不如PointNet++網(wǎng)絡(luò)算法。原因可能是其對不同姿態(tài)豬體點云變化不敏感,缺乏對非剛性形變目標物體的特征學(xué)習(xí)能力。
表3 各算法在我們數(shù)據(jù)集上的性能對比
針對現(xiàn)有的PointNet++網(wǎng)絡(luò)不能很好地提取不同姿態(tài)豬體點云數(shù)據(jù)的局部特征問題,采用八叉樹結(jié)構(gòu)改進了其采樣及分組方式,實驗結(jié)果表明,改進后的網(wǎng)絡(luò)更加適合于大規(guī)模點云數(shù)據(jù)中提取豬體不同姿態(tài)的非剛性變化特征,能夠更加精確地對不同姿態(tài)的豬體點云數(shù)據(jù)進行部位分割,尤其是對于復(fù)雜姿態(tài)的豬體點云數(shù)據(jù),分割精確度的提升更為明顯,且可視化效果與人工標記幾乎無異。