Categories
程式開發

自動駕駛感知技術的實踐與探索


導讀:自動駕駛中的感知技術如同駕駛員的”眼睛”和”耳朵”,在高速重卡的場景中,感知技術將面臨哪些挑戰?在量產化道路中,如何讓感知技術與產品相結合去看清和理解足夠的場景,本文將分享我們的一些心得體驗。

以下Enjoy~

大家好,很高興今天給大家分享智加科技在感知技術上的實踐和探索,在前面的環節,江博士已經介紹了很多深度學習在智加自動駕駛中的很多應用,這裡我特地給大家多介紹一些感知方面,深度學習(還包括其它的一些傳統方法)能夠落地的一些方法和實踐,尤其是我們在實踐過程中遇到的一些技術問題和一些有意思的case,以及我們量產過程中遇到的一些問題,都會跟大家一起做一些分享,大家也可以留言跟我們討論。

自動駕駛感知技術的實踐與探索 1

這裡,感知的定義就不多介紹了,感知是我們自動駕駛的”眼睛”和”耳朵”,是自動駕駛信息獲取的第一步,所以感知是非常基礎和關鍵的一個環節。這需要在我們的自動駕駛車輛上佈滿傳感器,這樣才能360°無死角的知道周邊的各種情況,而且不止包括我們的”眼睛”Camera,還包括我們的”耳朵”激光雷達和毫米波雷達等非視覺傳感器,這些在我們的測試車輛上都是必備的,我們可以從上圖中看到,我們的車輛上佈滿了傳感器,車前、車尾、車頂都會存在傳感器。

自動駕駛感知技術的實踐與探索 2

自動駕駛車輛除了能看到東西之外,關鍵還是需要理解它。只有理解它之後獲得的信息,才對我們後續的處理有意義,所以需要識別,那麼,對於自動駕駛而言,需要識別什麼?顯而易見,第一個是車道線,我們知道車道線才能知道怎麼開;然後我們還需要知道紅綠燈,以及非常重要一點,就是動態障礙物(如前面有什麼車輛),這是非常重要的;還有就是行人(對於城區的自動駕駛是非常關鍵的)。對於智加的重卡自動駕駛中,最重要的還是 車道線動態障礙物,所以這兩方面會重點進行介紹。

1. 車道線檢測

① 傳統方法到深度學習方法

自動駕駛感知技術的實踐與探索 3

首先是車道線檢測。從圖像來看,車道線相對而言比較有規律,所以用一些傳統的視覺算法就能取得不錯的效果,比如對輸入的數據做變換之後,做邊緣檢測(Edge Detection)和霍夫變換(Hough Transform)就能夠識別出圖像上的這些很像車道線的形狀了。其中邊緣檢測是非常關鍵的一環,根據像素和像素之間的差值做一個濾波,找到差異點的線段,這就是傳統的方法。但是傳統方法會遇到瓶頸,因為要處理的場景非常多:

不同的光線;不同的車道線形狀;車道線本身不同程度的破損;或者是它的一些噪音,尤其是一些障礙物的遮擋,如大量車輛遮擋的情況下,用傳統方法很快就會遇到瓶頸,調參數是調不過來的。

所以,我們採用深度學習的方法來解決。

② 基於深度學習的方法

自動駕駛感知技術的實踐與探索 4

對於深度學習,業界已經有很多成熟的方法。這裡很重要的就是圖像分割,我們會給圖像上每一個pixel(像素)都去預測它到底是什麼樣的分類,然後在打標的時候,也會標註圖像上到底哪些是車道線,哪些是障礙物,哪些是天空,哪些是樹木,等不同類型的標籤。我們通過這樣一個卷積的網絡,類似Encoder-Decoder架構,先去做encoding到feature map,然後再deconvolution到一個大的feature map,然後再預測每個pixel跟ground truth之間分類的loss,比如用Softmax或者cross entropy都是可以的,最後我們就能學習出每個pixel是什麼分類。但是光知道圖像的分類可能還不夠。

自動駕駛感知技術的實踐與探索 5

我們還需要進一步知道,到底圖像上有幾條車道線,哪些車道線是屬於一條車道的?這裡簡單介紹下,我們會按照圖中的做法,先把圖像做encoding之後會分成兩個branch,一個是Embedding branch,用來生成每個pixel的向量,這個向量可以告訴你它跟不同實例距離的分佈,另外一個是Segmentation branch傳統的分類網絡。 Embedding branch 向量計算出來之後和ground truth點的向量之間計算距離,這樣就可以知道跟ground truth點之間有多近,和非ground truth點之間有多遠,用這個距離當做loss,最後再結合分類的loss,得出最終的結果。

自動駕駛感知技術的實踐與探索 6

剛剛說的這些方法其實都是基於convolution這樣傳統的方法來去做的,它有一個局限,我們知道CNN是對整個圖片都去做一次卷積,輸出的feature map反映的還是整個圖片的特性。但是對於車道線而言,它其實是很有規律的,就是近處看到一個車道線,在遠處還是同一個車道線,是一個很有復制性的pattern,所以業界提出了一個很好的方法,叫Spatial CNN,把整個空間按照一個sliding window結合相鄰window上一次的輸出,疊加到新的sliding window輸入上,相當於在圖像上的RNN,只不過它是在一個單層的圖像上來做的。通過這種方法就能學習出空間上的pattern,得到更好的車道線精度,對於我們來說是非常有用的。

2. 障礙物檢測

自動駕駛感知技術的實踐與探索 7

我們再來看下Object Detection,對於障礙物而言,它的pattern不像車道線那樣有規律,而且非常的離散,所以單純的用分割網絡是很難解決的。所以我們還會用到現在業界比較成熟的Object Detection的方法。

自動駕駛感知技術的實踐與探索 8

什麼是Object Detection?傳統的分類,只需要告訴你這個圖片或者pixel是什麼類型就可以了。對於Object Detection還要告訴圖片上物體的位置、大小以及位置所對應的框裡邊的分類,是什麼類型的物體。比較成熟的方法有:RCNN,Fast-RCNN,Faster-RCNN,YOLO,YOLO v2,YOLO v3,SSD等。

① Faster RCNN

自動駕駛感知技術的實踐與探索 9

其中Faster RCNN是一個非常經典的做法,它是一個兩階段的算法,首先把圖像通過卷積網絡生成feature map,在feature map基礎上預測出feature map上都有哪些region,region就相當於bounding box ,預測出bounding box後, 再通過分類網絡預測bounding box裡面的圖像,到底是什麼樣的類型。然後這兩個網絡會share之前的convolution network,所以在性能和效果上會達到一個比較好的tradeoff。同時,這裡可以看到region proposal network是整個網裡最關鍵的一個環節,它將整個網絡劃分成若干個grade,每個grade上的點生成固定的K個anchor boxes的候選,每個anchor box預測出它跟ground truth坐標的差距是多少,它是一個regression network。還有一個network是預測出物體到底是前景,還是背景,一個二分類網絡。所以將這兩個loss合併起來,當做整個學習的目標。所以,這也是為什麼把這種方法叫做anchor-based,這裡的anchor就是指region box。

② YOLO

自動駕駛感知技術的實踐與探索 10

再進一步,業界又提出,可以一步就完成region預測和它的分類預測。比如YOLO,You Look Only Once這種方法,每個點會候選出若干個bounding box和sliding window,每個sliding window還有若干個要預測的分類,一步就能預測出分類和它對應的region box ,讓你的性能得到很大的提升。所以,現在很多業界主流都會用這樣的方法。

③ 大物體檢測

自動駕駛感知技術的實踐與探索 11

我們可以看下,我們採用這些方法後,實際中遇到的一些很有趣的問題。如左圖,大家可以看到這是一個大車,是一個上下兩層裝載了很多小汽車的貨車,從後面看它是兩個小車,所以它到底是一個大車還是小車?這對於物體識別來說是一個很具有挑戰性的例子,但我們還是能很穩定的識別出來。在這裡,我們就借鑒了YOLO v3的思想,把feature map分成多個scale(級別),從小到大。將大物體在每個scale 的feature map都進行一次預測,這樣大物體在小scale上能很好的預測出來。同時,它也兼顧了在大feature map上去預測小的分類物體。

④ 小物體檢測

自動駕駛感知技術的實踐與探索 12

所以我們在這種小分類的物體上也能有比較好的效果。這是我們內部實驗的一個效果,可以看到這些錐形筒,大部分都是能識別出來的。但是,由於YOLO這種方法分類的個數是固定的,並且region也是固定的一個數目,所以在一些小物體上,一些不好分類的類別上,還是很容易出錯的,它並不是一個best search的方法。所以,有時候我們還會用一些特定的網絡來專門識別這種特定的小物體。

⑤ 樣本平衡

自動駕駛感知技術的實踐與探索 13

我們還會遇到一個問題,就是樣本平衡問題。像剛才Faster RCNN裡面,我們會遇到前景物體和背景物體樣本分佈差別很大,以及不同類別差別也很大。因為我們需要知道高速上行駛​​的到底是大車、小車,還是摩托車,對於不同類型的車,後續的策略可能是不一樣的。由於不同類別差別很大,且天然的在樣本上差別就很大,所以很難去平衡他它們。業界通常採用的方法,如Focal Loss會給這種比較難學的樣本,增加它的權重,通過α和γ來控制權重比例。另外我們也可以直接計算不同類別的分佈,然後用類別的分佈當做一個控制Loss的權重。簡單來講,分佈比較少的樣本權重就會大一點。

自動駕駛感知技術的實踐與探索 14

還有一個問題就是遇到這種不規則物體怎麼辦?比如圖片中的小孩,如果用bounding box,整個bounding box之內物體的分佈是很不規律的。因此業界提出了anchor free的方法,比如CenterNet,它的想法很簡單,只預測每個物體/目標的中心點是什麼就可以了。根據中心點和ground truth的中心點,計算它們之間的差距/距離。但是,ground truth中心點會按照高斯分佈來分佈出一個從中心點特徵更明顯,到周圍比較弱一些的ground truth分佈,再去跟預測點計算它的loss。可以看到這個形式其實很像剛才的Focal Loss,只不過這是一個計算點中心形式的Loss Function。同時,還會計算回歸的大小,看什麼樣範圍內的物體和ground truth匹配度更高一些。所以,在上圖中,對於不規則物體,如橋上橫著的貨車,這種長條形狀,我們也能夠識別的很好。

3. Lidar Detection

自動駕駛感知技術的實踐與探索 15

除了自動駕駛的”眼睛”之外,我們在”聽覺”方面(如:激光雷達)也有很多的應用。我們會用激光雷達做Object Detection,對於比較流行的方法,我們都會做嘗試,比如:PointNet,PointNet++,VoxelNet等。尤其是VoxelNet,它給你的空間做一個3D的劃分,劃分出若干個Voxel,在這基礎上做預測,它在性能和效果上都能達到比較好的折中。

自動駕駛感知技術的實踐與探索 16

除了物體檢測之外,激光雷達還有很重要一點,就是檢測地面。因為激光雷達原理是遇到物體就會返回信號,所以信號大部分是地面(ground),當我們拿到地面信號之後就可以(因為它比較有規律)直接用一些傳統方法來去做一個fitting,我們就可以fitting出平面,而且不見得是平面,它有可能是個曲面。比如圖中這種匝道上的上坡,我們還是比較好的能夠fitting出這個ground。地面預測出來之後,我們就能夠把它給排除掉,幫助後面的detection做更好的處理。反過來,當地面識別出來之後,我們也可以把Object去掉,通過ground來輔助車道線做一些更好的處理,就能知道車道線的高度和深度是多少。

4. 感知在自動駕駛重卡上的挑戰

自動駕駛感知技術的實踐與探索 17

剛才講了很多感知技術,在傳統自動駕駛上,會用到的一些方法。在我們的重卡自動駕駛中,還會有一些特殊的需求:

車速快。因為我們是在高速路上行駛,所以對我們的檢測速度有了更高的要求。

檢測距離需要更長。因為車速快,所以需要有更長的時間來防備出現一些危險的情況,這就需要更長的探測距離,保證有足夠的時間剎車。

最重要的就是安全第一。這對我們的算法和系統都提了非常高的要求(穩定性、準確性、覆蓋率)。

自動駕駛感知技術的實踐與探索 18

大家可以想像下,我們的機器學習技術可以解決所有問題麼?大家可以看到左圖是中國的高速,在中國的高速上,我們訓練出來的模型,你覺得有可能在美國的高速上直接使用麼?這看起來風險還是很大的,對不對?我們可以看到美國的基建跟中國比,還是落後很多的。所以說,這是機器學習的一個痛點,本質上講它是數據驅動的一個方法,在中國的數據上積累的一些結果,在其它地方直接用還是很難的。所以關鍵的一點是,我們要學到數據裡面的知識,或者它的方法,把這種方法泛化到別的場景上,才能適應各種場景。當然這還需要我們的AI技術走很長的路,在這之前,如果AI不知道怎樣學出這種方法,還是需要我們人來教它這種方法,所以在我們系統的實踐過程中,還會用一些人工的經驗。

自動駕駛感知技術的實踐與探索 19

再看一些例子,我們要處理的各種corner case:像這種陽光非常強烈,曝光的情況,這也是美國那邊的情況;然後是蘇州這邊,雨天的情況;還有在夜間當有強光或者是光線不足的情況,會有很多corner case。只依賴深度學習,還是很難解決這些長尾問題。

自動駕駛感知技術的實踐與探索 20

所以,怎麼改進穩定性問題?這裡有很多環節需要我們去改進,其中一個思路是從單幀過渡到多幀,更多的利用多幀歷史上的數據,去提高算法和系統的穩定性。像這樣的例子,我們在雨天攝像頭都已經沾上雨滴了,已經很難看清前面的路和車,尤其是中間的車道線已經很難看清。但是在這種若隱若無車道線上,如果用多幀,還是能找出一些規律來,所以這也是我們很重要的、依賴的一個方向。

5. 感知技術在量產化道路上的挑戰

自動駕駛感知技術的實踐與探索 21

大家可以現在腦海裡想一下,感知技術在量產道路上會遇到哪些挑戰?

① 成本

自動駕駛感知技術的實踐與探索 22

首先第一點是成本,因為我們要量產的話,首先要講究經濟效益,畢竟是做生意,需要盡量在低成本的設備上實現我們的自動駕駛。所以,我們需要選用低成本的計算設備,低成本的攝像頭,低成本的激光雷達等等。

一方面是為了經濟效益,另一方面也是為了符合車規,大家可以去網上搜一下,知道車規的標準是什麼樣的,車規會對我們設備的電流、電壓、功耗等等有非常嚴格的要求。

另外一點就是可靠性和安全性。對系統和算法的可靠性要求都是非常高的,尤其是在我們的系統上,不能跑著跑著,突然藍屏了。所以,一些我們可能覺得很穩定,或者是很常見的操作系統和開源的軟件,實際上是沒法直接去用的,需要做一些專門的定制。

② 性能

自動駕駛感知技術的實踐與探索 23

第二就是性能,我們在性能上除了會用一些特定的硬件,去做硬件加速。還包括軟件上的一些傳統方法,比如並行化這種優化,還有模型壓縮的一些方法等等。還有一個很有效的一點,就是做數值量化,這裡只是介紹一些我們的經驗,因為大家知道我們在處理浮點數據,對GPU和CPU而言,它的性能要求還是非常高的,但實際上從整個數據的分佈上來看,也不見得非得用這麼高精度來表示數據。所以我們常用的方法就是量化,量化簡單來做的話,可以做一個平均的量化,把一個0到100區間的數據,壓縮到0到10區間,平均分成十份就可以了,這是最簡的方法。但是,如果0到100區間中,這個數據的分佈不是平均分佈的話,這樣做就會存在信息損失。所以我們會用基於Entropy的方法做量化,我們會看哪些數據,比較集中在多個區間上的,還是哪些數據,它在區間上是分佈非常少的,這樣在不同區間上,我們就可以有不同的在新的空間上的粒度,然後信息的損失,我們可以用KL散度來計算出在老的區間上和新的區間上,它的熵的一個差值,去min、max差值來算出,這樣一個新的區間應該怎樣劃分。圖中是我們在數值量化上的一個應用,在我們的某個分割網絡上的實踐中,它能夠減少50%的inference時間,而且精度上,在我們內部測只有1%精度的損失。這只是系統優化方法中的一點,還有很多環節需要優化。

③ 可靠性

自動駕駛感知技術的實踐與探索 24

最後一點就是可靠性。剛才前面也介紹過,我們會有多個傳感器,多個攝像頭來提高它的冗餘。有多個傳感器之後,我們需要去想怎麼把它們一起用起來,所以這裡面我們還會有融合這樣一個過程。比如,我們在測試車輛上裝了前視的雙目攝像頭,還有後視的雙目攝像頭,只有當我們把多個傳感器的數據映射到同一個空間上,並且把它們做一個融合處理,我們才能真正的把多個傳感器的數據用起來。在這裡面會有KF based的傳統做法,也會有Model based的方法,受限於篇幅,這裡就不做過多的展開了。

本次分享就到這裡,謝謝大家。

作者介紹

王超,智加科技技術專家

本文來自 DataFunTalk

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247497564&idx=1&sn=2005a8363d80411b6e6a4825b7ba9e03&chksm=fbd74530cca0cc26db0642aafd80f89a5a27acd3837bbd9420f5903879480f3e5e39cf0e9a1a&scene=27#wechat_redirect