激光雷达目标检测 (上)
激光雷達目標檢測 (上)
**---- 轉載自美團無人專送團隊**簡介
安全性是自動駕駛中人們最關注的問題之一。
在算法層面,無人車對周圍環境的準確感知是保證安全的基礎,因此感知算法的精度十分重要。現有感知算法的思路一般通過某種數學模型對現實世界的某個子集進行擬合。
當情況足夠簡單的時候,算法可以得到較高的精度。例如現在很多無人駕駛公司有在限定的時間段和限定的場地內,用單一傳感器的算法就可以得到非常高的精度。
但是自動駕駛中的實際問題非常復雜,各種天氣、路況和障礙物的組合非常多,基于單一傳感器的算法很難解決所有情況。例如在進隧道和出隧道時因為光線的突然變化攝像頭會有欠曝光和過曝光問題,此時拍到的圖片幾乎全黑或全白,僅基于攝像頭的感知算法很難在這種情況給出高精度的結果。
為了解決這種開放環境中的自動駕駛問題,很多自動駕駛公司提出了多傳感器方案,希望通過取長補短來提高自動駕駛系統處理復雜環境的能力。現在最普遍使用的傳感器是攝像頭,除此之外還有激光雷達、毫米波雷達、GPS/IMU等。
激光雷達作為自動駕駛領域中最重要的傳感器之一,常用于物體檢測、道路分割和高精度地圖構建。
本文主要討論基于激光雷達的物體檢測算法。在討論具體的算法之前,首先要了解激光雷達數據的特點。
激光雷達原理和數據特點
現在自動駕駛中常用的激光雷達為機械式激光雷達,其由若干組可以旋轉的激光發射器和接收器組成。每個發射器發射的一條激光束俗稱“線“,主要有單線、4線、16線、32線、64線和128線雷達。
常見機械式激光雷達中激光束是波長在900nm左右的近紅外光(NIR),可以根據激光直接獲得周圍一圈的準確的三維空間信息。
這種雷達的成像原理比較簡單:發射器和接收器連接在一個可以旋轉的機械結構上,某時刻發射器將激光發射出去,之后接收器接收返回的激光并計算激光與物體碰撞點到雷達原點的距離。
由于每次發射/接收的角度是預先設定的,因此根據距離、水平角度和垂直角度就能求出碰撞點相對于激光雷達中心的坐標。每條線每次發射激光得到的數據由一個四元組(x,y,z,i)表示,其中(x,y,z)是三維坐標,i表示反射強度。
圖1:一個32線激光雷達的成像原理示意圖以某款32線激光雷達為例,32根線從上到下排列覆蓋15.0°到-24.9°。
工作狀態時這32根線在水平平面旋轉可以采集一周360°的數據。雷達的旋轉速度和角分辨率是可以調節的,常用速度為10hz(100ms轉一圈)對應每0.2°采集一次數據,即角分辨率為360/0.2=1800。
由于光速非常快所以在1800中任何一個位置進行一次發射和接收動作可以看作是瞬時完成的。受到硬件能力的限制,一般轉速越快則發射和接收激光的次數越少,即角分辨率越小。常用雷達采集到的數據點距離雷達中心一般不會超過150米。
通常采集到的360°的數據被稱為一幀,上面的例子中一幀數據在理論上最多包含32*(360/0.2)=57600個點。
在實際情況中如果雷達被放置在車的上方大約距地面1.9米的位置,則在比較空曠的場景中大約獲得40000個點,一部分激光點因為被發射向天空或被吸收等并沒有返回到接收器,也就無法得到對應的點。下圖是典型的一幀數據的可視化圖。
圖2:一個32線激光雷達的一幀數據的三維可視化圖激光雷達具有不受光照影響和直接獲得準確三維信息的特點,因此常被用于彌補攝像頭傳感器的不足。激光雷達采集到的三維數據通常被稱為點云,激光點云數據有很多獨特的地方:
距離中心點越遠的地方越稀疏;
機械激光雷達的幀率比較低,一般可選5hz、10hz和20hz,但是因為高幀率對應低角分辨率,所以在權衡了采樣頻率和角分辨率之后常用10hz;
點與點之間根據成像原理有內在聯系,比如平坦地面上的一圈點是由同一個發射器旋轉一周生成的;
激光雷達生成的數據中只保證點云與激光原點之間沒有障礙物以及每個點云的位置有障礙物,除此之外的區域不確定是否存在障礙物;
由于自然中激光比較少見所以激光雷達生成的數據一般不會出現噪聲點,但是其他激光雷達可能會對其造成影響,另外落葉、雨雪、沙塵、霧霾也會產生噪聲點;
與激光雷達有相對運動的物體的點云會出現偏移,例如采集一圈激光點云的耗時為100ms,在這一段時間如果物體相對激光有運動,則采集到的物體上的點會被壓縮或拉伸。
激光雷達物體檢測算法
圖3:本節的敘事結構在深度學習流行之前主要用傳統的機器學習方法對點云進行分類和檢測。
在這個領域對于這些學習方法本身的研究并不多,研究者更傾向于直接把理論上較為成熟的方法應用到激光點云數據中。研究者將研究重點主要放在對數據本身特性的理解上,從而設計出適合點云的算法流程。
上一節點云圖中最明顯的規律是地面上的“環”,根據點云的成像原理當激光雷達平放在地面上方時,與地面夾角為負角度的“線”在地面上會形成一圈一圈的環狀結構。
因為這種結構有很強的規律性所以很多物體檢測算法的思路是先做地面分割然后做聚類,最后將聚類得到的物體進行識別。為了提高算法的速度,很多算法并不直接作用于三維點云數據,而是先將點云數據映射到二維平面中然后再處理。常見的二維數據形式的有Range Image和Elevation Image。
從2014年開始深度學習廣泛地被應用在各個領域,隨著圖片物體檢測算法的發展,點云物體檢測也逐步轉向了深度學習。
現在自動駕駛中一般關注鳥瞰圖中物體檢測的效果,主要原因是直接在三維中做物體檢測的精確度不夠高,而且目前來說路徑規劃和車輛控制一般也只考慮在二維平面中車體的運動。
現在在鳥瞰圖中的目標檢測方法以圖片目標檢測的方法為主,主要在鳥瞰圖結構的建立、物體的空間位置的估計以及物體在二維平面內的旋轉角度的估計方面有所不同。
從檢測結果來看這類算法比在三維空間中的物體檢測要好。直接作用在三維空間中的物體檢測方法在近年來也有所突破,其通過某種算子提取三維點云中具有點云順序不變性的特征,然后通過特殊設計的網絡結構在三維點云上直接做分類或分割。
這類方法的優點是能對整個三維空間任何方向任何位置的物體進行無差別的檢測,其思路新穎但是受限于算法本身的能力、硬件設備的能力以及實際應用的場景,現在還不能在實際中廣泛地使用。
自動駕駛對于檢測算法有著比較特殊的要求:首先為了安全性考慮召回率要高,即不能漏檢;其次因為檢測到的物體是下游路徑規劃和運動決策算法的輸入,這要求檢測到的目標在連續幀中具有較好的穩定性,具體而言即在連續幀中檢測到的同一個物體的類別、尺寸、位置和方向不能有劇烈的變化。與此同時因為激光點云的稀疏性,現有算法單用一幀點云數據無法在小物體、遠處物體和被遮擋物體的檢測上得到令人滿意的結果。
因此近幾年人們開始考慮結合多種傳感器數據的方法、結合多個激光雷達的方法以及結合連續多幀的方法。
雖然在學術界的排行榜中現在最好的方法是基于深度學習的算法,但是在實際問題中數據的預處理、后處理等對最終結果有著至關重要的影響,而這些部分的算法往往需要根據數據和使用場景有針對性的設計。
所以本節首先會介紹一些單幀目標檢測中的非深度學習算法中對于激光數據的處理方式,然后會在下集介紹深度學習算法以及多幀目標檢測算法中介紹幾個具有代表性的方法。
非深度學習算法
2015年之前應用在激光雷達領域的檢測和分類模型以線性模型、SVM和決策樹為主。這些模型的泛化能力和復雜程度無法在實際場景中滿足人們的需求,因此研究者將注意力更多的放在了對于點云數據特性的挖掘上。常見的算法流程為:
將三維點云映射為某種結構,例如Graph和Range Image;
提取每個節點或像素的特征;
將節點或像素聚類;
通過一定規則或分類器將一個或多個聚類確定為地面;
結合地面信息,通過分類器對其他聚類進行物體級別的識別;
把所有的檢測、識別的結果映射回三維點云中。
從檢測和分類的效果來說,這類方法遠沒有基于深度學習的方法好。
但無論是基于Graph或是基于Range Image的結構都比單純的點云蘊涵了更多的信息。在這些結構中有時使用簡單的基于規則的方法就可以得到比較好的結果,這一點在實際應用中非常重要。例如在物體檢測任務中出現了訓練集合中未出現過的物體,基于學習的方法一般無法正確地將其檢測出來。但是基于簡單規則的方法卻可以正常給出檢測結果,雖然此時分類結果往往是未知。
在自動駕駛中檢測算法的漏檢問題遠比錯分類問題嚴重很多,從這個角度說基于簡單規則的方法是保證安全的一把鎖。從實時數據預處理的效率來說,在實際環境中為了提高檢測精度需要將離散的噪聲點和不在檢測范圍內的物體過濾掉。在Graph和Range Image中進行噪聲數據的過濾有時比直接在點云上做效率高。
1 基于Graph的方法
基于Graph的建模方法指直接根據三維點云直接建立無向圖G = {N, E},N表示圖中的節點E表示節點之間的邊。常用的建圖方式是將三維點云中每個點的坐標(x,y,z)作為一個節點。找到每個節點對應的雷達的線數l和水平方向的旋轉角度θ,當兩個節點i和j滿足下面任何一個條件時為這兩個節點建立一條邊。即如果兩個點由相鄰線在同一時刻產生,或由同一根線在相鄰時刻產生,則為兩個點建立一條邊。數學描述如下:
|l_i - l_j| = 1 and θ_i = θ_j
l_i = l_j and (θ_i - θ_j) mod 360 = r
這里r表示水平方向的最小旋轉角,上節例子中r=0.2。實際在建圖時會增加其他約束,比如兩個節點的距離不能太遠或兩個節點的高度差不能太大等。上節中點云的建圖結果可視化如下圖,深藍色表示滿足第一個條件的邊,淺藍色表示滿足第二個條件的邊。
圖4:在激光點云中直接根據三維點云信息建立Graph的可視化結果,其中深藍色的是縱向的邊,淺藍色的是橫向的邊。右側的圖是左側的局部放大版本。建圖的目的是在空間中離散的三維點之間建立某種聯系,從而為后續的聚類和分割做準備。一般這種建圖的方法不設定邊的權重,依靠節點的特征進行聚類和分割。
Moosmann提出了一種使用法向量作為節點特征的方法【1】。其思路是將點云看成連續曲面上的離散采樣。所謂法向量是指曲面在每個節點處的法向量,如果兩個相鄰的節點的法向量相似則說明這兩個節點所在局部平面比較光滑,那么這兩個節點應當屬于一個同一個物體。論文中使用一種簡單快速的方法對于每個節點位置的法向量進行估計,即首先計算所有相鄰平面的法向量(如下圖藍色箭頭),然后求法向量的幾何平均值并進行歸一化(下圖紅色箭頭),最后所有節點的法向量再根據所有相鄰節點進行均值濾波。
圖5:節點法向量的可視化例子。紅色和藍色的圓形是節點,藍色的箭頭描述了每三個相鄰點組成的平面的法向量,紅色的箭頭描述了最終得到的法向量。得到特征之后就可以根據相鄰節點之間的特征相似性進行聚類,聚類的首要目的一般是求出屬于地面的節點即地面分割。
Douillard為不同的數據類型提出了不同的地面分割方法【2】。其基于Graph結構的地面分割算法的核心思想是:首先確定屬于地面的種子節點然后由內向外進行區域增長。
論文中提出的算法為了在處理各種邊緣情況的同時盡可能的增加地面節點的召回率,手工設定了一系列復雜的約束條件。這樣做確實在實驗指標上看起來好一些,但是在實際的應用中關注更多的并不是地面節點的召回,而是地面節點在所有可行駛區域內的分布是否均勻。一般來說根據這個目標在實際場景中只用很簡單的決策樹,就可以建立出滿足應用要求的約束模型。Douillard在得到地面之后通過聚類算法找到其他類別的物體如下圖。
圖6:基于傳統方法的物體檢測的可視化結果上面介紹的建圖的方法只能作用在低速單幀的數據中。因為在高速情況由于多普勒效應很難準確為每一個三維點找到其對應的雷達線數和水平旋轉角度,多幀的情況也類似。而更通用的建模方法是為每個節點尋找最鄰近的k的節點建立邊。這種方法雖然可以建立八叉樹等數據結構進行加速,但是沒有在Range Image中建圖的效率高。
2 基于Range Image的方法
Range Image是指距離圖,即一種類似圖片的數據結構。以上節32線激光雷達的數據為例子,對應的Range Image寬360/0.2=1800像素,高32像素。每個像素值表示對應點到原點的距離。上節中的點云對應的Range Image的的可視化如下圖,因為這個圖非常細長所以只截取了一小段。黑色的部分缺少對應的點云信息,其他的不同顏色代表不同距離。
圖7:一個Range Image的例子。Zhu提出了一種在Range Image中建立無向圖G = {N, E}的方法【3】。即在圖中每一個像素代表一個節點,以每一個節點為中心在二維平面上以一定距離搜索其他節點,如果兩個節點在三維空間中滿足某些條件則建立一條邊,邊的權重是兩個點在三維空間中的距離。建圖之后使用基于圖的分割算法(例如【4】)即可得到聚類結果。
這種方法建圖的速度非常快,在實際使用過程中還需要處理多個點映射到同一個像素的情況,其建圖的結果和直接在三維點云中建圖相比非常接近。Range Image不僅僅能為計算進行提速,還可以做到一些不方便在點云上直接處理的事情,因為其比點云包含了更多的信息。
Biasutti提出了一種對點云中被遮擋的部分進行還原的方法【5】。其思路是:首先將點云生成Range Image結構并在其中進行聚類,然后選擇某個物體所代表的類并在圖中抹掉,之后根據周圍像素將抹掉的部分復原出來,最后將Range Image映射回點云。下圖是論文中的算法的結果,可以看出白色的行人被抹掉了,而地面上的空洞被漂亮的填充了。
圖8:被遮擋點云和還原被遮擋點云的對比圖,左圖是原始點云,右側是將人去掉后的點云。總結
以上是生活随笔為你收集整理的激光雷达目标检测 (上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【mysql】只使用数据库DB如何实现-
- 下一篇: 热电链条式炉排热水锅炉项目DCS组态方案