
分享嘉賓:王超 智加科技 技術專家
編輯整理:Hoh Xil
内容來源:DataFunTalk
出品平台:智加科技、DataFun
注:歡迎轉載,轉載請留言。
導讀:自動駕駛中的感覺技術如同駕駛員的"眼睛"和"耳朵",在高速重卡的場景中,感覺技術将面臨哪些挑戰?在量産化道路中,如何讓感覺技術與産品相結合去看清和了解足夠的場景,本文将分享我們的一些心得體驗。
以下Enjoy~
大家好,很高興今天給大家分享智加科技在感覺技術上的實踐和探索,在前面的環節,江博士已經介紹了很多深度學習在智加自動駕駛中的很多應用,這裡我特地給大家多介紹一些感覺方面,深度學習(還包括其它的一些傳統方法)能夠落地的一些方法和實踐,尤其是我們在實踐過程中遇到的一些技術問題和一些有意思的case,以及我們量産過程中遇到的一些問題,都會跟大家一起做一些分享,大家也可以留言跟我們讨論。
這裡,感覺的定義就不多介紹了,感覺是我們自動駕駛的"眼睛"和"耳朵",是自動駕駛資訊擷取的第一步,是以感覺是非常基礎和關鍵的一個環節。這需要在我們的自動駕駛車輛上布滿傳感器,這樣才能360°無死角的知道周邊的各種情況,而且不止包括我們的"眼睛"Camera,還包括我們的"耳朵"雷射雷達和毫米波雷達等非視覺傳感器,這些在我們的測試車輛上都是必備的,我們可以從上圖中看到,我們的車輛上布滿了傳感器,車前、車尾、車頂都會存在傳感器。
自動駕駛車輛除了能看到東西之外,關鍵還是需要了解它。隻有了解它之後獲得的資訊,才對我們後續的處理有意義,是以需要識别,那麼,對于自動駕駛而言,需要識别什麼?顯而易見,第一個是車道線,我們知道車道線才能知道怎麼開;然後我們還需要知道紅綠燈,以及非常重要一點,就是動态障礙物(如前面有什麼車輛),這是非常重要的;還有就是行人(對于城區的自動駕駛是非常關鍵的)。對于智加的重卡自動駕駛中,最重要的還是車道線和動态障礙物,是以這兩方面會重點進行介紹。
1. 車道線檢測
① 傳統方法到深度學習方法
首先是車道線檢測。從圖像來看,車道線相對而言比較有規律,是以用一些傳統的視覺算法就能取得不錯的效果,比如對輸入的資料做變換之後,做邊緣檢測(Edge Detection)和霍夫變換(Hough Transform)就能夠識别出圖像上的這些很像車道線的形狀了。其中邊緣檢測是非常關鍵的一環,根據像素和像素之間的內插補點做一個濾波,找到差異點的線段,這就是傳統的方法。但是傳統方法會遇到瓶頸,因為要處理的場景非常多:
不同的光線;不同的車道線形狀;車道線本身不同程度的破損;或者是它的一些噪音,尤其是一些障礙物的遮擋,如大量車輛遮擋的情況下,用傳統方法很快就會遇到瓶頸,調參數是調不過來的。
是以,我們采用深度學習的方法來解決。
② 基于深度學習的方法
對于深度學習,業界已經有很多成熟的方法。這裡很重要的就是圖像分割,我們會給圖像上每一個pixel(像素)都去預測它到底是什麼樣的分類,然後在打标的時候,也會标注圖像上到底哪些是車道線,哪些是障礙物,哪些是天空,哪些是樹木,等不同類型的标簽。我們通過這樣一個卷積的網絡,類似Encoder-Decoder架構,先去做encoding到feature map,然後再deconvolution到一個大的feature map,然後再預測每個pixel跟ground truth之間分類的loss,比如用Softmax或者cross entropy都是可以的,最後我們就能學習出每個pixel是什麼分類。但是光知道圖像的分類可能還不夠。
我們還需要進一步知道,到底圖像上有幾條車道線,哪些車道線是屬于一條車道的?這裡簡單介紹下,我們會按照圖中的做法,先把圖像做encoding之後會分成兩個branch,一個是Embedding branch,用來生成每個pixel的向量,這個向量可以告訴你它跟不同執行個體距離的分布,另外一個是Segmentation branch傳統的分類網絡。Embedding branch 向量計算出來之後和ground truth點的向量之間計算距離,這樣就可以知道跟ground truth點之間有多近,和非ground truth點之間有多遠,用這個距離當做loss,最後再結合分類的loss,得出最終的結果。
剛剛說的這些方法其實都是基于convolution這樣傳統的方法來去做的,它有一個局限,我們知道CNN是對整個圖檔都去做一次卷積,輸出的feature map反映的還是整個圖檔的特性。但是對于車道線而言,它其實是很有規律的,就是近處看到一個車道線,在遠處還是同一個車道線,是一個很有複制性的pattern,是以業界提出了一個很好的方法,叫Spatial CNN,把整個空間按照一個sliding window結合相鄰window上一次的輸出,疊加到新的sliding window輸入上,相當于在圖像上的RNN,隻不過它是在一個單層的圖像上來做的。通過這種方法就能學習出空間上的pattern,得到更好的車道線精度,對于我們來說是非常有用的。
2. 障礙物檢測
我們再來看下Object Detection,對于障礙物而言,它的pattern不像車道線那樣有規律,而且非常的離散,是以單純的用分割網絡是很難解決的。是以我們還會用到現在業界比較成熟的Object Detection的方法。
什麼是Object Detection?傳統的分類,隻需要告訴你這個圖檔或者pixel是什麼類型就可以了。對于Object Detection還要告訴圖檔上物體的位置、大小以及位置所對應的框裡邊的分類,是什麼類型的物體。比較成熟的方法有:RCNN,Fast-RCNN,Faster-RCNN,YOLO,YOLO v2,YOLO v3,SSD等。
① Faster RCNN
其中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
再進一步,業界又提出,可以一步就完成region預測和它的分類預測。比如YOLO,You Look Only Once這種方法,每個點會候選出若幹個bounding box和sliding window,每個sliding window還有若幹個要預測的分類,一步就能預測出分類和它對應的region box,讓你的性能得到很大的提升。是以,現在很多業界主流都會用這樣的方法。
③ 大物體檢測
我們可以看下,我們采用這些方法後,實際中遇到的一些很有趣的問題。如左圖,大家可以看到這是一個大車,是一個上下兩層裝載了很多小汽車的貨車,從後面看它是兩個小車,是以它到底是一個大車還是小車?這對于物體識别來說是一個很具有挑戰性的例子,但我們還是能很穩定的識别出來。在這裡,我們就借鑒了YOLO v3的思想,把feature map分成多個scale(級别),從小到大。将大物體在每個scale 的feature map都進行一次預測,這樣大物體在小scale上能很好的預測出來。同時,它也兼顧了在大feature map上去預測小的分類物體。
④ 小物體檢測
是以我們在這種小分類的物體上也能有比較好的效果。這是我們内部實驗的一個效果,可以看到這些錐形筒,大部分都是能識别出來的。但是,由于YOLO這種方法分類的個數是固定的,并且region也是固定的一個數目,是以在一些小物體上,一些不好分類的類别上,還是很容易出錯的,它并不是一個best search的方法。是以,有時候我們還會用一些特定的網絡來專門識别這種特定的小物體。
⑤ 樣本平衡
我們還會遇到一個問題,就是樣本平衡問題。像剛才Faster RCNN裡面,我們會遇到前景物體和背景物體樣本分布差别很大,以及不同類别差别也很大。因為我們需要知道高速上行駛的到底是大車、小車,還是機車,對于不同類型的車,後續的政策可能是不一樣的。由于不同類别差别很大,且天然的在樣本上差别就很大,是以很難去平衡他它們。業界通常采用的方法,如Focal Loss會給這種比較難學的樣本,增加它的權重,通過α和γ來控制權重比例。另外我們也可以直接計算不同類别的分布,然後用類别的分布當做一個控制Loss的權重。簡單來講,分布比較少的樣本權重就會大一點。
還有一個問題就是遇到這種不規則物體怎麼辦?比如圖檔中的小孩,如果用bounding box,整個bounding box之内物體的分布是很不規律的。是以業界提出了anchor free的方法,比如CenterNet,它的想法很簡單,隻預測每個物體/目标的中心點是什麼就可以了。根據中心點和ground truth的中心點,計算它們之間的差距/距離。但是,ground truth中心點會按照高斯分布來分布出一個從中心點特征更明顯,到周圍比較弱一些的ground truth分布,再去跟預測點計算它的loss。可以看到這個形式其實很像剛才的Focal Loss,隻不過這是一個計算點中心形式的Loss Function。同時,還會計算回歸的大小,看什麼樣範圍内的物體和ground truth比對度更高一些。是以,在上圖中,對于不規則物體,如橋上橫着的貨車,這種長條形狀,我們也能夠識别的很好。
3. Lidar Detection
除了自動駕駛的"眼睛"之外,我們在"聽覺"方面(如:雷射雷達)也有很多的應用。我們會用雷射雷達做Object Detection,對于比較流行的方法,我們都會做嘗試,比如:PointNet,PointNet++,VoxelNet等。尤其是VoxelNet,它給你的空間做一個3D的劃分,劃分出若幹個Voxel,在這基礎上做預測,它在性能和效果上都能達到比較好的折中。
除了物體檢測之外,雷射雷達還有很重要一點,就是檢測地面。因為雷射雷達原理是遇到物體就會傳回信号,是以信号大部分是地面(ground),當我們拿到地面信号之後就可以(因為它比較有規律)直接用一些傳統方法來去做一個fitting,我們就可以fitting出平面,而且不見得是平面,它有可能是個曲面。比如圖中這種匝道上的上坡,我們還是比較好的能夠fitting出這個ground。地面預測出來之後,我們就能夠把它給排除掉,幫助後面的detection做更好的處理。反過來,當地面識别出來之後,我們也可以把Object去掉,通過ground來輔助車道線做一些更好的處理,就能知道車道線的高度和深度是多少。
4. 感覺在自動駕駛重卡上的挑戰
剛才講了很多感覺技術,在傳統自動駕駛上,會用到的一些方法。在我們的重卡自動駕駛中,還會有一些特殊的需求:
車速快。因為我們是在高速路上行駛,是以對我們的檢測速度有了更高的要求。
檢測距離需要更長。因為車速快,是以需要有更長的時間來防備出現一些危險的情況,這就需要更長的探測距離,保證有足夠的時間刹車。
最重要的就是安全第一。這對我們的算法和系統都提了非常高的要求(穩定性、準确性、覆寫率)。
大家可以想像下,我們的機器學習技術可以解決所有問題麼?大家可以看到左圖是中國的高速,在中國的高速上,我們訓練出來的模型,你覺得有可能在美國的高速上直接使用麼?這看起來風險還是很大的,對不對?我們可以看到美國的基建跟中國比,還是落後很多的。是以說,這是機器學習的一個痛點,本質上講它是資料驅動的一個方法,在中國的資料上積累的一些結果,在其它地方直接用還是很難的。是以關鍵的一點是,我們要學到資料裡面的知識,或者它的方法,把這種方法泛化到别的場景上,才能适應各種場景。當然這還需要我們的AI技術走很長的路,在這之前,如果AI不知道怎樣學出這種方法,還是需要我們人來教它這種方法,是以在我們系統的實踐過程中,還會用一些人工的經驗。
再看一些例子,我們要處理的各種corner case:像這種陽光非常強烈,曝光的情況,這也是美國那邊的情況;然後是蘇州這邊,雨天的情況;還有在夜間當有強光或者是光線不足的情況,會有很多corner case。隻依賴深度學習,還是很難解決這些長尾問題。
是以,怎麼改進穩定性問題?這裡有很多環節需要我們去改進,其中一個思路是從單幀過渡到多幀,更多的利用多幀曆史上的資料,去提高算法和系統的穩定性。像這樣的例子,我們在雨天攝像頭都已經沾上雨滴了,已經很難看清前面的路和車,尤其是中間的車道線已經很難看清。但是在這種若隐若無車道線上,如果用多幀,還是能找出一些規律來,是以這也是我們很重要的、依賴的一個方向。
5. 感覺技術在量産化道路上的挑戰
大家可以現在腦海裡想一下,感覺技術在量産道路上會遇到哪些挑戰?
① 成本
首先第一點是成本,因為我們要量産的話,首先要講究經濟效益,畢竟是做生意,需要盡量在低成本的裝置上實作我們的自動駕駛。是以,我們需要選用低成本的計算裝置,低成本的攝像頭,低成本的雷射雷達等等。
一方面是為了經濟效益,另一方面也是為了符合車規,大家可以去網上搜一下,知道車規的标準是什麼樣的,車規會對我們裝置的電流、電壓、功耗等等有非常嚴格的要求。
另外一點就是可靠性和安全性。對系統和算法的可靠性要求都是非常高的,尤其是在我們的系統上,不能跑着跑着,突然藍屏了。是以,一些我們可能覺得很穩定,或者是很常見的作業系統和開源的軟體,實際上是沒法直接去用的,需要做一些專門的定制。
② 性能
第二就是性能,我們在性能上除了會用一些特定的硬體,去做硬體加速。還包括軟體上的一些傳統方法,比如并行化這種優化,還有模型壓縮的一些方法等等。還有一個很有效的一點,就是做數值量化,這裡隻是介紹一些我們的經驗,因為大家知道我們在處理浮點資料,對GPU和CPU而言,它的性能要求還是非常高的,但實際上從整個資料的分布上來看,也不見得非得用這麼高精度來表示資料。是以我們常用的方法就是量化,量化簡單來做的話,可以做一個平均的量化,把一個0到100區間的資料,壓縮到0到10區間,平均分成十份就可以了,這是最簡的方法。但是,如果0到100區間中,這個資料的分布不是平均分布的話,這樣做就會存在資訊損失。是以我們會用基于Entropy的方法做量化,我們會看哪些資料,比較集中在多個區間上的,還是哪些資料,它在區間上是分布非常少的,這樣在不同區間上,我們就可以有不同的在新的空間上的粒度,然後資訊的損失,我們可以用K-L散度來計算出在老的區間上和新的區間上,它的熵的一個內插補點,去min、max內插補點來算出,這樣一個新的區間應該怎樣劃分。圖中是我們在數值量化上的一個應用,在我們的某個分割網絡上的實踐中,它能夠減少50%的inference時間,而且精度上,在我們内部測隻有1%精度的損失。這隻是系統優化方法中的一點,還有很多環節需要優化。
③ 可靠性
最後一點就是可靠性。剛才前面也介紹過,我們會有多個傳感器,多個攝像頭來提高它的備援。有多個傳感器之後,我們需要去想怎麼把它們一起用起來,是以這裡面我們還會有融合這樣一個過程。比如,我們在測試車輛上裝了前視的雙目攝像頭,還有後視的雙目攝像頭,隻有當我們把多個傳感器的資料映射到同一個空間上,并且把它們做一個融合處理,我們才能真正的把多個傳感器的資料用起來。在這裡面會有KF based的傳統做法,也會有Model based的方法,受限于篇幅,這裡就不做過多的展開了。
本次分享就到這裡,謝謝大家。
歡迎加入 DataFunTalk 自動駕駛交流群,跟同行零距離交流。如想進群,請加逃課兒同學的微信 ( 微信号:DataFunTalker ),回複:自動駕駛,逃課兒會自動拉你進群。
分享嘉賓
▬
王超
智加科技 | 技術專家
——END——