一文讀懂基于 LiDAR 點云的 3D 物體檢測算法

?雖然業界有很多的爭論,但是 LiDAR 在目前的 L3/L4 級自動駕駛系統中依然是不可或缺的傳感器,因為它可以提供稠密的 3D 點云,非常精確的測量物體在 3D 空間中的位置和形狀,而這是攝像頭和毫米波雷達很難做到的。那么相應的,基于 LiDAR 點云的感知算法也就成為了近年來自動駕駛研發的重點之一。與圖像的感知算法類似,LiDAR 點云的感知算法也分為物體檢測(包括跟蹤)和語義分割兩大類。這篇文章主要關注基于 LiDAR 點云的物體檢測算法,語義分割算法留待以后再做介紹。
很多綜述性的文章把 LiDAR 點云的物體檢測算法粗略分為四類:Multi-view 方法,Voxel 方法,Point 方法,以及 Point 和 Voxel 結合的方法。這種基于分類的綜述更像是一個算法圖書館,讀者可以根據關鍵字(或者說關鍵技術)進行索引,方便于查詢和歸檔,可能更適合于該領域內的工作者。但是我想并不是所有的讀者都對這個方向有比較深入的了解,直接講方法分類和技術細節可能會從一開始就讓讀者迷失在算法的森林里。 所以,與一般的綜述不同,在這篇文章里我以時間為線索,將 LiDAR 點云物體檢測的發展歷程粗略地劃分為了四個時期:萌芽期,起步期,發展期和成落地期。我會從技術發展的角度,結合自己在研究中的一些體會來介紹各種算法。這篇綜述的目的不在于包羅這個方向所有的文章,我只會選一些在技術發展的道路上具有重要意義的工作。當然本人水平有限,其中肯定會有疏漏。但是,如果大家讀完以后能夠對該方向的發展脈絡有一個基本的認識,那我想我的目的就達到了。
基本概念在進入具體的介紹之前,還是有必要簡單說一下一些基本的概念。LiDAR 的輸出數據是 3D 點云,每一個點除了包含 X,Y,Z 坐標,還包含一個反射強度 R,類似與毫米波雷達里的 RCS。3D 物體檢測的目標是要根據點云數據來找到場景中所有感興趣的物體,比如自動駕駛場景中的車輛,行人,靜態障礙物等等。下圖以車輛為例,來說明輸出結果的格式。簡單來說,檢測算法輸出多個 3D 矩形框(術語稱為 3D BoundingBox,簡稱 3D BBox),每個框對應一個場景中的物體。3D BBox 可以有多種表示方法,一般最常用的就是用中心點 3D 坐標,長寬高,以及 3D 旋轉角度來表示(簡單一些的話可以只考慮平面內旋轉,也就是下圖中的 θ)。檢測算法輸出的 3D BBox 與人工標注的數據進行對比,一般采用 3D IoU (Intersection over Unoin)來衡量兩個 BBox 重合的程度,高于設定的閾值就被認為是一個成功的檢測,反之則認為物體沒有被檢測到(False Negative)。如果在沒有物體的區域出現了 BBox 輸出,則被認為是一個誤檢(False Positive)。評測算法會同時考慮這兩個指標,給出一個綜合的分數,比如 AP(Average Precision)以此為標準來評價算法的優劣。由于不是本文的重點,具體的細節這里就不做贅述了。?

基于 LiDAR 點云的 3D 物體檢測示意圖
萌芽期 (2017 年之前)有了前面的鋪墊,下面我們的算法之旅正式開始了。話說物體檢測算法的興起主要來自于計算機視覺領域,自從 2012 年深度學習出現以來,圖像和視頻中的物體檢測算法在性能上有了大幅度的提高,各種經典算法也是層數不窮,比如最早的 R-CNN,到后來的 Faster RCNN,再到 YOLO 以及最新的 CenterNet 等等,可以說已經研究的非常透徹了。那么,在做點云中的物體檢測時,人們自然的就會想到要借鑒視覺領域的成功經驗。VeloFCN 就是其中的代表性方法。它將 3D 點云轉換到與圖像相似的正視圖(Front View),得到一個「點云偽圖像」。這種數據在格式和性質上與圖像非常類似,自然的也就可以照搬圖像上的物體檢測算法。但是這種表示的缺陷也很明顯,首先多個點可能映射到圖像坐標的同一個位置,這樣會造成信息的丟失。更為重要的是,將 3D 的點映射到 2D 平面,丟掉了深度信息,而這個信息對 3D 物體檢測來說是非常重要的。因此,人們又想到可以把 3D 點云映射到俯視圖(也稱作鳥瞰視圖,Bird's Eye View, 簡稱 BEV)。這種映射是非常直觀的,你可以簡單的認為把 3D 點的高度坐標忽略(將其看作點的特征),從而得到 2D 平面上的數據表示。MV3D 就是將 3D 點云同時映射到正視圖和俯視圖,并與 2D 圖像數據進行融合。以上說的都是數據構建和特征提取,至于后端的檢測算法,一般來說這個時期都是采用基于 R-CNN 或者類似的方法。

MV3D 的多種視圖融合
起步期(2017 年)時間進入 2017 年,在這個年份里出現了兩個在點云物體檢測領域堪稱里程碑式的工作:VoxelNet 和 PointNet++。這兩個工作代表了點云處理的兩個基本方向,VoxelNet 將點云量化為網格數據,而 PointNet++ 直接處理非結構化的數據點。下面我會稍微詳細的介紹一下這兩個方法,因為之后點云物體檢測領域幾乎所有的方法都離不開這兩個工作里的概念。VoxelNet 這個工作是 2017 年由蘋果公司的兩位研究人員提出的,并且發表在了 CVPR 2018 上(計算機視覺和模式識別領域的頂會)。其思路并不復雜,首先將點云量化到一個均勻的 3D 網格中(下圖中的 grouping)。每個網格內部隨機采樣固定數量的點(不足的就重復),每個點用 7 維特征表示,包括該點的 X,Y,Z 坐標,反射強度 R,以及該點相對網格質心(網格內所有點位置的均值)的位置差 ΔX,ΔY 和 ΔZ。全連接層被用來提取點的特征,然后每個點的特征再與網格內所有點的特征均值進行拼接,得到新的點特征。這種特征的優點在于同時保留了單個點的特性和該點周圍一個局部小區域(網格)的特性。這個點特征提取的過程可以重復多次,以增強特征的描述能力(下圖中的 Stacked Voxel Feature Encoding)。最終網格內的所有點進行最大池化操作(Max Pooling),以得到一個固定長度的特征向量。以上這些步驟稱為特征學習網絡,其輸出是一個 4D 的 Tensor(對應 X,Y,Z 坐標和特征)。這與一般的圖像數據不同(圖像是 3D Tensor,只有 X,Y 坐標和特征),因此還沒法直接采用圖像物體檢測的方法。VoxelNet 中采用 3D 卷積對Z維度進行壓縮(比如 stride=2)。假設 4D Tensor 的維度為 HxWxDxC,經過若干次 3D 卷積后,Z 維度的大小被壓縮為 2(也就是 HxWx2xC'),然后直接將 Z 維度與特征維度合并,生成一個 3D 的 Tensor(HxWx2C')。這就和標準的圖像數據格式相似了,因此可以接上圖像物體檢測網絡(比如 Region Proposal Network,RPN)來生成物體檢測框,只不過這里生成的是 3D 的檢測框。從上面的介紹可以看出,VoxelNet 的框架非常簡潔,也是第一個可以真正進行端對端的學習的點云物體檢測網絡。實驗結果表明,這種端對端的方式可以自動地從點云中學習到可用的信息,比手工設計特征的方式更為高效。

VoxelNet 網絡結構PointNet++ 該方法的前身是 PointNet,由斯坦福大學的研究者在 2017 年發表,這也是點云處理領域的開創性工作之一。PointNet 處理的是點云分類任務,其主要思路是直接處理原始的點云。除了一些幾何變換之外,PointNet 主要有兩個操作:MLP(多個全連接層)提取點特征,MaxPooling 得到全局特征。物體分類網絡采用全局特征作為輸入,而分割網絡則同時采用全局特征和點特征。簡單來說,你可以把 PointNet 分類網絡看做一個分類器,比如可以理解為傳統方法中的 SVM。但是要進行物體檢測的話,就還需要一個類似于 Sliding Window 的機制,也就是說在場景內的各個位置應用 PointNet 來區分物體和背景,以達到物體檢測的效果。當然對于相對稀疏的點云數據來說,這種做法是非常低效的。因此,PointNet 的作者同年就提出了升級版本,也就是 PointNet++。其主要思路是用聚類的方式來產生多個候選區域(每個區域是一個點集),在每個候選區域內采用 PointNet 來提取點的特征。這個過程以一種層級化的方式重復多次,每一次聚類算法輸出的多個點集都被當做抽象后的點云再進行下一次處理(Set Abstraction,SA)。這樣得到的點特征具有較大的感受野,包含了局部鄰域內豐富的上下文信息。最后,在多層 SA 輸出的點集上進行PointNet分類,以區分物體和背景。同樣的,這個方法也可以做點云分割。
PointNet 網絡結構
PointNet++ 網絡結構與 VoxelNet 相比,PointNet++ 的優點在于:1,沒有量化帶來的信息損失,也無需調節量化超參數;2,忽略空白區域,避免了無效的計算。但是缺點也顯而易見:1,無法利用成熟的基于空間卷積的2D物體檢測算法;2,雖然避免了無效計算,但是GPU對于點云的處理效率遠低于網格數據,因此實際的運行速度甚至更慢。發展期(2018 年 - 2020 年)在 VoxelNet 和 PointNet++ 相繼提出后,3D 物體檢測領域迎來了一個快速發展期,很多算法被提出,用來改進這兩個工作中的不足。對 Voxel 方法的改進VoxelNet 的主要問題在于數據表示比較低效,中間層的 3D 卷積計算量太大,導致其運行速度只有大約 2FPS(Frame Per Second),遠低于實時性的要求,因此后續很多工作針對其運行效率的問題進行了改進。SECOND 采用稀疏卷積策略,避免了空白區域的無效計算,將運行速度提升到了 26 FPS,同時也降低了顯存的使用量。PIXOR 提出通過手工設計的方式,將 3D 的 Voxel 壓縮到 2D 的 Pixel。這樣做避免了 3D 卷積,但是損失了高度方向上的信息,導致檢測準確度下降很多。PointPillar 的思路也是 3D 轉 2D,也就是將點 3D 云量化到 2D 的 XY 平面網格。但是與 PIXOR 手工設計特征的方式不同,PointPillar 把落到每個網格內的點直接疊放在一起,形象的稱其為柱子(Pillar),然后利用與 PointNet 相似的方式來學習特征,最后再把學到的特征向量映射回網格坐標上,得到與圖像類似的數據。這樣做一來避免了 VoxelNet 中的 3D 卷積和空白區域的無效計算(運行速度達到 62 FPS),二來避免了手工設計特征導致信息丟失和網絡適應性不強的問題,可以說是很巧妙的思路。不好的方面是,點特征的學習被限制在網格內,無法有效的提取鄰域的上下文信息。

PointPillar 網絡結構對 Point 方法的改進PointNet++ 采用基于聚類的方法來層級化的提取鄰域特征以及獲得物體候選,這種做法效率比較低,而且也很難做并行加速。而這恰巧是傳統的 2D 卷積網絡的強項,因此后續的工作逐漸將 2D 物體檢測算法中的一些思路拿過來,用來解決 PointNet++ 中的問題。Point-RCNN 首先在這個方向了進行了探索,可以稱得上 3D 物體檢測領域的又一個里程碑式的工作。從名字上就能看出,這個方法將點云處理和 2D 物體檢測領域的開山之作 Faster RCNN 結合了起來。首先,PointNet++ 被用來提取點特征。點特征被用來進行前景分割,以區分物體上的點和背景點。同時,每個前景點也會輸出一個 3D 候選 BBox。接下來就是將候選 BBox 內的點再做進一步的特征提取,輸出 BBox 所屬的物體類別,并且對其位置,大小進行細化。看到這里,熟悉 2D 物體檢測的朋友肯定會說,這不就是一個典型的兩階段檢測模型嘛。沒錯,但不同的是,Point-RCNN 只在前景點上生成候選,這樣避免了 3D 空間中生成稠密候選框所帶來的巨大計算量。盡管如此,作為一個兩階段的檢測器,加上 PointNet++ 本身較大的計算量,Point-RCNN的運行效率依然不高,只有大約13FPS 。Point-RCNN后來被擴展為Part-A2[11],速度和準確度都有一定的提升。

Point-RCNN 網絡結構3D-SSD 通過對之前 Point-based 方法的各個模塊進行分析,得出結論:FP(Feature Propagation)層和細化層(Refinement)是系統運行速度的瓶頸。FP 層的作用是將 SA 層抽象后的點特征再映射回原始的點云,可以理解為上圖中 Point-RCNN 的 Point Cloud Decoder。這一步非常必要,因為 SA 輸出的抽象點并不能很好的覆蓋所有的物體,會導致很大的信息丟失。3D-SSD 提出了一種新的聚類方法,同時考慮點與點之間在幾何空間和特征空間的相似度。通過這種改進的聚類方法,SA 層的輸出可以直接用來生成物體 Proposal,避免了 FP 層帶來的大計算量。同時,為了避免 Refinement 階段的 Region Pooling,3D-SSD 直接采用 SA 輸出的代表點,利用前面提到了改進聚類算法找到其鄰域點,用一個簡單的 MLP 來預測類別和物體框 3D BBox。3D-SSD 可以認為是一個 Anchor-Free 的單階段檢測器,這也符合整個物體檢測領域的發展趨勢。通過以上改進,3D-SSD 的運行速度可以達到 25FPS。

3D-SSD 網絡結構對于非結構化的點云數據,用圖模型來表示也是一種很自然的想法。但是圖神經網絡相對比較復雜,雖然近些年發展也很快,但是在 3D 物體檢測上的工作并不多。PointGNN 是其中一個比較典型的工作。其流程主要分為三步:首先根據一個預設的距離閾值來建立圖模型;然后更新每個頂點以獲取鄰域點的信息,用來檢測物體類別和位置,最后融合多個頂點輸出的 3D 物體框,作為最終的檢測結果。這種基于圖模型的方法在思路上非常新穎,但是訓練和推理過程的計算量太大。論文中指出完成一次訓練需要花費將近一周的時間,這大大降低了該類方法的實用性。

PointGNN 網絡結構Voxel 和 Point 方法的融合以上回顧了 Voxel-based 和 Point-based 兩個主要方向上的改進。其實,在這個階段,研究者已經有意無意的將兩種策略進行融合,以取長補短。PointPillar 就是一個例子,雖然點云被按照類似 Voxel 的方式進行量化,但是點特征的學習是采用類似 PointNet 的方式。雖然說算法的性能并不是最好的,但是其思路還是非常值得思考的。沿著這個方向,后續又出現了很多不錯的工作。在介紹更多的工作之前,有必要來總結一下之前的代表性方法,看看它們在檢測率和速度上的對比如何。這里我們采用行業內最流行的 KITTI 數據庫來作為評測的基準。至于更大規模和更針對自動駕駛應用的 nuScenes 和 Waymo 數據庫,我們留在后面再討論。KITTI 采用 Velodyne 激光雷達,在城市道路環境下采集數據,其 3D 物體識別任務的類別包括車輛,行人和騎車的人。因為早期一些算法只提供了車輛檢測的正確率,因此這里我們就只對比車輛這個類別。這里算法的準確度采用中等難度測試集上的 AP 作為指標,而速度則采用 FPS 來衡量,這兩個指標都是越高越好。
VoxelNet | SECOND | PointPillar | PointRCNN | 3D-SSD | |
準確度(AP) | 64.17% | 75.96% | 74.31% | 75.64% | 79.57% |
速度(FPS) | 2.0 | 26.3 | 62.0 | 10.0 | 25.0 |
?從上表的對比中可以看出,基于Voxel的方法速度較快,準確度偏低。基于 Point 的方法速度明顯偏慢,但是準確度相對較高。一個成功的算法要同時考慮速度和準確度,在兩者之間尋求最優的平衡。
那么再來回顧一下 Voxel 和 Point 的主要問題。前者非常依賴于量化的參數:網格大的話信息損失比較大,網格小的話的計算量和內存使用量又非常高。后者很難提取鄰域的上下文特征,并且內存的訪問是不規則的(大約 80% 的運行時間都耗費在數據構建,而不是真正的特征提取上)。因此,兩者融合的基本思路是:利用較低分辨率的 Voxel 來提取上下文特征(比如 PV-CNN )或者生成物體候選(Fast Point RCNN ),或者二者兼有(比如 PV-RCNN,SA-SSD),然后再與原始的點云結合,這樣單個點的特征和點點之間的空間關系也可以同時保留。在 PV-CNN 中,一個分支采用低分辨率的 Voxel 來提取具有鄰域信息的特征,然后再通過插值的方法映射回每個點上。另一個分支直接從原始點出發,利用MLP來提取點特征,這時雖然沒有鄰域信息,但是單個點的特征提取是相對精確的。最后把兩個分支的特征進行拼接,作為下一步的輸入。?

PV-CNN 網絡結構類似的,PV-RCNN 的一個分支將點云量化到不同分辨率的 Voxel,以提取上下文特征和生成 3D 物體候選。另外一條分支上采用類似于 PointNet++ 中 Set Abstraction 的操作來提取點特征。這里比較特別的是,每個點的領域點并不是原始點云中的點,而是 Voxel 中的點。由于 Voxel 中的點具有多分辨率的上下文信息,點特征提取也就同時兼顧了單個點以及鄰域信息,這與 PV-CNN 中的思路是類似的。值得一提的是,PV-RCNN 和 Fast Point RCNN 都屬于兩階段的檢測方法,有一個 ROI Pooling 的步驟,因此運行速度會收到影響(PV-RCNN 只有 12.5 FPS,Fast Point R-CNN 也只有 16.7 FPS)。

PV-RCNN 網絡結構SA-SSD 通過附加的前景分割和物體中心點估計任務引導 Voxel 分支去更好的學習點特征和利用點之間的空間關系,同時也避免了 3D 物體候選框和 ROI Pooling 步驟。作為一個單階段的檢測器,SA-SSD 可以達到 25 FPS,準確度也僅比 PV-RCNN 略低(79.79% vs. 81.43%)。
SA-SSD 網絡結構落地期(2020 年至今)在之前的快速發展期中,3D 物體檢測的各種策略都被充分的研究和實驗,人們也獲得了很多寶貴的經驗。那么,下一步很自然就是需要確定最優的策略,以及如何將算法與實際的應用相結合。因此,在這一階段,研究的重心開始往算法的實用性上和可落地性上轉移。針對自動駕駛應用來說,基于激光雷達的 3D 物體檢測一方面是重要的感知信號來源,是自動駕駛系統的核心之一,因此我們需要充分的考慮實時性和準確性的平衡。
另一方面,激光雷達在很多時候會作為輔助的傳感器來輔助離線的數據標注。比如,毫米波雷達的點云非常稀疏,底層數據又無法直觀的理解,因此很難在其上進行精確的物體標注。這個時候激光雷達或者攝像頭的輔助就變得非常重要。一般來說,自動的物體檢測算法會和人工標注進行結合,以提高標注效率。在這種應用中,最關注的是檢測算法的準確度而不是速度。因此,個人認為現階段 3D 物體檢測的發展有兩個趨勢:一個是追求速度和準確度的平衡,另一個是在保證一定速度的前提下最大化準確度。前者一般會采用 Voxel 加單階段檢測器,后者一般會融合 Voxel 和 Point,甚至采用兩階段的檢測器,以獲得更為精細的物體框。下面結合幾個 2021 年最新的工作,來做進一步的分析。SIENet 是一個基于 Voxel 和 Point 融合的兩階段檢測方法,其融合策略與 PV-RCNN 相似。為了解決遠處物體點云相對稀疏的問題,SIENet 采用了一個附加分支,將 Voxel 的網格看做額外的點,以此來對遠處物體進行補全。SIENet 在 KITTI 車輛檢測上的 AP 為 81.71%,但是速度只有 12.5 FPS,基本上與 PV-RCNN 相當。

SIENet 網絡結構Voxel R-CNN 也是一個兩階段檢測器,但是只采用了 Voxel 來做特征提取,其結構更加簡潔。通過一個特別設計的 Voxel ROI Pooling 模塊,該方法可以進一步提高物體檢測的精確度。其余的部分與一般的基于 Voxel 方法非常相似,這里就不詳細描述了。Voxel RCNN 在 KITTI 車輛檢測上的 AP 為81.62%,與 SIENet 相當,但是速度提升了一倍,達到 25.2 FPS。

Voxel R-CNN 網絡結構 CIA-SSD 是一個基于 Voxel 的單階段檢測方法。其特征提取階段與 SECOND 類似,都是采用稀疏 3D 卷積。不同的是 CIA-SSD 將網格內點的均值作為起始特征(沒有采用 VoxelNet 中的多階段 MLP),而且通過不斷降低空間分辨率來進一步減少計算量,最后將Z方向的特征拼接以得到 2D 特征圖(類似 VoxelNet 中的做法)。作為一個單階段的檢測器,CIA-SSD 借鑒了圖像物體檢測領域的一些技巧。比如,為了更好的提取空間和語義特征,CIA-SSD 采用了一種類似于 Feature Pyramid Network (FPN)的結構,當然這里的細節設計稍微復雜一些。此外,為了解決單階段檢測器分類置信度和定位準確度之間的差異問題,CIA- SSD 采用了 IoU 預測分支,以修正分類的置信度和輔助 NMS。結合以上這些策略,CIA-SSD 在 KITTI 車輛檢測的 AP 達到 80.28%,速度為 33 FPS。CIA-SSD 之后被擴展為 SE-SSD,速度不變,AP 提升到 82.54%,這其實已經超越了基于 Voxel 和 Point 融合的兩階段檢測器。

CIA-SSD 網絡結構新的數據庫和基準評測以上關于檢測準確度和速度的分析都是基于 KITTI 數據庫。近兩年來,為了更好的評測 3D 物體檢測算法,并且更加貼近自動駕駛場景,工業界構建了兩個更大規模的數據庫:Waymo Open Dataset 和 NuScenes,其數據量比 KITTI高出兩個量級。這兩個數據庫上都組織了 3D 物體識別競賽,使得業界的研究和工程人員可以清楚的了解當前最實用的技術。尤其是 2021 年的 Waymo 3D 物體識別競賽,還特別增加了對運行時間的要求,進一步的強調了算法的可落地性。從近兩屆比賽獲勝的算法來看,基于 Voxel 的單階段方法成為主流,這也與圖像物體檢測領域的發展趨勢相契合。前文介紹的很多技巧,比如輕量級的 Voxel 特征提取,稀疏 3D 卷積,FPN,IoU 預測分支等等,都在獲勝的算法中有所體現。這從另一個側面說明了當前技術的最高水平,也為 3D 物體檢測領域的進一步發展提供了方向。



































