?

基于改進PointNet++的大規模豬體點云部位分割*

2023-08-31 08:39張素敏溫志坤朱紀民林潤恒
計算機與數字工程 2023年5期
關鍵詞:八叉樹豬體立方體

胡 昊 尹 令,2 張素敏,2 溫志坤 朱紀民 林潤恒

(1.華南農業大學數學與信息學院 廣州 510642)

(2.國家生豬種業工程技術研究中心 廣州 510642)

1 引言

點云分割作為三維點云處理任務中的關鍵技術,在三維計算機視覺場景下得到了非常廣泛的應用。在通過激光雷達獲取的城市場景點云中,將馬路、建筑、路燈、花壇、行道樹等場景中的元素進行區分,實現了對大規模場景中的各種物體進行精細化處理[1~2]。在醫療數據處理領域,使用基于深度學習的點云模型分割三維頸椎骨的各組成部分[3],在分割的基礎上再進行生物力學分析,提高了醫療輔助診斷的自動化水平。在建筑建模領域,采用多視圖CNN 能夠將建筑元素類型進行自動化分類,并取得了良好的效果[4]。在無人機精準飛行領域,基于深度學習的點云網絡對激光雷達掃描到的物體進行了精準分割,且具有良好的實時性[5]。在智慧農業領域,采用深度相機對植物點云進行采集,再將采集到的數據送入神經網絡將植物的葉和莖進行分割,有助于選擇育種以及性狀分析[6]。一種基于二維圖像以及深度信息的點云二次分割方法被提出用于在復雜背景中提取出水果的輪廓[7]。

基于三維點云的牲畜尺參數自動測量是目前智能養殖業的研究熱點。但在現實場景中,通過深度設備獲取的牲畜點云存在數據散亂、密度大的特點,因此數據處理的效果不佳。采用深度學習的方法先對豬體點云各部分進行分割,在分割的基礎上再進行體尺測量點定位,將有助于提升測量的準確率。

基于深度學習的點云分割方法是計算機三維視覺的研究熱點之一,按照其基本思想可分為以下三類[26~28]。第一類是將三維點云數據轉化為二維圖像的處理方法[8~11],其主要通過在不同角度將原始點云投影到二維平面,從而得到多個二維圖像,再通過神經網絡對多視圖進行聚合,最后輸出結果。第二類是基于體素網格的方法[12~14],該類方法將原始點云轉化為了體素小立方體,再通過3D 卷積神經網絡進行分割。前兩種方法均需要消耗大量時間和資源進行數據預處理,而第三類方法是直接對原始點云進行處理。PointNet[15]首次采取了端到端的處理模式,主要解決了點云通過深度網絡進行編碼過程中,保證其原有的置換不變性,能夠直接將原始點云作為深度網絡的輸入進行分割。然而,PointNet 不具備在度量空間點中捕捉布局信息的能力,極大地限制了對細節的識別能力以及對大規模復雜場景的普適性。為改進PointNet 的不足,PointNet++網絡[16]增加了逐層抽象結構,通過計算度量空間中的距離,增加上下文比例來提取目標點云的局部空間特征,取得了更好的效果。馬利等[17]通過在PointNet 中引入跳躍連接,提取不同層次的特征,更好地捕捉了三維手部姿態。姚鉞等[18]在PointNet++的基礎上加入了自頂向下的網絡分支,將原網絡的中間特征融入最終預測網絡,獲得了更好的分類效果。為了增強獲取局部特征的能力,吳軍等[19]將自注意力機制引入了PointNet++,提高了場景語義分割的精度。

活體牲畜獲取的點云數量龐大,且局部會存在空洞或者缺失,不同姿態使得牲畜點云各部分分割特征不明顯,因此為對豬體點云進行部分精確的分割,本文在PointNet++的基礎上采用了Octree 結構改進了采樣層和分組層,使其能夠更好地在大規模點云數據中捕捉到豬體由于不用姿態所引起的非剛性變化,充分提取不同層次下的局部信息,獲得了更好的部分分割效果。

2 方法

2.1 豬體點云獲取與預處理

在試驗場地采集通道的上、左、右三個方向分別設置Kinect相機,當目標豬體進入數據采集區域時,三個方向的相機會同時采集點云,再經過配準,去除背景以及去噪等預處理后,即可獲得完整的豬體三維點云數據[20~21]。所獲得的豬體點云因個體不同,在進入采集區域的姿態不同,因此數據之間存在較大差異。

2.2 PointNet++基本原理

PointNet++采用了逐層抽象結構,如圖1 所示。相比于PointNet 結構,PointNet++具備了在不同尺度下提取空間信息的能力,代替了PointNet 直接提取整體點云特征的做法,能夠在不同尺度局部區域使用PointNet 對點云進行特征提取,再進行特征拼接。PointNet++分割網絡結構包括分層點集特征學習和集合分割點特征傳播兩個部分。分層點集特征學習分為兩個集合抽象(Set Abstraction)模塊,每個集合抽象模塊又包含采樣層(Sampling Layer)、分組層(Grouping Layer)、PointNet層[22]。其中,采樣層使用最遠點采樣(Farthest Point Sampling,FPS)選取點云數據的部分特征點。分組層的作用是按照球查詢(Ball Query)方法選取采樣中心點的鄰域點,將選出的各個子點云送入PointNet層,運用局部區域的信息編碼成特征向量。

圖1 PointNet++網絡結構

2.3 基于改進PointNet++豬體點云分割網絡

2.3.1 基于八叉樹的點云劃分與采樣

PointNet++通過最遠點采樣的方法提取局部特征點進行編碼,在ShapeNetCore[23]數據集上取得了很好的部分分割效果。然而,雖然與隨機采樣相比,在給定相同數量的采樣點情況下,最遠點采樣方法能更好地提取ShapeNetCore 數據集中的特征點,但是對于在真實場景下通過Kinect相機所采集到的豬體點云數據,最遠點采樣無法精確捕捉不同姿態下豬體點云的非剛性形變,因為最遠點采樣更關注的是點與點之間的距離,而八叉樹下采樣法是基于空間結構的均勻采樣,能夠很好地保留豬體點云空間結構信息,其本身層次化的樹結構不僅能劃分出體素相鄰點,且更適合后續PointNet 層進行逐層的局部特征提取。

采用八叉樹進行豬體點云分組及采樣算法步驟如下:

步驟1)采用最小立方體對豬體點云包圍。

步驟2)設置最大八叉樹深度即最多可細分的次數N,將初始點云包圍盒的立方體劃分為8個均勻大小的子立方體。

步驟3)判斷沒有子節點的立方體內是否包含點云。若包含點云且沒有達到最大遞歸深度,繼續對該立方體進行細分,劃分到8 個子立方體。若沒有或達到最大遞歸深度則停止細分。

步驟4)若子立方體所分配到的單位元元素數量為0或為1,則該子立方體停止劃分。

步驟5)重復步驟3)和步驟4)進行遞歸劃分直到達到最大遞歸深度,使用不同層數八叉樹劃分豬體點云過程如圖2所示。

圖2 不同層數八叉樹結構劃分豬體點云

步驟6)假設任意立方體內包含n個點,那么此立方體內第i個點的坐標則為(xi,yi,zi),計算中點pmid坐標(xmid,ymid,zmid)。

步驟7)計算體素內所有點到中點pmid的距離并進行排序,將距離中點pmid最近點作為特征點pfeature進行采樣,選取第2 到k+1 個距離較小值點作為特征點pfeature的鄰近點:

式(1)中Sort為排序函數,d為距離函數。如圖3 所示,紅色點為采樣特征點,與紅色點在同一立方體內的黑色點為其鄰域點。

圖3 采用八叉樹進行豬體點云采樣及分組

2.3.2 改進PointNet++的分割網絡算法

采用八叉樹改進PointNet++采樣和分組方式的豬體點云部位分割網絡具體結構如圖4 所示,算法步驟如下:

圖4 改進后的PointNet++具體網絡結構

步驟1)輸入為經過預處理后的單個完整豬體點云數據[ ]N×npoint×6 ,其中N為批處理輸入豬體點云數據的數量,npoint為單個豬體點云的點云點數。

步驟2) 將豬體點云進行八叉樹采樣及分組。其中,采用5 層八叉樹結構進行采樣及分組,采樣中心點的個數為n1,中心點鄰域內的點的最大數量(nsample)為64。

步驟3)對同一分組內的局部點云進行卷積(Convolution,Conv),其中一維卷積公式如下:

式(2)中w1,w2…wk為濾波器,x1,x2…xk為信號序列,K為濾波器長度。為簡單起見,這里假設卷積的輸出yt的下標t從K開始。二維卷積的公式如下:

式(3)中X∈RM×N,濾波器W∈RU×V,一般U?M,V?N,這里假設卷積的輸出Yij的下標(i,j)從(U,V)開始。

步驟4)采用批量歸一化(Batch normalizaion,Bn)的方法提高網絡的學習效率。假設有N個樣本,對于每一維的特征x,先計算其均值和方差:

然后,將特征x(n)減去均值,再除以標準差,得到新的特征值x(n):

步驟5)采用Relu 函數對神經網絡的線性層進行激活,再通過最大池化(Max Pooling)對卷積層提取到的局部特征的進行特征選擇,降低特征維度,得到局部特征向量[N×1024×256] 。具體地,對于一個局部區域Rdm,n,選擇該區域所有神經元的最大值表示該區域:

式(7)中xi為局部區域內每個神經元的值。

步驟6)重復步驟2)~5),這里采用4層八叉樹結構進行采樣及分組,采樣中心點的個數為n2,中心點鄰域內的點的數量為128,得到特征向量[N×256×512] 。

步驟7)采用PointNet 對整體點云進行全局特征向量編碼。

步驟8)經過分層點集特征學習后,對輸入的特征點進行二次抽樣,利用IDW(Inverse Distance Weighted)插值算法,將采樣點的特征傳遞回原始點集,得到[N×4096×256] 的數據。其中,IDW 插值的公式如下:

式(8)中,f為插值的特征值,d(x,xi)為x,xi的距離,p為d(x,xi)的指數,k為鄰域點的個數(默認情況使用p=2,k=3),wi為x,xi距離平方的倒數,j為點云的索引編號,C為任意常數。

步驟9)再對原始點集特征向量進行卷積,批量標準化和激活函數處理,并使用反向傳播(Back propagation,Bp)算法對卷積網絡中參數進行調整,當l+1 為卷積層時,假設特征映射輸入為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()· 表示旋轉180°。

步驟10)使用Softmax回歸對豬體點云每個點進行分類預測,其中類別標簽y∈{ }1,2…,C,C=8分別對應著豬體的八個部位(左前腿、右前腿、左后腿、右后腿、耳朵、頭部、尾巴、身體)。給定一個點x,采用Softmax回歸預測的屬于c的條件概率為

式(11)中wc是第c類的權重向量,則Softmax決策函數可以表示為

3 實驗結果與分析

本文訓練模型系統環境為Intel i5-11400 CPU,RTX2060 GPU,6GB 顯存,深度學習框架Pytorch1.4,Cuda10.0。設置模型初始學習率(Learning Rate)為0.001,衰減率(Learning Rate Decay)為0.5,每20輪迭代輪數衰減一次,模型訓練每次輸入點云數量批尺寸(Batch Size)為4。圖5對比了采用八叉樹改進后的PointNet++網絡與PointNet++基礎網絡訓練過程的mIoU 與OA 變化。由圖5 所示,改進后的PointNet++獲得了更好的學習能力,在經過40 輪左右的訓練后,幾乎已經收斂,在100 輪的訓練中最佳的mIoU 為88.27%,OA 為96.97%。而原PointNet++網絡在60 輪訓練后才逐漸收斂,在100輪的訓練中最佳mIoU 為85.12%,OA 為94.45%。實驗結果證明,改進后的PointNet++網絡在豬體點云數據集上具有更強的學習能力。

圖5 訓練過程性能指標變化

采集的活體豬點云其姿態呈現多樣性,從不同視角觀察可以分為不同姿態,俯視圖的豬體點云姿態可大致分為直線型、左扭頭型、右扭頭型,側視圖的豬體點云姿態可大致分為平視型、微低頭型、重低頭型,共9 種姿態。為了進一步驗證本文采用八叉樹結構對PointNet++網絡改進的有效性,以9 種姿態的豬體點云為測試樣本,在PointNet++基礎上采用平面擬合的方法計算法向量(+Normal),在第一個逐層抽象模塊使用Octree 的采樣與分組方式(+Octree1),在第二個逐層抽象模塊使用Octree 的采樣與分組方式(+Octree2)進行不同模塊組合下的消融實驗,如表1 所示。表2 為在不同模塊組合下的分割結果。由表2 可知,相比于基礎模型PointNet++的分割結果,采用平面擬合的方法計算法向量信息(+Normal)后,除去Post8 外其他類別的mIoU 均有提升,法向量作為點云各點的屬性包含了重要的空間信息。在第一個逐層抽象模塊改用八叉樹結構進行采樣與分組(+Octree1)之后,對所有類別的分割精確度均有提高,尤其對于Post6,Post9 等扭頭且低頭的不規則姿態豬體點云的分割效果提升更為明顯。第二個逐層抽象模塊改用八叉樹結構進行采樣與分組(+Octree2)的方式,從各個姿態的分割結果上來看,相比于PointNet++基礎結構雖有提高,但是提升效果不如前者(+Octree1),原因是第一次采樣在原始豬體點云上進行的,基于八叉樹的采樣方式比最遠點采樣能保留更多豬體點云的空間結構信息,而第二次采樣是在第一次采樣的基礎上再進行采樣,是第一次采樣更細節化,因此第一次采樣更關鍵。兩個逐層抽象模塊均使用Octree 的采樣與分組方式并使用法向量(Octree-PointNet++)的模型,在除了Post4 的其他姿態的豬體點云分割結果上均取得了最佳,總體的平均mIoU 和OA 相較于原PointNet++模型分別提升了3.04%、4.54%。

表1 用于消融實驗的不同模塊說明

表2 不同姿態的豬體點云數據的消融實驗結果(單位:%)

注:粗體表示最優結果,Post1為直線平視型、Post2為直線微低頭型、Post3為直線重低頭型、Post4為左扭頭平視型、Post5為左扭頭微低頭型、Post6為左扭頭重低頭型、Post7為右扭頭平視型、Post8為右扭頭微低頭型、Post9為右扭頭重低頭型。

圖6 所示為部分姿態豬體點云的可視化結果,圖中每列表示一類姿態,每行表示對應結果。從第1、2 列相對簡單的姿態來看,原始的PointNet++模型會把部分頭部的點云分成是耳朵,還會把部分身體的點云分成是尾巴。+Normal 分割效果雖有提升,但是對于頭部和耳朵的分割仍然不理想。+Octree1 和+Octree2 對于局部細節的捕捉能力明顯更強,基本可以將耳朵與頭部分割開來。第3、4 列為較復雜的扭頭且重低頭的姿態,PointNet++網絡對于此類姿態的分割結果較為糟糕,由于豬在低頭時腿部離頭部很近,還會出現左右腳交叉的現象,因此會把部分頭部點云看成是腿部,左腿分為了右腿。+Normal 的分割結果雖有所改善,但仍然不理想,會把頭部分為了后腿。+Octree1 和+Octee2 分割的效果要明顯由于前二者,但是對于一些細節的分割仍然存在不足??梢钥闯鯫ctree-PointNet++無論是對于復雜姿態還是相對標準的姿態,其分割效果都理想,除去分割邊界不如人工數據處理得平滑之外,基本與手工標記無異。

圖6 部分姿態豬體點云部分分割可視化效果對比

不同的點云分割算法在我們采集的數據集上的分割效果如表3 所示。PointNet++根據其點云采樣及分組方式的不同分為單一范圍分組(ssg,single-scale grouping),即通過深度網絡提取在相同半徑下的點云局部空間特征,以及多尺度范圍分組(msg,Multi-scale grouping),即在不同分組半徑下提取點云局部信息,再編碼成特征向量。從結果上看,msg版本的平均分割精確率要略優于ssg。相比于PointNet 直接對原始點云整體提取特征的方法,PointNet++的層次化特征提取模式具備了更好的分割效果。3D Point in 2D Space[24]是將三維點云降維為二維數據,再通過U-Net 網絡進行分割,DG-CNN[25]則是先對原始輸入點云構建圖結構,增強了點之間的關聯性,再送入Edge-Conv 進行處理。然而,在實際的豬體點云分割實驗中,兩者的分割效果均不如PointNet++網絡算法。原因可能是其對不同姿態豬體點云變化不敏感,缺乏對非剛性形變目標物體的特征學習能力。

表3 各算法在我們數據集上的性能對比

4 結語

針對現有的PointNet++網絡不能很好地提取不同姿態豬體點云數據的局部特征問題,采用八叉樹結構改進了其采樣及分組方式,實驗結果表明,改進后的網絡更加適合于大規模點云數據中提取豬體不同姿態的非剛性變化特征,能夠更加精確地對不同姿態的豬體點云數據進行部位分割,尤其是對于復雜姿態的豬體點云數據,分割精確度的提升更為明顯,且可視化效果與人工標記幾乎無異。

猜你喜歡
八叉樹豬體立方體
疊出一個立方體
三維十字鏈表八叉樹的高效檢索實現
夏季養豬要做好防暑降溫
基于單視角點云鏡像的豬只體尺測量方法
學會8招夏季養豬增膘等4則
圖形前線
立方體星交會對接和空間飛行演示
折紙
夏季養豬增膘九招
散亂點云線性八叉樹結構在GPU中的實現
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合