如何理解自動(dòng)駕駛,SLAM,BEV,訓(xùn)練數(shù)據(jù)源常見術(shù)語?(1)
Simultaneous Localization and Mapping(SLAM):并發(fā)定位與地圖測(cè)繪,相對(duì)于BEV的另外一種感知技術(shù)。Perception:感知,SLAM和BEV在AD領(lǐng)域里都是協(xié)助控制系統(tǒng)了解車輛周圍狀況的感知技術(shù):知道自己在哪,有哪些障礙物,障礙物在自己的什么方位,距離多遠(yuǎn),哪些障礙物是靜態(tài)的那些是移動(dòng)的,等等相關(guān)信息,便于隨后做出駕駛決策。SLAM VS BEV:SLAM主要通過各種傳感器掃描周圍空間的物體結(jié)構(gòu),以3維數(shù)據(jù)來描述這些信息。BEV同樣通過傳感器掃描獲知周邊狀況,主要以2維數(shù)據(jù)來描述這些信息。從應(yīng)用范圍來講,目前SLAM更為廣闊,在AD火起來之前主要應(yīng)用在VR/AR等領(lǐng)域,BEV主要集中在AD行業(yè)里。從技術(shù)實(shí)現(xiàn)來看,SLAM偏向于傳統(tǒng)數(shù)學(xué)工具,包括各種幾何/概率論/圖論/群論相關(guān)的軟件包,而BEV基本上清一色的基于深度神經(jīng)網(wǎng)絡(luò)DNN。兩者最好不要對(duì)立著看,很多情況下可以互補(bǔ)。以下將側(cè)重于BEV的基礎(chǔ)介紹。SLAM和BEV最基礎(chǔ)和核心的傳感器就是相機(jī)(Camera),所以兩者在計(jì)算過程中有大量的算力都被消耗在了圖像中信息提取/識(shí)別和變換計(jì)算。SLAM傾向于識(shí)別圖像中的特征(Feature)點(diǎn),屬于特征信息里的低級(jí)信息,通過計(jì)算這些特征點(diǎn)在不同圖像幀上的位置來獲取場(chǎng)景結(jié)構(gòu)以及相機(jī)自身的位姿(Position and Pose)。而BEV傾向于識(shí)別車輛/道路/行人/障礙物等等高級(jí)特征信息,這些是卷積網(wǎng)CNN和Transformer擅長的。相機(jī)有兩個(gè)最基礎(chǔ)的數(shù)據(jù):內(nèi)參(Instrinsics)和外參(Extrinsics),內(nèi)參主要描述的是相機(jī)的CCD/CMOS感光片尺寸/分辨率以及光學(xué)鏡頭的系數(shù),外參主要描述的是相機(jī)在世界坐標(biāo)系下的擺放位置和朝向角度。其中內(nèi)參的常見矩陣是:??0??0????001]
其中fx和fy分別表示光學(xué)鏡頭的橫向/縱向焦距長度(Focus),正常情況下焦距是不分橫縱向的,但因?yàn)镃CD/CMOS感光片上的像素單元不夠正,如果這個(gè)像素是絕對(duì)的正方形,那么fx = fy,實(shí)際上很難做到,有微小的差異,導(dǎo)致光線經(jīng)過鏡頭投射到感光片上后,橫縱坐標(biāo)在單位距離上出現(xiàn)不等距的問題,所以相機(jī)模塊的廠家會(huì)測(cè)量這個(gè)差異并給出fx和fy來,當(dāng)然開發(fā)者也可以利用標(biāo)定(calibration)過程來測(cè)量這兩個(gè)值。
圖1
圖2另外,在傳統(tǒng)的光學(xué)領(lǐng)域里,fx和fy的默認(rèn)單位是毫米:mm,但在這個(gè)領(lǐng)域默認(rèn)單位是像素:Pixel,導(dǎo)致很多有攝影經(jīng)驗(yàn)的人看到fx和fy的值都挺納悶,特別大,動(dòng)不動(dòng)就是大幾千,這數(shù)值都遠(yuǎn)超業(yè)余天文望遠(yuǎn)鏡了。為什么這里用像素?我們?cè)囍ㄟ^內(nèi)參計(jì)算一下相機(jī)的FOV(Field of View,視場(chǎng)大小,通常以角度為單位)就明白了:
圖3
這里fy是縱向焦距,h是照片高度。因?yàn)閔的單位是像素,所以fy也必須是像素,這樣才好便于計(jì)算機(jī)處理,所以fx和fy的單位就統(tǒng)一成了像素。其實(shí)都不用到計(jì)算機(jī)這步,CCD/CMOS感光片一般是要集成另外一塊芯片ISP(Image Signal Processor)的,這塊芯片內(nèi)部就要把感光數(shù)據(jù)轉(zhuǎn)成數(shù)字化的圖片,這里就可以用像素單位了。內(nèi)參除了這個(gè)矩陣外還有一套畸變(Distortion)系數(shù)K,這個(gè)東西不詳細(xì)說了,正常的鏡頭成像后都是居中位置的變形小,四周變形大,一般通過標(biāo)定(Calibration)獲得這個(gè)參數(shù)后,對(duì)照片做反畸變處理,恢復(fù)出一個(gè)相對(duì)“正?!钡恼掌LAM算法里很強(qiáng)調(diào)這個(gè)反畸變的重要性,因?yàn)樘卣鼽c(diǎn)在照片上的絕對(duì)位置直接關(guān)系到了定位和建圖的準(zhǔn)確性,而大部分的BEV代碼里看不到這個(gè)反畸變處理,一方面是BEV注重物體級(jí)別的高級(jí)特征,像素級(jí)別的輕微偏移影響不大,另一方面是很多BEV項(xiàng)目都是為了寫論文,采用了類似nuScenes/Argoverse這類訓(xùn)練數(shù)據(jù),這些數(shù)據(jù)的畸變比較小而已,一旦你在自己的項(xiàng)目里用了奇怪的鏡頭還是老老實(shí)實(shí)得做反畸變預(yù)處理。
圖4外參就簡單多了,一個(gè)偏移(Transform)系數(shù)加一個(gè)旋轉(zhuǎn)(Rotation)系數(shù)。
3維空間里表述旋轉(zhuǎn)的計(jì)算方式常見的有2種:矩陣(Matrix)和四元數(shù)(Quaternion),為了防止矩陣方式存在萬向節(jié)死鎖(Gimbal Lock)問題,通常采用四元數(shù)來計(jì)算旋轉(zhuǎn)。但在AD領(lǐng)域里很少這么干,因?yàn)橄鄼C(jī)是固定在車子上,只有垂直于地面的軸(一般是Z軸)才會(huì)發(fā)生360度的旋轉(zhuǎn),根本無法引發(fā)萬向節(jié)問題,總不至于用戶堅(jiān)持在翻車的階段仍舊保持自動(dòng)駕駛這個(gè)詭異的需求。所以BEV的代碼里通常就是矩陣形式,SLAM因?yàn)檫€會(huì)用在AR和其它領(lǐng)域,相機(jī)不是相對(duì)固定的,所以會(huì)采用四元數(shù)。另外,AD領(lǐng)域里不考慮****現(xiàn)象,所以外參都是仿射矩陣(Affine Matrix),這點(diǎn)和CG領(lǐng)域的3維渲染是不同的。另外,一般文章里介紹內(nèi)參時(shí)還會(huì)考慮旋轉(zhuǎn)偏差,這是由于CCD/CMOS感光片在工廠里被機(jī)器給裝歪了,但AD領(lǐng)域一般不會(huì)考慮它,誤差太小,而相機(jī)安裝在車輛上時(shí)本身外參就有很大的相對(duì)旋轉(zhuǎn),不如一并算了,最后交由DNN學(xué)習(xí)過濾掉,而AR領(lǐng)域里的SLAM更是要主動(dòng)計(jì)算外參,這點(diǎn)毛毛雨就不考慮了。內(nèi)外參了解之后,下一個(gè)基礎(chǔ)的重點(diǎn)就是坐標(biāo)系。AD的坐標(biāo)系有好幾個(gè),不事先理清楚就直接看代碼有點(diǎn)暈。1)世界坐標(biāo)系(World Coordination),這個(gè)是真實(shí)世界空間里,車輛的位置和方位角,通常粗略的位置是由GNSS(Global Navigation Satellite System)衛(wèi)星定位系統(tǒng)獲取,GNSS包括了美國GPS/中國BDS/歐洲Galileo/毛子GLONASS/日本QZSS/印度IRNSS,各有千秋,定位精度一言難盡,一般標(biāo)稱的精度都是指:車輛在空曠地區(qū),上面有好幾顆定位衛(wèi)星罩著你,車輛靜止,定位設(shè)備天線粗壯,無其它信號(hào)源干擾的情況下的測(cè)試結(jié)果。如果你處在城市內(nèi),四周高樓林立,各種無線電干擾源,衛(wèi)星相對(duì)你時(shí)隱時(shí)現(xiàn),車速還不慢,這種情況下給你偏個(gè)幾十米都是對(duì)的起你了。為此有兩種常見解決方案:差分****糾偏和地圖通行大數(shù)據(jù)糾偏。這能給你造成一種錯(cuò)覺:衛(wèi)星定位還是蠻準(zhǔn)的。不管怎么弄,最后得到的坐標(biāo)位置是經(jīng)緯度,但跟常規(guī)GIS(Geographic Information System)相比,AD的經(jīng)緯度不是球面坐標(biāo)系,而是展開成2維地圖的坐標(biāo)系,所以最終在系統(tǒng)內(nèi)的坐標(biāo)系也是有區(qū)別的,比如google會(huì)把WGS84的經(jīng)緯度換算成它自家地圖的矩形切片編碼,Uber提出過一種六邊形切片的H3坐標(biāo)編碼,百度則是在火星坐標(biāo)的基礎(chǔ)上疊加了一個(gè)BD09的矩形切片坐標(biāo),等等諸如此類。這些都是絕對(duì)坐標(biāo)位置,而通過類似SLAM技術(shù)掃描的高精度地圖還會(huì)在這個(gè)基礎(chǔ)上引入一些相對(duì)坐標(biāo)。不管怎么樣,最后在代碼里看到的只剩下XY了。但這些系統(tǒng)都不能獲取車輛朝向(地理正北為0度,地理正東為90度,依此類推,這仍舊是在2維地圖上表示方式),所以AD里的車輛角度都是指“軌跡朝向”,用當(dāng)前位置坐標(biāo)減去上一時(shí)刻的坐標(biāo)獲得一個(gè)指向性的矢量。當(dāng)然在高精度地圖的加持下,是可以通過SLAM技術(shù)算出車輛的瞬時(shí)方位角。在缺失GNSS定位的時(shí)候,比如過隧道,需要用車輛的IMU(Inertial Measurement Unit)這類芯片做慣性導(dǎo)航補(bǔ)充,它們提供的數(shù)值是一個(gè)相對(duì)的坐標(biāo)偏移,但隨著時(shí)間的推移累積誤差大,所以長時(shí)間沒有GNSS信號(hào)的時(shí)候,IMU表示也沒辦法。2)BEV訓(xùn)練數(shù)據(jù)集的世界坐標(biāo)系(nuScenes World Coordination,其它訓(xùn)練集就不特別說明了),這個(gè)跟GNSS的絕對(duì)坐標(biāo)系就不同了:
圖5這是一個(gè)nuScenes地圖,它的世界坐標(biāo)系是圖片坐標(biāo)系,原點(diǎn)在圖片左下角,單位是米,因此在使用訓(xùn)練數(shù)據(jù)集時(shí),是不用考慮經(jīng)緯度的。數(shù)據(jù)集中會(huì)根據(jù)時(shí)間序列給出車輛的瞬時(shí)位置,也就是在這個(gè)圖片上的XY。3) Ego坐標(biāo)系(Ego Coordination),在BEV里,這個(gè)Ego是特指車輛本身,它是用來描述攝像機(jī)/激光雷達(dá)(Lidar,light detection and ranging)/毫米波雷達(dá)(一般代碼里就簡稱為Radar)/IMU在車身上的安裝位置(單位默認(rèn)都是米)和朝向角度,坐標(biāo)原點(diǎn)一般是車身中間,朝向如圖:
圖6所以車頭正放的相機(jī)默認(rèn)都是Yaw(Z軸)為0度,外參(Extrinsics Matrix)主要就是描述這個(gè)坐標(biāo)系的。4) 相機(jī)坐標(biāo)系(Camera Coordination),切記,這個(gè)不是照片坐標(biāo)系,坐標(biāo)原點(diǎn)在CCD/CMOS感光片的中央,單位是像素,內(nèi)參(Intrinsics Matrix)主要就是描述這個(gè)坐標(biāo)系的。5) 照片坐標(biāo)系(Image Coordination),坐標(biāo)原點(diǎn)在圖片的左上角,單位是像素,橫縱坐標(biāo)軸一般不寫成XY,而是uv。
圖7左中右三套坐標(biāo)系分別為:Ego Coordination, Camera Coordination, Image Coordination。所以,當(dāng)在BEV中做LSS(Lift,Splat,Shoot)時(shí),需要把照片中的像素位置轉(zhuǎn)換到世界坐標(biāo)系時(shí),要經(jīng)歷:Image_to_Camera, Camera_to_Ego, Ego_to_World,用矩陣表示:Position_in_World = Inv_World_to_Ego * Inv_Ego_to_Camera * Inv_Camera_to_Image * (Position_in_Image)其中Inv_表示矩陣的逆。實(shí)際代碼里,Camera_to_Image通常就是Intrinsics參數(shù)矩陣,Ego_to_Camera就是Extrinsics參數(shù)矩陣。這里要注意的一點(diǎn)是:fx,fy,它們實(shí)際上是這樣計(jì)算得到的:
Fx和Fy分別是橫向/縱向的鏡頭焦距,但單位是米,Dx和Dy分別是一個(gè)像素有幾米寬幾米高,得出fx和fy的單位就是像素。當(dāng)使用(Ego_to_Camera * Camera_to_Image)矩陣乘上Ego空間的坐標(biāo),會(huì)以像素為單位投影到照片空間,當(dāng)使用(Inv_Ego_to_Camera * Inv_Camera_to_Image)矩陣乘上照片空間的坐標(biāo),會(huì)以米為單位投影到Ego空間,不會(huì)有單位上的問題。大部分的BEV是多攝像頭的,意味著要一次性把多組攝像頭拍攝的照片像素?fù)Q算到Ego或者世界坐標(biāo)系:
圖8
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。