萬(wàn)字長(zhǎng)文談自動(dòng)駕駛BEV感知
本文經(jīng)自動(dòng)駕駛之心公眾號(hào)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)聯(lián)系出處。
prologue
這有可能是更的最長(zhǎng)的文章系列了,先說(shuō)為什么,一方面是看到分割大模型對(duì)小模型的提升效果需要時(shí)間,另一方面是之前對(duì)自動(dòng)駕駛的BEV算法做了很長(zhǎng)時(shí)間的預(yù)研,自己也應(yīng)該好好梳理一下了。
(很多事情都是環(huán)環(huán)相扣,都需要去決斷。比如分割大模型對(duì)小模型性能有沒(méi)有提升,效果提升的投入和輸出是否合適,提升不大還有有沒(méi)有必要繼續(xù)做,是換個(gè)方向還是繼續(xù)探索,繼續(xù)探索還有多少資源支撐,太多太多了。bev預(yù)研到什么時(shí)候才有可能落地,看過(guò)的paper有沒(méi)有轉(zhuǎn)化為產(chǎn)出的機(jī)會(huì),產(chǎn)出能不能給自己帶來(lái)收益,這些也都是問(wèn)題。雖然看起來(lái)問(wèn)題很復(fù)雜,但不過(guò)也就是個(gè)隱馬爾可夫或者CRF,一切都還在變化之中,靜待靴子落地吧)
其實(shí)自動(dòng)駕駛bev算法是個(gè)很寬泛的說(shuō)法,bev也就是bird's-eye-view,是指從鳥(niǎo)瞰視角來(lái)做task的范式;從數(shù)據(jù)來(lái)說(shuō)有純視覺(jué)的bev,純雷達(dá)的bev,也有視覺(jué)雷達(dá)or其他多傳感器融合的bev。
這也是有很多說(shuō)法的,對(duì)于一個(gè)公司項(xiàng)目來(lái)說(shuō),走什么樣的技術(shù)路線(xiàn),用什么樣的傳感器,運(yùn)行在什么平臺(tái)上,都對(duì)相應(yīng)的算法有著要求,在現(xiàn)實(shí)的種種妥協(xié)之下最sota的算法也不一定就是最好的,指標(biāo)高的算法也不見(jiàn)得就一定是能用的。
就先簡(jiǎn)單說(shuō)一下,也給大家share一下自己的一些paper list:
camera bev :
1. Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D
- 點(diǎn)評(píng):純視覺(jué)bev的開(kāi)山鼻祖,在后續(xù)的文章里面但凡有用到將二維圖像feature提升到三維空間然后拍扁到bev空間都有用到其提出的lift-splat的操作,代碼也很干脆易讀。(shoot部分是做規(guī)劃的,代碼沒(méi)開(kāi)出來(lái))核心是將每個(gè)圖像單獨(dú)提升為一個(gè)特征的視錐,然后將所有視錐拍平到柵格化的BEV網(wǎng)格上,如下圖所示。
當(dāng)然由于是初代版本也就不可避免的存在一些問(wèn)題,最主要的兩個(gè)點(diǎn),一是splat的過(guò)程中運(yùn)算耗時(shí),二是在深度估計(jì)部分由于給予每個(gè)點(diǎn)可能的深度時(shí)并沒(méi)有用深度真值監(jiān)督,導(dǎo)致不夠準(zhǔn)確,越遠(yuǎn)效果越差性能和現(xiàn)在的新一些算法比起來(lái)差很多。但這仍舊不妨礙其在bev算法中的份量。
題外話(huà):我也有過(guò)對(duì)lss進(jìn)行優(yōu)化,說(shuō)來(lái)話(huà)長(zhǎng),可以給大家推一些我之前相關(guān)的博文。簡(jiǎn)單說(shuō)就是之前有想著打一打nuscenes的榜單,對(duì)公司對(duì)自己也都有好處,于是就打算從Lss入手來(lái)搞,當(dāng)時(shí)主要考慮他是plug and play 的,基于lss的bev算法很多,如果能在這樣基礎(chǔ)算法上做出改進(jìn)那就可以對(duì)所有使用了lss模塊的算法都帶來(lái)提升,這是一件有意義的事情。至于后面就不說(shuō)了,都是汗與累??!
一個(gè)是對(duì)代碼的解讀
一個(gè)是對(duì)LSS做改進(jìn)的nuscenes sota
一個(gè)是我之前搞得nuscenes 深度圖
2. M2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Bird's-Eye View Representation
- 點(diǎn)評(píng):這是一篇沒(méi)有開(kāi)源的文章,和lss一樣也是nvidia的工作,也是從2d到3d再投影到bev空間但由于假設(shè)沿射線(xiàn)的深度分布是均勻的,這意味著沿相機(jī)射線(xiàn)的所有體素都填充與2D空間中單個(gè)像素對(duì)應(yīng)的相同特征,所以?xún)?nèi)存高效速度更快,單從文章看效果比lss要好,號(hào)稱(chēng)是第一個(gè)用統(tǒng)一框架同時(shí)做檢測(cè)和分割任務(wù)的,但沒(méi)開(kāi)源。
- 這里有一個(gè)點(diǎn)是,這篇文章假設(shè)沿著射線(xiàn)的深度分布是均勻的,這意味著沿著相機(jī)射線(xiàn)的所有體素都填充有與2D空間中的P中的單個(gè)像素相對(duì)應(yīng)的相同特征。好處是這種統(tǒng)一的假設(shè)通過(guò)減少學(xué)習(xí)參數(shù)的數(shù)量來(lái)提高計(jì)算和存儲(chǔ)效率。但lss卻不是這樣,他是a non-uniform depth distribution。
3. BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View
- 點(diǎn)評(píng):lss算法后來(lái)者,或者說(shuō)包了一層皮(有點(diǎn)直白),改進(jìn)了前處理和后處理核心沒(méi)變,之前l(fā)ss是做分割任務(wù),這篇是拿來(lái)做檢測(cè)任務(wù)。這篇工作是鑒智機(jī)器人做的,后續(xù)還有一系列文章與改進(jìn)版本。雖然但是從這里開(kāi)始后面的很多文章就會(huì)對(duì)lss中的所謂“棱臺(tái)求和”部分進(jìn)行優(yōu)化和加速了。
題外話(huà)(+1):鑒智機(jī)器人還是可以的創(chuàng)始人都是清華背景,當(dāng)初大概21年后半年的時(shí)候有面過(guò),那時(shí)候他們剛開(kāi)始創(chuàng)業(yè)也就幾十個(gè)人,說(shuō)過(guò)去做感知后處理,非常可惜當(dāng)時(shí)自己也還年輕,互相也都沒(méi)看上。后面再來(lái)看他們確實(shí)做了不少有意義的工作,點(diǎn)贊!不過(guò)現(xiàn)在自動(dòng)駕駛環(huán)境也一般,大家也都過(guò)的不容易。
這里給大家放一下bevdet系列的發(fā)展歷程:
bevdet做出來(lái)以后,后面還有bevdet4d (BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection)主要就是增加了時(shí)序,將過(guò)去幀與當(dāng)前幀特征融合來(lái)提高精度,比較有趣的。主要原因有:在做特征融合的時(shí)候,BEVDet4D在BEVDet的基礎(chǔ)上,通過(guò)保留過(guò)去幀的中間BEV特征,并通過(guò)與當(dāng)前幀對(duì)齊和拼接來(lái)融合特征。這樣,BEVDet4D可以通過(guò)查詢(xún)兩個(gè)候選特征來(lái)獲取時(shí)間線(xiàn)索,而僅需要可忽略的計(jì)算增加。對(duì)任務(wù)進(jìn)行了簡(jiǎn)化,BEVDet4D通過(guò)移除自我運(yùn)動(dòng)和時(shí)間因素來(lái)簡(jiǎn)化速度預(yù)測(cè)任務(wù)。這使得BEVDet4D能夠減少速度誤差,使得基于視覺(jué)的方法在這方面首次與依賴(lài)LiDAR或雷達(dá)的方法相媲美。BEVDet4D的性能提升主要來(lái)源于速度估計(jì)更準(zhǔn)確1。此外,小模型上的mAP有一定的增長(zhǎng),主要是小分辨率無(wú)法覆蓋50米的范圍,歷史幀提供了一定的線(xiàn)索。
在往后就是bevpoolv2主要做對(duì)于lift-splat的提速,用預(yù)處理來(lái)優(yōu)化計(jì)算流程做到了4.6 - 15.1倍速度的提升,同時(shí)也降低了內(nèi)存的占用。這個(gè)處理確實(shí)很高級(jí),點(diǎn)贊!對(duì)于工程化落地來(lái)說(shuō)真是太重要了。
截止到2023年12月22日,bevdet系列的最新發(fā)展是DAL(Detecting As Labeling:Rethinking LiDAR-camera Fusion in 3D Object Detection),是做視覺(jué)和lidar融合的,效果和速度都有提升。如果直接點(diǎn)說(shuō),和bevfusion(mit版本)的流程大同小異,只是在視覺(jué)雷達(dá)的分支上更加相信雷達(dá),然后包了一個(gè)“模仿數(shù)據(jù)注釋過(guò)程”的故事,比較粗淺的來(lái)說(shuō)就是這樣。當(dāng)然這并不妨礙人家效果好,也還是做了很多細(xì)節(jié)上的工作的。也比較期待他們接下來(lái)的工作。
以下是DAL paper中的框架圖:
4. BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers
- 點(diǎn)評(píng):使用transformer和temporal來(lái)做bev感知任務(wù)(檢測(cè)和分割)提升性能,有一些設(shè)計(jì)比如bev queries,spatial cross-attention,temporal self-attention。主要注意的是這里的兩個(gè)attention并不是經(jīng)典的transformer,而是用的DeformAtt.這里我記得當(dāng)時(shí)在看整個(gè)流程的時(shí)候廢了一點(diǎn)功夫,代碼也相對(duì)來(lái)說(shuō)復(fù)雜一些。
不過(guò)大家也可以從這里開(kāi)始,順便看一看detr的發(fā)展脈絡(luò)。這里的bev queries 是隨機(jī)生成初始化的,然后我記得后面有一篇nvidia打榜cvpr 2023 挑戰(zhàn)賽的時(shí)候的fb-bev or fb-occ來(lái)著,對(duì)于queries的初始化這部分有做改進(jìn),能學(xué)的快一點(diǎn)。
上面是論文出處,不是我亂說(shuō)哦!這里沒(méi)有把這篇文章放進(jìn)來(lái)主要是最開(kāi)始fb-occ是做占用網(wǎng)格用的,后面做bev放出來(lái)的fb-bev效果反倒沒(méi)有很驚艷,再加上打榜的工作本來(lái)就不是為了產(chǎn)品化來(lái)設(shè)計(jì)的,前向投影查一遍反向投影(2d-3d,3d-2d)速度當(dāng)然就很慢了,所以就沒(méi)說(shuō)。(不過(guò)也有懶得成分了)
后續(xù)還有一些改進(jìn)的版本,比如BEVFormer++,bevformerv2當(dāng)然這個(gè)工作不是原班人馬,所以就簡(jiǎn)單說(shuō)一下bevformerv2。這篇主要就是沒(méi)開(kāi)源,paper說(shuō)要開(kāi)但是還沒(méi),所以也就只能看看idea;bevformer++
則是一篇技術(shù)報(bào)告,原班人馬拿了Waymo Open Dataset Challenge 2022的第一名,可以看一看吧。
5. BEVDepth: Acquisition of Reliable Depth for Multi-view 3D Object Detection
- 點(diǎn)評(píng):bevdepth是我非常欣賞的一篇工作,在lss的基礎(chǔ)上用雷達(dá)作為深度的真值,深度估計(jì)網(wǎng)絡(luò)考慮到相機(jī)內(nèi)參,深度細(xì)化模塊專(zhuān)門(mén)對(duì)深度估計(jì)部分進(jìn)行了優(yōu)化,更重要的是使用gpu并行對(duì)原來(lái)lss的"cumsum trick"進(jìn)行了優(yōu)化,大大提升了lss環(huán)節(jié)的速度,在gpu下相較原版lss快了80x。真是把lss depth估計(jì)的效果提升了一個(gè)檔次(其實(shí)這也是我當(dāng)時(shí)想在lss深度上做文章的靈感來(lái)源,ps這句話(huà)不重要)
6. CVT:Cross-view Transformers for real-time Map-view Semantic Segmentation
- 點(diǎn)評(píng):前視圖投影頂視圖的原理,用transformer的注意力機(jī)制搞跨視圖分割。
7. GKT:Efficient and Robust 2D-to-BEV Representation Learning via Geometry-guided Kernel Transformer
- 點(diǎn)評(píng):之前有注釋過(guò)核心代碼https://blog.csdn.net/weixin_46214675/article/details/131169769?spm=1001.2014.3001.5501,不是什么很出名的paper,像其他的可能都是cvpr,eccv,iccv啥的,之所以會(huì)搞這個(gè)主要是當(dāng)時(shí)有項(xiàng)目在地平線(xiàn)的芯片上,他們對(duì)這個(gè)算法有支持,然后一看原來(lái)是人在地平線(xiàn)實(shí)習(xí)的時(shí)候搞得,目前為止沒(méi)看到有中稿,就他們自家東西支持一下我覺(jué)得也很正常。感興趣大家可以自己看看,簡(jiǎn)單說(shuō)是bev投到圖像,然后在投影周邊一定范圍內(nèi)做注意力,當(dāng)然也有一些其他的比如對(duì)外參加一些噪聲讓網(wǎng)絡(luò)更魯棒,建查找表加速。
lidar det:
對(duì)于雷達(dá)來(lái)說(shuō),bev其實(shí)就沒(méi)有那么必須,雷達(dá)bev和detection關(guān)系比較密切。一般用雷達(dá)做檢測(cè)有幾個(gè)范式?不知道咋說(shuō),要么就是基于點(diǎn)來(lái)做,像pointnet,pointnet++;基于視角來(lái)做的話(huà)就可以是頂視這就是bev,也可以是前視圖,這兩種視角變化做雷達(dá)圖像融合也會(huì)看到的;也可以基于體素來(lái)做。當(dāng)然這么說(shuō)并不準(zhǔn)確,不管什么范式總有互相借鑒的地方。
1. pointpillar
- 點(diǎn)評(píng):https://blog.csdn.net/weixin_46214675/article/details/125927515?spm=1001.2014.3001.5502,很久之前淺淺有做過(guò)個(gè)ppt,當(dāng)時(shí)主要是當(dāng)科普來(lái)講,所以沒(méi)有很細(xì),但確實(shí)是篇對(duì)工業(yè)界有用的paper,點(diǎn)贊!
2. centerpoint
- 點(diǎn)評(píng):CenterPoint使用標(biāo)準(zhǔn)的基于激光雷達(dá)的主干網(wǎng)絡(luò),VoxelNet或PointPillars。CenterPoint預(yù)測(cè)連續(xù)幀之間物體的相對(duì)偏移(速度),然后貪婪地連接這些幀。因此,在CenterPoint中,3D物體跟蹤簡(jiǎn)化為貪婪的最近點(diǎn)匹配。這種檢測(cè)和跟蹤算法既高效又有效。在nuScenes基準(zhǔn)測(cè)試中,CenterPoint實(shí)現(xiàn)了最先進(jìn)的性能。在Waymo開(kāi)放數(shù)據(jù)集上,CenterPoint的性能超過(guò)了所有以前的單一模型方法。
- 青出于藍(lán)勝于藍(lán),也是一篇很不錯(cuò)的paper,工業(yè)界目前還有在使用的,點(diǎn)贊!
fusion bev:
1.BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird's-Eye View Representation [code]
- 點(diǎn)評(píng):bevfusion是一篇圖像激光雷達(dá)融合的bev算法,支持同時(shí)檢測(cè)和分割任務(wù)。在nuScenes detection task
榜單上有許多該方法的變體,從總體架構(gòu)上來(lái)看基本方法很清晰,camera分支和lidar分支分別提取特征,然后轉(zhuǎn)移到共享的bev空間下,再提取bev特征來(lái)做多任務(wù),真可謂是大道至簡(jiǎn)。值得一提的是,bevfusion對(duì)于camera to bev 部分的優(yōu)化做了不少工作,預(yù)計(jì)算部分減少了13ms,gpu計(jì)算間隔優(yōu)化減少了498ms,真是把優(yōu)化做到了極致,很多公司都做不到這樣。
此外,從paper實(shí)驗(yàn)對(duì)比部分我們也能看出bevfusion的強(qiáng)大,對(duì)于許多想學(xué)習(xí)bev的工程師來(lái)說(shuō)bevfusion真是一個(gè)很優(yōu)秀的框架了,正如團(tuán)隊(duì)所說(shuō)希望BEVFusion可以作為一個(gè)簡(jiǎn)單但強(qiáng)大的基線(xiàn),啟發(fā)未來(lái)多任務(wù)多傳感器融合的研究。但遺憾的是,盡管團(tuán)隊(duì)針對(duì)速度做了很多工作但仍不能達(dá)到實(shí)時(shí)。(8.4 FPS)
在實(shí)際的工程項(xiàng)目中,如果想要使用bevfusion最大的問(wèn)題其實(shí)還是優(yōu)化問(wèn)題,因?yàn)樽髡叩膬?yōu)化都是基于cuda是做的,一旦離開(kāi)nvidia的平臺(tái)很多地方會(huì)受到影響,這部分就需要針對(duì)不同平臺(tái)來(lái)編寫(xiě)定制化的算子。
2. Cross Modal Transformer: Towards Fast and Robust 3D Object Detection [code]
當(dāng)然算法永遠(yuǎn)是在進(jìn)步更新的,新算法往往會(huì)更快更強(qiáng),就比如CMT也是在nuscenes 榜上有名的。既然都說(shuō)到這里了,那就簡(jiǎn)單說(shuō)一下cmt精髓,屬實(shí)是把位置編碼玩明白了。
對(duì)于圖像,先把pixel左乘內(nèi)參的逆然后乘外參轉(zhuǎn)到雷達(dá)坐標(biāo)系下,然后用mlp輸出其位置編碼
對(duì)于雷達(dá)則是用voxelnet或者pointpillar編碼為點(diǎn)云token后在bev feature gird上沿著高度簡(jiǎn)單采樣,然后也是用Mlp輸出其位置編碼.
Position-guided Query 則是先隨機(jī)選點(diǎn)A,A:(ax,i ,ay,i ,az,i)是[0,1]之間隨機(jī)生成的,然后乘以范圍加上最小值轉(zhuǎn)到the region of interest (RoI) of 3D world space.
然后把這個(gè)坐標(biāo)投影到圖像和雷達(dá)模態(tài)中獲取相應(yīng)的位置編碼,相加得到Q查詢(xún)
代碼如下:這個(gè)參考點(diǎn)是可以學(xué)習(xí)的
最主要的操作就是這個(gè)了。在paper里面也寫(xiě)的很清楚,bevfusion是兩個(gè)模態(tài)轉(zhuǎn)到bev空間后拼接,transfusion先在lidar特征中生成Q取top-k再查圖像特征。而CMT則是對(duì)象查詢(xún)直接與多模態(tài)特征同時(shí)交互,使用位置編碼來(lái)對(duì)齊兩個(gè)模態(tài)。當(dāng)然也取得了不錯(cuò)的效果。
3.TransFusion: Robust LiDAR-Camera Fusion for 3D Object Detection with Transformers [code]
- 點(diǎn)評(píng):transfusion當(dāng)然也是一篇不錯(cuò)的工作,而且除檢測(cè)外還做了跟蹤,當(dāng)時(shí)在nuScenes跟蹤排行榜上排名第一。一個(gè)主要的亮點(diǎn)是,使用了一種軟關(guān)聯(lián)機(jī)制,可以處理圖像質(zhì)量較差和傳感器未配準(zhǔn)的情況。這種機(jī)制使得模型能夠自適應(yīng)地確定從圖像中獲取何處和何種信息,從而實(shí)現(xiàn)了一種魯棒且有效的融合策略。簡(jiǎn)單說(shuō)就是利用cross-attention建立了激光雷達(dá)和圖像之間的soft association。翻譯一下論文就是:
(Spatially Modulated Cross Attention,SMCA)模塊通過(guò)在每個(gè)查詢(xún)的投影2D中心周?chē)褂靡粋€(gè)2D圓形高斯掩膜來(lái)加權(quán)交叉注意力。權(quán)重掩膜M的生成方式與CenterNet[66]類(lèi)似,使用了以下公式:
。其中,是權(quán)重掩膜M的空間索引,是通過(guò)將查詢(xún)預(yù)測(cè)投影到圖像平面上計(jì)算得到的2D中心,是3D邊界框投影角的最小外接圓的半徑,是用來(lái)調(diào)節(jié)高斯分布帶寬的超參數(shù)。然后,這個(gè)權(quán)重圖與所有注意力頭之間的交叉注意力圖進(jìn)行元素級(jí)的乘法操作。這樣,每個(gè)對(duì)象查詢(xún)只關(guān)注到投影2D框周?chē)南嚓P(guān)區(qū)域,使得網(wǎng)絡(luò)可以更好、更快地學(xué)習(xí)根據(jù)輸入的LiDAR特征選擇圖像特征的位置。
當(dāng)然他的問(wèn)題在于如果圖像質(zhì)量極差,例如在照明條件較差的情況下,其性能可能會(huì)受到影響。由于使用了Transformer解碼器,因此會(huì)增加計(jì)算復(fù)雜度和內(nèi)存需求。(不過(guò)畢竟是fusion的bev跑實(shí)時(shí)確實(shí)不容易,更不用說(shuō)之后的占用網(wǎng)格)
從上面對(duì)比的一系列表格也可以看出,bev相關(guān)的paper還是很多的,大家感興趣可以隨便找一篇相關(guān)文章,然后從對(duì)比表格中找到一連串同類(lèi)型文章。此外,這篇博客也只是粗淺的寫(xiě)一些與我相關(guān)的見(jiàn)過(guò)的部分paper,也只是個(gè)開(kāi)篇,等有空的時(shí)候會(huì)陸續(xù)再更新吧。
Interesting thing
寫(xiě)到這里了就再分享個(gè)自己覺(jué)得有趣的事情,那就是有一件看似很反直覺(jué)的事情,單從fusion bev的三個(gè)算法來(lái)看cmt明顯性能不錯(cuò),速度也可以,其次是bevfusion,最后是transfusion。但如果去看這三者的github就會(huì)發(fā)現(xiàn),最好的cmt其實(shí)是受關(guān)注最少的,transfusion是fork最多的,bevfusion是star最多的。以下數(shù)據(jù)截止到2023年12月27日.
- Transfusion 1.4k fork,539 star
- CMT 30 fork,259 star
- bevfusion 322 fork,1.8k star
至于為什么會(huì)出現(xiàn)這樣的情況,大家可以各抒己見(jiàn),正所謂三個(gè)臭皮匠,賽過(guò)諸葛亮。讓我想起來(lái)當(dāng)初學(xué)社會(huì)心理學(xué)的時(shí)候,也是很有趣了。扯了這么久終于有上萬(wàn)字了,這也算是萬(wàn)字長(zhǎng)文章了,哈哈哈。大家有什么想交流的想聊的都?xì)g迎!我其實(shí)也有在想要不要也搞一下nlp,后面搞Embodied AI,還在猶豫,不過(guò)我覺(jué)得都能搞,沒(méi)什么不能搞得!
原文鏈接:https://mp.weixin.qq.com/s/QXLUuoxnkGkcaZnCA2cf9Q