敖建鋒,蘇澤鍇,劉傳立,李美妮,朱 濱
(江西理工大學建筑與測繪工程學院,江西 贛州 341000)
激光雷達獲取得到的點云數據具有精度高、魯棒性強等特點,點云是一種表達形式簡單、靈活多變的數據形式,在自動駕駛[1]、目標識別、三維重建[2]、城市規(guī)劃和遙感測繪等方面有著廣泛的應用。近年來,隨著機器學習的發(fā)展,如何利用點云進行3D目標檢測受到了人們的關注。與二維圖像相比,點云可以更好地表現出地物的表面特征及距離信息,然而與基于圖像的目標檢測的快速發(fā)展形成鮮明的對比[3],由于點云本身的無序性、稀疏性等特點,在基于點云的目標檢測準確度方面遠不如圖像目標檢測,研究還存在著諸多難點亟待解決。卷積神經網絡對于輸入順序是敏感的,而點云數據具有置換不變性,即以任意順序輸入點云都能表示同一物體。目前,利用點云數據進行深度學習主要有以下三種方法。多視角投影[4-5]是通過將點云轉換為在多個角度下投影的圖像,形成多張二維圖像,最后將其輸入到2D卷積神經網絡進行特征的提取。這種方法借助了成熟的圖像處理技術來解決難以直接輸入點云的問題,但從三維點云到二維圖像這一轉換過程中,不可避免地會造成信息的丟失。另一種方法是在三維空間中劃分規(guī)則的立方體,將點云數據柵格化轉換為體素來解決點云無序性的問題,并將2D卷積神經網絡拓展到3D卷積神經網絡。但三維卷積隨著空間復雜的增加和分辨率的提升計算量呈3次方的增長,這就需要對立方體的大小進行謹慎地選擇。目前基于體素的方法[6-8]一般將立方體大小限制在30×30×30,相比圖像的高分辨率,三維空間中的分辨率成為限制模型學習能力的瓶頸。前兩種方法都是先將點云轉換為其他形式,在進行目標檢測中存在局限性,理想情況下是直接使用點云進行輸入,保留信息的完整性,實現端到端的特征學習。斯坦福大學的QI提出了PointNet[9]模型有效地解決了這一問題,利用對稱函數(最大池化)進行對稱化操作處理點云,直接將點云輸入神經網絡中進行特征的提取,有效地解決了前兩種方法信息丟失的缺點。避免了點云數據特點帶來的局限性[10]。
因此本研究將采用對稱函數的方法,利用直接處理原始的點云數據的Frustum-Pointnets模型[11]進行3D目標檢測,避免了轉換點云數據時的特征損失。并在該模型的基礎上進行改進,提升了模型了性能,得到了很好的檢測效果。
本文采用Frustum-Pointnets模型,直接對原始點云進行處理并實現3D目標檢測。Frustum-Pointnets模型基本框架如圖1所示。
圖1 Frustum-Pointnets模型框架
其中,n為視錐提取出來的點云數;m為分割出的點云數;c為點云的通道數;k為點云被分為k個類。模型共分為3個部分:三維視錐提取、3D實例分割、3D檢測框回歸。該模型結合了圖像和點云的優(yōu)點,先通過圖像生成2D檢測框并將其擴展到三維空間對目標點云進行檢索,然后對區(qū)域內的點云利用Pointnet網絡進行實例分割,最后估計目標點云的3D檢測框。
由于大多數的三維傳感器的數據分辨率尤其是實時3D激光雷達采集的點云相比圖像的分辨率低很多,因此Frustum-Pointnets利用圖像進行二維目標區(qū)域的定位,然后擴展到三維空間形成視錐,如圖2所示。
圖2 三維視錐提取示意圖
2D目標檢測器是基于FPN模型[12],先在image-Net和COCO上預訓練生成訓練模型并根據KITTI數據集[13-14]進行微調,生成2D檢測框,然后結合標定好的傳感器內參和已知的相機投影矩陣,二維的檢測區(qū)域就可以變換到三維視錐(圖3),過濾三維視錐外的點云并對視錐內的點云進行提取,這樣就只需要在視錐中對點云進行檢索,而不需要在整個場景中檢索,大大地減少了計算量。由于在實際中視錐的朝向是各異的,需要對視錐進行旋轉歸一化處理,從相機坐標系圖3(a)轉換到視錐坐標系圖3(b),使視錐的中心軸(z軸)與圖像所在的平面正交化,歸一化處理有利于提升模型的旋轉不變性。
由于在場景中有很多前景的遮擋和后景的干擾,直接對視錐中的點云進行3D檢測框回歸是很困難的??紤]到目標在三維空間的自然狀態(tài)下是自然分離的,而在二維空間中并沒有目標之間的深度信息,因此3D點云分割是比在圖像上更加容易和自然的。3D實例分割模塊使用了PointNet網絡,對視錐中的點云進行語義分割得到目標點云(一個視錐只分割出一個對象),分割網絡結構如圖4,其中mlp為多層感知器。在該模塊中還加入了一個預定義的語義類別one-hot向量,利用圖像的檢測結果輔助網絡對目標點云進行分割。最后對目標點云進一步地平移歸一化操作,將視錐坐標系圖3(c)轉換到掩模坐標系圖3(d),坐標系原點為點云掩模的質心,提高模型的平移不變性。這樣目標點云就都集中在坐標原點附近,使得后續(xù)的處理進一步地簡化。
圖3 坐標歸一化
圖4 3D實例分割結構
由3D實例分割得到的目標點云在掩模坐標系下的質心并不是物體真實的質心,這是因為3D激光雷達在采集點云的過程中會被其他目標物遮擋或一部分目標點云在視錐之外,造成目標點云并不完整,因此計算出的目標點云質心可能與目標物體真實的質心距離很遠。模型采用一個輕量的變換網絡T-Net來估計完整目標物體的質心,預測目標物體的質心和掩模坐標系原點之間的殘差。最后一步為3D檢測框的估計,通過PointNet網絡如圖5所示,對3D檢測框的中心、尺寸、朝向進行估計。對于檢測框的中心采用殘差的方法來進行估計,由3D檢測框估計網絡(PointNet)估計的中心殘差與T-Net先前估計的中心殘差和點云掩模的中心進行組合,以恢復目標物體真正的中心,再將點云從掩模坐標系轉換到預測的以目標物體真實質心為原點的坐標系。如公式(1)所示,Cpred為最終預測的檢測框中心殘差,Cmask為點云掩模的中心殘差;ΔCT-Net為T-Net估計的中心殘差;ΔCBox-net為PointNet估計的中心殘差。最終由全連接層(FCs)輸出3D檢測框的質心坐標(cx,cy,cz)、長寬高(h,w,l)、航向角(θ)共7個參數。
Cpred=Cmask+ΔCT-Net+ΔCBox-net
(1)
圖5 3D檢測框評估PointNet網絡結構
激活函數是深度學習中的核心單元,主要目的是對神經元的輸入映射到輸出,通過引入一個非線性的函數,使得神經網絡在傳遞過程中每一層的輸入端和輸出端不再是簡單的線性函數,而是可以逼近任意的非線性函數,讓神經網絡擁有強大的表達能力。選用合適的激活函數可以提高模型的性能和收斂速度,常見的激活函數有sigmoid、tanh、ReLU函數,但sigmoid和tanh函數在輸入值非常大或非常小時函數的輸出值的變化很小,在反向傳播中會導致梯度逐漸變小甚至消失,最終導致權重得不到更新。在本實驗中選用了ReLU[15]和Swish函數[16]。
ReLU函數的表達式非常簡單,如圖6(a)當x>0時,輸入值等于輸出值,當x<0時,輸出值等于0。ReLU函數的表達式為:
(2)
其中,f(x)為輸出值;x為輸入值。
ReLU函數的優(yōu)點在于解決了sigmoid、tanh函數梯度消失的問題,計算量小收斂速度快,只需要一個閾值(是否大于0)就可以得到激活值,但是在輸入值小于0時直接簡單地置0,導致該神經元不再被激活,參數永遠得不到更新,最終造成大量有效特征被屏蔽。
Swish函數是由谷歌大腦團隊提出的。如圖6(b)Swish函數與ReLU函數一樣無上界而有下界,但Swish函數是平滑且非單調的函數。函數表達式為:
(3)
其中,f(x)為輸出值;x為輸入值;β是一個常數或者是可訓練的參數,當β=0時Swish為線性函數,當β→∞時Swish函數變?yōu)镽eLU函數,因此Swish函數是介于線性函數與ReLU函數之間的平滑函數。雖然收斂速度相比ReLU函數慢,但Swish的平滑和非單調性是它的優(yōu)點,在輸入為負值時仍能輸出有效值,避免了神經元壞死梯度參數無法更新的情況的出現,而且由于是非單調函數,因此即使輸入值增大輸出值也可以減小,更加適合深層次的神經網絡。
參數初始化是深度學習中一個很重要的方面,合適的參數初始化方法能讓神經網絡在訓練的過程學習到更多有用的信息,這意味著參數梯度不應該為0。在全連接的神經網絡中,參數梯度與反向傳播得到的狀態(tài)梯度和激活值有關,激活值飽和會導致該層狀態(tài)梯度信息為0,然后導致下面所有層的參數梯度為0,因此參數初始化函數應該使得各層激活值不會出現飽和現象且激活值不為0。選用合適的參數初始化函數不但能夠避免梯度消失的現象,同時也能加快收斂速度提高網絡的訓練效率。傳統(tǒng)的參數初始化方法從高斯分布中隨機初始化參數,甚至直接全初始化為1或者0,這樣的方法雖然簡單計算量小,但效果往往很差。為了提高模型的性能,本試驗選用了Xavier初始化[17]和He初始化方法[18]。
Xavier初始化的基本原理是若對于一層網絡的輸入和輸出可以保持均勻分布而且方差一致,就能夠避免輸出值都為0的情況,從而避免梯度消失,使得信號在神經網絡中可以傳遞得更深,在經過多層神經網絡元后輸出值保持在一個合理的范圍。根據輸入和輸出神經元的數量自動決定初始化的范圍,初始化范圍如公式(4),n為所在層的輸入維度,m為輸出維度。
(4)
He初始化考慮到了ReLU函數的影響,基本原理是對于ReLU激活函數,當輸入小于0時其輸出為0,會導致該神經元關閉,影響其輸出值的分布模式。因此在Xavier初始化的基礎上,假設有一半的輸出為0,就需要對權重的方差進行加倍補償,使得參數的方差保持平穩(wěn)。
實驗平臺為AMD銳龍R5 3600、NVIDIARTX 2060 Super、16 GB內存,在Ubuntu 18.04和Python 2.7下搭建CUDA 10.0、CUDNN 7.6.4、TensorFlow 1.15深度學習環(huán)境。實驗采用自動駕駛場景KITTI數據集,KITTI數據集是目前公開的規(guī)模最大的交通場景數據集,包含市區(qū)、鄉(xiāng)村和高速公路場景的真實圖像和點云數據,每個場景中最多達15輛汽車和30個行人,根據不同程度的遮擋和截斷,劃分為簡單、中等、困難三個等級。該數據集共有7481個場景對應7481張圖像和相應點云數據,將KITTI數據集劃分為3712份訓練集和3769份驗證集。
采用不同的激活函數和參數初始化方法進行組合對比,模型優(yōu)化器選擇Adam,初始學習率設置為0.001,初始衰減率為0.5,衰減速度為800000,即每迭代800000次學習率減半,batch_size設置為32,num_point為1024,max_epoch為200,即每次迭代處理32份點云數據且每一個樣本只從視錐里抽取1024個點用于訓練,并對所有訓練樣本迭代200次。目標檢測精度實驗結果如表1所示。由表1可知:ReLU和Xavier組合對汽車的檢測在簡單與困難下準確率最高;使用Swish和Xavier組合時對行人的檢測準確率最高;而使用Swish和He方法組合時對騎車人的檢測準確率最高。雖然使用Swish激活函數和He初始化方法在汽車與行人的檢測準確率比其他組合低,但是差距很小,而且在對騎車人的檢測中,這種方法組合的準確率遠高于其他的方法組合,因此綜合考慮,選用Swish作為激活函數、He作為模型的初始化方法最為合適,在目標檢測中可以達到較好的效果。
表1 不同激活函數和初始化方法組合目標檢測精度對比
將改進過的模型與近年來主流的3D目標檢測模型進行對比,不同模型的目標檢測結果如表2所示,其中AVOD[19]和MV3D[20]是基于多視角投影的方法;VoxelNet[21]是基于體素的方法。從表2可以看出:改進后的Frustum-Pointnets模型只有汽車(困難)的檢測準確率比VoxelNet略低,對行人和騎車人的檢測準確率均高于其他模型;與原始的Frustum-Pointnets模型相比,目標檢測準確率均得到了提升,特別是對騎車人的檢測準確率提升更為明顯,兩者的差距最多達到了9.45 %。
表2 不同模型目標檢測精度對比
對Frustum-Pointnets模型輸出得到的7個參數進行三維空間的可視化。在圖像中的真值框和在點云中預測的3D檢測框如圖7所示,圖7(a)為圖像的2D真值檢測框可視化,圖7(b)為圖像的3D真值檢測框可視化,圖7(c)為點云的預測結果可視化。從圖中可以看出:場景中的目標基本都能被準確的識別,即使左下角和右下角的汽車只能看到一小部分,在點云中仍舊能精確地檢測出目標物體的邊界和航向。而最遠處的汽車由于距離太遠目標點云過于稀疏,目標的位置和朝向被錯誤的估計,檢測結果與真實值存在較大誤差。
針對目前利用點云進行3D目標檢測的準確率較低的情況,本文利用Frustum-Pointnets模型實現對點云的3D目標檢測,并在該模型的基礎上進行改進,選擇合適的激活函數和參數初始化方法組合,提高了目標檢測的精度,與原始的Frustum-Pointnets模型相比,在對騎車人的檢測中準確率分別提高了9.45 %、3.77 %和3.28 %,對模型的泛化性有了進一步的提高。然而由于Frustum-Pointnets模型采用圖像和點云串行處理結構,而不是圖像和點云一起的并行處理,導致3D目標檢測的精度依賴于圖像的檢測結果,在光線條件差和遮擋嚴重等情況下,2D檢測器難以準確定位目標導致影響到3D目標檢測的準確度。在目標物體離傳感器太遠的情況下,由于獲取到的點云過于稀疏,模型無法準確估計目標的準確位置,出現漏判和錯判的情況。接下來將對模型進一步研究,改善這些問題。