在車載感知技術和產品矩陣中,相較於雷射雷達,攝像頭傳感器和視覺技術因其低成本和較好的適用性成為所有公司重視的領域。馬斯克也希望特斯拉能夠創造出比人類眼睛更敏銳的「攝像頭眼睛」,以保證安全性和智能性。
雷鋒網旗下會員組織「AI投研邦」「大咖Live」第50講,紐勱科技計算機視覺研發總監成二康帶來關於《自動駕駛系統研發:詳解視覺感知模塊》的主題分享,圍繞自動駕駛的視覺感知、基於深度學習的目標檢測和圖像分割任務、紐勱科技如何以數據助力自動駕駛感知模塊研發三方面進行了介紹。
據雷鋒網(公眾號:雷鋒網)了解,紐勱科技計算機視覺研發總監成二康,早前於美國Temple University獲得計算機博士學位,師從凌海濱教授;期間曾在美國西門子任職,主要做計算機視覺和醫學圖像分析方面的工作;之後加入矽谷Broncus medical 公司,開發了超大規模通用機器學習庫,用於圖像分割、目標檢測等;2017年10月加入紐勱科技,負責視覺相關的研發工作。
以下是成二康的分享內容,雷鋒網新智駕在不改變原意的基礎上進行了整理和精編:
首先簡單介紹一下紐勱科技。紐勱科技於2016年底在美國矽谷成立,2017年初在上海設立總部公司,是一家專注於自動駕駛領域的科技公司。創始人CEO徐雷是前特斯拉 Autopolit vision 團隊早期成員,COO Justin是前特斯拉高級供應鏈經理。
2016年9月,紐勱科技獲得1000萬美元的天使輪融資;2019年4月獲得德賽西威的Pre-A輪戰略投資。6月份,紐勱科技發布了自動駕駛解決方案MAX1.0,向市場公開了基於公司自研的MaxOS的高速代駕、擁堵跟車、自主泊車三大功能。
今天的分享包括四個部分:首先簡單介紹紐勱科技視覺感知;第二部分是基於深度學習的目標檢測;重點是後面兩部分基於深度學習的車道線檢測和數據驅動的模塊迭代。
傳感器配置層面,目前紐勱科技傳感器配置以攝像頭為主,並結合毫米波雷達和超聲波雷達,包括覆蓋車身360度的8個攝像頭、4個主要為泊車服務的魚眼攝像頭。
現階段,紐勱科技進行的視覺模塊大概包含以下幾個方面:一是目標檢測;二是圖像分割,圖像分割目前主要用於車道線的分割或可行駛區域的分割;上述兩方面均以深度學習為主;目標跟蹤目前是基於多攝像頭的多目標跟蹤管理;世界模型是如何將目標檢測或者圖像分割出來的結果,比如車道線的結果映射到三維世界,為planning提供信息;另外一個是多傳感器融合,紐勱科技現階段採用的是視覺、毫米波和超聲波雷達之間的融合;在線標定,因為攝像頭每時每刻都可能發生變化,所以在線標定實時計算camera pose也是一個比較關鍵的模塊;另外一個是視覺slam,該模塊主要應用在地下停車場的建圖、在線定位等;還有一些比較基礎的模塊,比如ISP,因現在的視覺攝像頭要進圖首先要經過ISP,以解決不同光照下的情況,提供更高質量的圖片。
紐勱科技自研的深度學習平臺包括數據標註、海量數據的收集、針對自動駕駛感知環境的模型設計、模型訓練,和最後的模型嵌入式平臺部署。
此為紐勱科技多目標跟蹤管理的結果。這裡要解決的問題是,對每一輛障礙物車輛賦一個連續的ID,以便於後面與毫米波傳感器的融合。因為有了視覺和毫米波融合的信息,融合之後和真值更加接近。基於真值,可以通過其它傳感器拿到更精確的障礙物車距信息。
首先分享一些在目標檢測方面比較好的綜述。第一篇是2018年的一篇綜述,上面大概介紹了目標檢測在計算機視覺上的一些發展,比如2001年比較經典的Viola & Jones 的adaboost的目標檢測;一直發展到2008年的DPM,deformable part model的目標檢測;在2012年,Hilton的學生 Alex 在ImageNet上把圖像分類提升了很大,從而推動了基於深度學習的目標檢測方法的發展;比如2013年的OverFeat方法;後續比較有影響的是基於RCNN系列的Fast和Faster RCNN,乃至後面各種以深度學習為基礎的各種網絡。
另外,今年最新的一篇綜述由滴滴完成。上一篇綜述大概覆蓋300多篇文章,這篇綜述則包含的更多,大概有410多篇文章。從1996/1998年到2018年,大概20年間目標檢測相關的文章都包含在其中。這篇綜述在後面進行了細分,將目標檢測細分出one-stage和two-stage。其實後面還可以再細分,比如基於anchor-based和anchor-free的方法。從2001年Viola & Jones的目標檢測,到2008年的DPM,到後面一些基於深度學習的經典的綜述方法基本都涵蓋其中。
從這裡面看出,一些進行視覺工作的人會覺得三年前的文章就算老的文章,其實並不是的。可以從中看出,基於深度學習的目標檢測bbox的計算都是基於回歸的方法。Bounding box regression在2008年的DPM裡面提出,後面延申到Deep learning裡面,有很多概念都含在這篇文章中。比如multi-scale的概念,或者multiple reference都可以從以前的paper裡找到一些相關的想法。這裡的一個例子是bounding box regression的一些進展,最經典的是2008年DPM這篇文件,他提出了從bounding box到bounding box的回歸,後面形成了從feature到bounding box的回歸,目前主流的目標檢測都是沿用這個方法。
如果想訓練好一個模型,大家需要很多手工的、或者從樣本層面做一些工作。比如最常用的是一些困難樣本生成策略(hard sample mining),具體用到的有hard negative mining技術,這在最經典的機器學習時代已經大量運用。微軟訓練一個億量級的人臉檢測,也用到經典的bootstrap方法,都採用了困難樣本挖掘工作。最近經典的一篇 focal loss 通過新的損失函數(loss function)的設計,能夠完成困難樣本生成策略的工作。從這兩個例子中,我們可以看到,一些新的檢測方法都是回溯到一些經典的方法。
有了一個模型/算法之後,如何在晶片上進行部署?這其實是一個難點。這裡面我們總結了幾種常用的方法:比如由於計算資源的限制,通常會選用一些小的模型,像light-weighted model,。其中又有幾種選擇:比如卷積在整個網絡中佔的計算量比較大,Group conv技術可以使卷積計算量下降;另外是在mobilenetV1、V2系列中使用的技術,比如Depth-wise的可分離卷積;除此之外,還有後面衍生而來的基於shuffle 的V1、V2,這些都可以對已有的模型進行加速。
另外我們可以選擇一些Bottle-neck設計,比如可以從resnet系列選擇18、34、50或者101。上述是人工設計的一些主幹網絡,現在一些新的研究熱點則轉向如何通過網絡自動搜索一些小的網絡。比如今年穀歌有一篇比較好的文章,研究如何搜索一個比較小的網絡能夠上線。
除了選擇一些比較輕量級的網絡,另外一個選擇是進行模型的剪枝,比如模型壓縮。2017年英偉達在LCLR上有一篇文章,講述了關於模型剪枝方面的工作。比如可以拋棄某些層,剪掉參數比較小的一些層。另外可以做知識蒸餾,Hilton在2015年提出的一種概念,即如果我們從一個大的網絡裡面能夠學習一些知識,如何把知識傳到一些小的網絡中。知識蒸餾最初在分類問題裡面得到應用,後面也推廣到分割任務上面。NIPS2017 NEC也有嘗試把知識蒸餾的方式推廣到目標檢測中。如果在大的網絡上面學習比較好,可以把這些知識蒸餾到比較小的網絡裡面,方便上線。
另外一個層面與計算平臺相關,如果一個計算平臺支持半浮點型或者INT8再或者binary的網絡,其本身就可以降低複雜度。這方面目前主流的一些框架,比如tensorflow,MxNet,或者基於英偉達平臺上面的tensorRT加速都支持半浮點,或者整形模型。當然上線可能有多方面的考慮,也有其他更好的方法,比如結合其中幾個方法能夠使一個模型上線。
上述文章主要討論關於目標檢測的內容。最新基於anchor-free的目標檢測方法在最近幾年比較流行。比如從最開始的Densebox,到最近一篇今年百度關於Dubox的文章,即為了解決Densebox在小尺度目標漏檢的問題。
比如在一個feature map上面,一些小目標可能會被漏掉,那麼可以在第二個feature map上面進行refine,這是一個很好的思路。
另外一篇是我們在視覺組在每周paper reading活動中分享的一篇結合anchor-based和anchor-free的CVPR19年的文章。該文章講述通過結合anchor-based和anchor-free兩種方法從而整體提升目標檢測精度。
如果想做一個比較實用的基於車道線的檢測算法,對魯棒性或者複雜場景的支持要求很高。這裡介紹主流的方法和一些比較新穎的方法。
深度學習方法逐漸在分割任務裡面佔主流,目前大多車道線算法,大都把車道線當作一個分割問題,然後加一個post-processing算法。後面有一些新的方法,或通過end-to-end的方式,將車道線步驟變得更簡潔。類似於目標檢測。現在經典的目標檢測方法都不需要複雜的post-processing的方法。
左邊是一個FCN。FCN是給一個輸入圖像,輸出一個dense的map;可以和原圖一樣大,也可以和原圖比縮小1/4或1/8,代表一個dense的prediction。比如這裡可以預測一個像素點是車道線的概率。
右邊簡單介紹車道線分割和後處理結果,上面是實際輸入到網絡裡面的圖,下面是一張實際輸入圖經過網絡之後的一個probability map。每個點代表了這個點屬於車道線的概率。右面經過一些post processing,把車道線提取出來,這裡面只是展示了把它當做一個binary的分割問題,我們可以對車道線做更複雜的一些分割。那麼最重要的事如何做post-processing。這展示的是視野比較清晰的一張圖,在實際過程中有可能遇到各種複雜的場景。比如說網絡輸出的概率圖有可能質量不是太高,如何加上複雜的後處理,能夠把車道線提取出來也是一個比較難的挑戰。
這是商湯在AAAI 2018上面的一篇文章,個人覺得有兩大創新。第一個是,因為車道線是有很強的局部先驗知識,或者說它有很強的context信息,如何把這些context的信息結合起來有助於車道線的提升。比如說我們在遇到這些虛線的時候,虛線在視覺上是沒有appearance,但是通過它前面和後面的實線,可以把這些context信息結合起來,即可把車道線的一些context信息囊括得更好。這篇文章裡面用到得一個關鍵點是,可以通過分層,把每一行上面的信息傳遞到下一行,或者每一列的信息傳遞到左邊或者右邊,同時提升網絡對context信息的抽象,提升預測結果。但是有個缺點就是計算量會增大。
另外一個創新點是開源了一個比較大的數據集。對一個車道線數據集進行了很好的分類,比如說有白天/晚上,有擁堵跟車或者沒有車道線的情況,這些場景都做了細分。在實際過程中,數據集本身對算法的提升也有很大的作用。
障礙物檢測的目標測距或者車道線如何從二維世界到三維世界,一個比較關鍵的部分是要對camera pose進行實時估計。實時估計有很多種方法,但是實際情況中對camera pose的估計要求比較高,比如魯棒性要求比較高。使用一些視覺的特徵,例如在高速場景下,可以用到一些車道線相關信息;在城市場景下,可以用到一些建築的信息,或者交通信號燈的信息。或者運行一個視覺slam,slam就是要解連續兩幀之間camera pose是怎麼變化的。
另外的一些信息來源可以從其他傳感器得到,比如從IMU或者車子的裡程獲得;如果有雷射雷達,可以通過雷射雷達拿到雷射雷達的姿勢,再從雷射雷達轉到camera pose,就可以知道攝像頭每時每刻是如何運動的,這些大概都是非深度學習的一些方法。
隨著深度學習在計算機視覺作用越來越大,大家也在嘗試camera pose估計能不能用深度學習的方法來實現。第一個是supervised,如果我們有camera pose的groundtruth之後,就可以通過supervised的方式去解。另外一種方式是unsupervised,主要原理就是,一個camera發生變換之後,一個圖像在T時刻經過wrap之後,可以和T+1時刻的圖像做pixel wise的差,從而使camera pose算得更準。
對車道線來說,能不能從一張圖片直接得到車道線,而不去做camera pose估計或者很重的post-processing?這裡面推薦的一個方法,比如3D LaneNet上面提出的anchor-based的方法。這裡的一個假設是,車道線如果從原圖上面看的話,因為它是經過projection得來的,車道線在近端比較寬,在遠端比較窄,每條車道線appearance是不像的。我們如果轉成俯視圖,大多數車道線都是平行的,appearance比較像。這裡一個比較創新的地方是,我們可以把目標檢測裡面的anchor-based方法推到車道線提取中來。這裡是supervised計算camera pose的方法,因其需要從原圖轉到俯視圖,所以需要相機的外參,但這篇文章是通過supervised的方式去做這件事情的,因為它有groundtruth。
上一個網絡是從image view正常的成像圖方面來做,第二個網絡是可以從俯視圖裡面最終輸出三維的車道線信息,這個是anchor的方法,anchor方法是在俯視圖裡面進行的。俯視圖可以假想為一個地面,每一個列都是一個anchor,每個anchor都可能會映射一個車道線;比如這個列對應一個車道線,那麼就可以預測每一行的橫坐標相對於這一列的橫坐標,如果有這個信息的話,即可以把車道線通過anchor的方式預測出來。比如說這裡面黃色的橫向偏移是指每一條車道線相對於anchor所代表的列的橫向偏移,所以有了每一列,其實我們只需要算每一個sample的點與這個sample點的橫坐標的偏移就可以把車道線算出來,所以不需要經過一些很重的後處理,這是一種思路。
這是其在模擬數據上面取得的結果,但是這篇文章因為我們從實際中去獲得每一幀的camera pose是很難的,所以這篇文章主要是給大家提供一些想法。通過anchor-based的方法就可以直接得到車道線。還有一個end-to-end裡面更直接的一個方法,不需要anchor。
剛才介紹的這幾種方式都是拋棄了post-processing的過程,從而使深度學習能夠直接獲得車道線,類似於目標檢測中我們直接獲得最終結果的一些方式。
首先介紹一些自動駕駛公開數據集,比如說最經典的從KITTI的數據到後面用於分割的CityScapes或者NuTonomy公司提出的NuScenes數據集,或者百度開源出來的阿波羅Scape,還有伯克利開源的BDD。今年CVPR 19上 waymo,、Argo和Lyft分別開放了一些自動駕駛相關的數據集。
截止2017年,Kitti是被引用最多的數據集。KITTI的一個傳感器的配置、數據集的分類,比如說障礙物的分類,或者一張照片中有多少個種類的一些分布的統計,也有助於我們自己構建數據集的時候去統計我們自己的數據。
百度也開放了包括雷射、數據和圖像數據的自動駕駛公開數據集。NuScenes開源的一個比較大的公開數據集,同樣包括了攝像頭、雷射雷達和毫米波雷達等信息。這些細分數據對自動駕駛公司自己收集數據提供很大的參考信息。
伯克利也推出100K數據,其中包含了目標檢測和圖像分割,主要覆蓋紐約、伯克利、三藩和灣區四個城市的數據採集。
有了這麼多數據之後,我們要了解的是大規模數據之後,一個模型它基本上是Garbage in Garbage out,如果扔進去的一些無用的信息,那麼模型很難學到一些有用的信息。
這是交流的一個重點,就是視覺模型上線是一個閉環迭代過程,涵蓋數據採集、數據清洗、數據標註、模型訓練、模型測試,最終才可上線。
數據集中難免出現一些錯誤或丟失。李飛飛的學生 andrej Karpathy 在一個演講上指出,一個phd學生可能95%的時間在學校設計算法,因為它可以使用一些公開的數據集;可能這5%的時間就是下載數據,做一些評測。那麼他到了特斯拉領導自動駕駛小組,75%時間專注在數據。這說明數據是非常重要的一環。這一點我也非常認同。
我們知道在圖像數據中通過視角、光照等變化都可以對自動駕駛算法造成影響。
在自動駕駛數據中,兩個比較簡單的場景,比如說視野開闊、車少、車道線有比較清楚的樣例。但在實際場景中有很多更複雜場景,比如夜間虛線的車道線場景,夜間光線比較弱,那麼識別這些車道線其實是很難的,即使去做標註也很難去準確地把車道線給標出來。另外是擁堵跟車時候拍到的物體、比較近距離的障礙物,這對車道線、障礙物標註或者算法設計都會有一些挑戰。
另一個極端例子是「加塞」,如果一輛車從旁邊車道「加塞」,那麼它會擋住視野中的車道線,這對車道線標註、訓練或者上線都會帶來挑戰。有時候一輛大車會完全擋住所有的視線,這對車道線的算法會帶來很大的挑戰。
從中可以看到,自動駕駛如何高效地收集這些有效數據其實是很難的。而且這些數據大量都是不均衡的。如果搜集這些數據場景,比如道路分叉,甚至是在高速上面或者環線上面道路分叉佔整個數據量是其實很少的,覆蓋更複雜的場景是數據方面的一個挑戰。
當場景定義結束後, 有效數據的獲得也很重要,最後是模型的迭代。英特爾CEO曾表示,自動駕駛數據量很大,如果要收集所有信息的話,大概4000 GB/天,但是我們並不需要每時每刻都把所有信息收集起來。
數據方面要考慮的四大因素:第一個是數據獲取,即如何獲取一些最有效、最關鍵信息;第二個數據存儲;第三個是數據管理,即如何從中間拿到最有效信息、如何管理這些信息,使各個組都能夠快速或者便捷的獲取這些信息進行算法開發;還有一個最關鍵是數據標註。
那麼如何從數據獲取到數據標註?數據獲取要平衡三個因素,第一個是包含場景,比如要包含各種天氣、各種城市或者高速場景、各種車道線的細分類型直線/虛線等各種場景。第二個因素,要考慮推向市場的功能的緊急程度,比如模塊迭代,因從算法開發第一天就支持所有各種複雜場景並不現實,所以需要根據推向市場功能的緊急程度來定義要獲取什麼數據。第三個是根據現有資源,比如現有的資源從算法設計或者人員都有可能影響數據的獲取。
數據存儲有幾個方面需要考慮:第一個是需要本地存儲還是雲端存儲,我們能如何更高效的利用雲端或者本地這些架構。另一個是如何存儲採集車上的數據,因為採集車運行一天或者連續跑很長時間,數據量是非常大的,很多時間花費在如何從產業車上面把數據拷走。另外一個是數據安全如何保證。再是數據管理,多與存儲相關。比如原來數據存在什麼地方,或者需要存儲哪些數據,如何使每個人都能便捷地讀取這些數據也有利於整個開發效率的提升。
關於數據標註,上面介紹了幾大公開數據集,每一個都有自己標註的一些定義,所以我們需要根據自己算法設計或者功能實現定義合理的標準。第二是要考慮量產經濟因素,比如說我們要和外面第三方合作,也要考慮如何使這些標定義的標準能夠使第三方能夠快速接受。最後是確保達到最佳標準,因為標註即使是通過人工篩選、人工驗證,還是有很多噪聲涵蓋其中,所以如何提升標註的準確性,也是很重要的一個因素。
總結一下,視覺方案是一個閉環,從數據的採集到數據清洗,到拿到清洗有效數據之後的數據標註。從標註團隊拿到標準數據之後,進行了模型訓練或者內部評測,經過模型測試之後,如果達到要求模型即可上線。
有整個閉環的流程之後,即可支持模型的迭代。通過模型迭代不斷解決上一個版本遇到問題,一個模塊或者視覺模塊迭代的快慢往往取決於這幾個步驟,比如數據採集或者根據某個版本發現這些問題進行的數據清洗、更準確的數據標註、模型內部的測試和上線,如果能形成一個快速的閉環,那麼開發節奏會高效很多。
紐
雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。