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