題目:Pseudo-LiDAR from Visual Depth Estimation: Bridging the Gap in 3D Object Detection for Autonomous Driving(自動駕駛)
作者:Yan Wang, Wei-Lun Chao, Divyansh Garg, Bharath Hariharan, Mark Campbell, Kilian Q. Weinberger
論文鏈接:https://arxiv.org/abs/1812.07179
項目鏈接:https://mileyan.github.io/pseudo_lidar/
代碼鏈接:https://github.com/mileyan/pseudo_lidar
1)核心觀點:基於視覺得深度檢測效果不好,很大程度上是因為數據的表達形式,也就是格式選擇不對。(這篇的角度很新穎很奇特,因為還是網上沒什么參考資料,就又自己強行翻譯理解了)
2)使用雷達&相機做3D車輛檢測的優缺點與區別:
雷達:
- 貴;通過64路或者128路旋轉激光束提供稀疏的深度數據。
- 使用單一傳感器存在很大的風險,比如雷達不適用的環境,或者雷達因為其他原因不可用;此外,如果可以多傳感器協同工作的話,精度和效率或許可以有更大提升。
- 數據用3D點雲表示,或者從bird‘s eye view觀察(這種方式可以避免在正面圖像中遠處物體尺寸特別小的問題,因此幾乎為線性誤差),在這兩種情況下,目標的形狀和尺寸都不受深度影響。
相機圖像:
- 便宜,幀率高;
- 遠處的物體尺寸會變小,更難檢測,對深度估計的誤差隨着深度的增加大致成二次增長。
- 基於圖像的深度,提供稠密的深度數據,每個像素都有其深度值(通常在基於圖像的處理中,會將深度作為RGB之外的一個額外的通道);
- 相鄰像素在3D空間中可能存在很大的深度差。
基於圖像和基於雷達的3D檢測,在思路上的主要區別(存在個人理解,存疑):
- LiDAR:雷達可以提供確切可知的准確的深度,因此檢測的重點往往在於預測標簽和畫出准確的3D框(也就是類別和方向角的預測);
- 圖像:基於圖像的檢測更重要的一個環節是可靠的深度估計(當然類別和角度的估計也很重要)。
3)本文算法:
思路:
-
- 通過視覺深度估計方法從單目相機或雙目相機的圖像中估計深度,
- 將得到的像素深度反投影為3D點雲,得到Pseudo-LiDAR數據,
- 最后用基於LiDAR的檢測算測做檢測。
流程圖:
深度估計:本文算法與深度估計部分無關,這里可用單目深度估計或者雙目深度估計,本文采用雙目深度。
雙目深度估計輸入一對左右圖像Il,Ir,輸出與任意一圖像大小相同的視差圖Y(disparity map)。本文假設左圖為參考圖像,並在Y矩陣中存每個像素相對於右圖的水平視差。由下式得到深度圖:(其中fU為左圖的水平方向的焦距)
這里補充下雙目相機的視差估計原理(下圖截自SLAM十四講):
生成Pseudo-LiDAR數據:
在左圖的相機坐標系中為每個像素(u,v)反投影的到3D坐標(x,y,z):((cU,cV)是像素坐標原點相對與相機中心的位置偏移,fV是垂直焦距)。將所有的像素點都反投影到3D坐標,得到3D點雲{(x(n),y(n),z(n))}Nn=1(N為像素數目)。
這里補充一下相機坐標到像素坐標的投影變換:
LiDAR vs. pseudo-LiDAR:因為后續是要和雷達信號做對比,這里對偽雷達信號做了些額外的處理:
- 由於真實雷達信號只存在於一定的高度范圍內,這里只保留雷達源(就是KITTI雷達的位置,車頂)上方1m內的雷達信號,去掉的部分通常不存在自動駕駛場景感興趣的目標(車輛、行人),影響不大;
- 雷達信號通常會包含每個測量像素的反射率(給出數值0或者1),但是圖像無法的到這個數據,就全部簡單粗暴設置為1。
- 從圖中可以看出,偽雷達數據和真實雷達數據對應比較好(這個地方我不太會看,這個黃色點點怎么就和藍色點點對准了啊),但是偽雷達數據是稠密的,雷達雖然在一幅圖像上可以采集到和圖像像素同量級的數據(超過10w點),但由於雷達只有64或者128路激光束,所以雷達數據點是稀疏的。
3D目標檢測:
有了偽雷達數據就可以用任何一種基於雷達的3D檢測算法檢測啦。本文采用單目圖像+LiDAR的方式,采用兩種方式處理pseudo-LiDAR數據,baseline選用了AVOD和frustum PointNet:(這兩個baseline我都不了解,文中的簡單解釋也不太能理解來,這里不多說了吧)
- 3D點雲:frustum PointNet;
- 從Bird's Eye View(BEV)角度去觀察pseudo-LiDAR數據:這樣從俯視角度,3D信息被轉化成為2D圖像(保留寬和深,高度存在通道中),AVOD。
數據表示形式至關重要:
盡管pseudo-LiDAR和深度圖中是相同的信息轉化而來,但是本文主張pseudo-LiDAR數據更適用於基於卷積神經網絡的3D目標檢測。
卷積神經網絡的核心模塊是2D卷積,卷積神經網絡在處理深度圖像的時候是進行一系列的2D卷積操作,雖然卷積核的參數是可以學習的,但是核心假設有兩個:
- 圖像的局部鄰域是有意義的,網絡應該觀察局部圖片塊;
- 所有鄰域都可以用相同的方式處理。(😓這個地方還是不懂是個啥意思)
這些假設確實需要,但並不完善,現有的2D檢測器在遇到這些假設不成立時常常會崩潰。
- 第一,2D圖片上的局部圖片塊只有在同屬於同一目標的時候,才在物理上具有相關性。如果圖片塊跨越目標邊界,那么深度圖上相鄰的兩像素在3D空間中可能位置相差非常大。
- 第二,相同大小的物體處於不同的深度,投影在深度圖上時會有不同的尺寸。相同尺寸的圖片塊可能覆蓋的內同相差非常大。
相反,點雲上的3D卷積或者BEV視角上的2D卷積在物理上自然靠近(盡管BEV會將不同高度的像素堆疊到一起,但是這些像素通常你都屬於同一物體,不影響)。這樣,遠處物體和近處物體可以用完全相同的方式處理,這些操作本質上更具有物理意義,自然地可以得到更精確的結果。做了對比實驗來驗證這點(2D卷積操作有時侯不太靠譜)(圖3):左側是原始深度圖和其得到的pseudo-LiDAR數據;右側深度圖是左側經過一個11 * 11 的卷積層得到的,下面是其得到的pseudo-LiDAR數據。
4)結果
雙目視差估計:使用3種算法PSMNet,DispNet,SPS-stereo
單目深度估計不可靠:文中實驗,單目深度估計網絡DORN用10倍於雙目深度估計(PSMNet)圖片數量的數據集進行訓練,但是雙目得到的效果更好(表1中藍色數據的對比)。
深度圖作為額外的通道不合理:MLF-stereo也是將像素深度反投影為3D點坐標,但是其將每個像素的3D坐標作為前景視角的一個額外的特征圖,和原有的RGB 通道concatenate起來作為2D檢測的輸入,但其效果不好。
視差估計的准確性對目標檢測的影響不大:1、視差的精度可能並不反映深度的精度:相同的視差誤差可能導致差別巨大的深度誤差(取決於像素的真實深度);2、不同的檢測算法產生3D點的方式不同:AVOD將空間點分割為體元素,F-PointNet直接產生3D點(易受噪聲影響)。
減小深度估計的誤差依舊非常重要:隨着難度的增加,pseudo-LiDAR的結果會下降。
對自行車和行人的檢測效果偏差:IoU閾值為0.5的精確度遠小於IoU閾值為0.7的車輛檢測(表4)。
5)未來改進方向:端到端訓練整個網絡;提高輸入圖像的分辨率;本文算法速度為1fps,可從速度上提高(先在低分辨率上計算深度圖,然后合並高分辨率來調整之前的結果);做多傳感器融合(LiDAR和pseudo-LiDAR)