详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection
本文介紹一篇兩階段的3D目標檢測網絡:Voxel R-CNN,論文已收錄于AAAI 2021。 這里重點是理解本文提出的 Voxel RoI pooling。
論文鏈接為:https://arxiv.org/pdf/2012.15712.pdf
項目鏈接為:https://github.com/djiajunustc/Voxel-R-CNN
0. Abstract
這里先給出本文摘要:
3D目標檢測的最新進展在很大程度上取決于如何表示3D數據,即基于體素(voxel-based)或基于點(point-based)的表示。 許多現有的高性能3D檢測器都是基于點的表示,因為這種結構可以更好地保留點的精確位置。 盡管如此,由于點云的無序存儲,往往會導致很高的計算開銷。 相反,基于體素的結構更適合于特征提取,但由于輸入數據被劃分成網格,往往會產生較低的精度。
在本文中,作者提出了一個稍微不同的觀點,作者發現:對原始點的精確定位對于高性能的3D目標檢測來說并不是必不可少的,粗體素粒度也可以達到很高的檢測精度。 考慮到這一點,作者設計了一個簡單但有效的基于體素的目標檢測網絡,即Voxel R-CNN。通過在兩階段方法中充分利用體素特征,最終獲得了與最先進的基于點的模型(PV-RCNN)相當的檢測精度,但計算開銷減少了許多。Voxel R-CNN由3D主干網絡、2D鳥瞰網RPN以及檢測頭組成。作者在本文中設計了一個voxel RoI pooling,可直接從體素特征中提取RoI特征,以便進一步處理。在KITTI數據集和Waymo數據集上的實驗結果表明,與現有的基于體素的方法相比,Voxel R-CNN在保持實時幀處理速率的同時(即在NVIDIA RTX 2080Ti GPU上以25FPS的速度)提供了更高的檢測精度。
1. Introduction & Reflection on 3D Object Detection
( 本文的引言部分和第二部分對3D目標檢測的思考部分這里就不詳細介紹了,大家可以查看原文,我在這里大致總結下。)
首先是引言部分,現在的3D目標檢測大致可以分為兩類:基于體素(voxel-based)的檢測方法有VoxelNet,SECOND,PointPillars,基于原始點的(point-based)檢測方法有STD,PointRCNN,3DSSD,PV-RCNN。從檢測性能來看,基于點的檢測精度更高,相應地計算效率還不是很快。隨著檢測算法的日益成熟,現在有一個新的問題出現了:我們是否能設計一個算法,既能達到基于點檢測的高精度又能實現基于體素檢測一樣高的效率?
下面作者在文中回顧了SECOND和PV-RCNN兩類檢測算法,可以看到SECOND和PV-RCNN在檢測精度上有著很大的差距。兩個檢測算法的主要差異在于:
從表1可以看出添加了檢測頭之后,SECOND的檢測精度提升了0.6%,但是仍然遠低于PV-RCNN,這表明兩階段檢測能提高檢測精度,但是鳥瞰圖仍然不足以對3D物體進行準確表示。表2可以看出,PV-RCNN中作者提出了VSA模塊,這是一個點-體素(point-voxel)特征交互操作,基本消耗了整個運行時間的一半,直接導致檢測效率大幅下降。
簡單總結下:
2. Voxel R-CNN Design (重點)
Voxel R-CNN是基于體素的用于3D目標檢測的兩階段網絡,網絡結構圖如上圖所示。可以看出 Voxel R-CNN由三部分組成:
- 3D骨干網絡
- 2D骨干網絡和(RPN)
- Voxel RoI pooling和 Detect Head。
在Voxel R-CNN中,首先將原始點云劃分為有規則的體素,然后利用3D骨干網絡進行特征提取。 然后將稀疏的3D體素轉換為BEV表示形式,在其上應用2D骨干網和RPN生成3D區域方案。 最后使用Voxel RoI Pooling提取RoI特征,將提取的特征輸入Detect Head以進行進一步優化。下面詳細討論這些模塊。由于本文的主要創新在于Voxel RoI pooling,因此首先對其進行介紹。
2.1 Voxel RoI pooling
Voxel Volumes as Points: 這里先給出了volumes的表示,由非空voxel中心坐標{vi=(xi,yi,zi)}i=1N\left\{\boldsymbol{v}_{i}=\right.\left.\left(x_{i}, y_{i}, z_{i}\right)\right\}_{i=1}^{N}{vi?=(xi?,yi?,zi?)}i=1N?和特征向量{?i}i=1N\left\{\phi_{i}\right\}_{i=1}^{N}{?i?}i=1N?組成。
Voxel Query: 如下圖所示。在之前的最近鄰voxel查找方法中,使用最多的是Ball Query,這里作者提出了Voxel Query,使用曼哈頓距離來進行查找,通過設置曼哈頓距離閾值來采樣KKK個voxels。
假設有兩個voxels :α=(iα,jα,kα)\alpha=\left(i_{\alpha}, j_{\alpha}, k_{\alpha}\right)α=(iα?,jα?,kα?)和β=(iβ,jβ,kβ)\beta=\left(i_{\beta}, j_{\beta}, k_{\beta}\right)β=(iβ?,jβ?,kβ?),兩個voxels之間的曼哈頓距離計算公式為:
Dm(α,β)=∣iα?iβ∣+∣jα?jβ∣+∣kα?kβ∣D_{m}(\alpha, \beta)=\left|i_{\alpha}-i_{\beta}\right|+\left|j_{\alpha}-j_{\beta}\right|+\left|k_{\alpha}-k_{\beta}\right|Dm?(α,β)=∣iα??iβ?∣+∣jα??jβ?∣+∣kα??kβ?∣
假設有NNN個非空voxels,使用Ball Query則時間復雜度為O(N)O(N)O(N),使用voxel query時間復雜度則為O(K)O(K)O(K),最近鄰voxels查找效率上得到了有效改善。
Voxel RoI Pooling Layer: 首先將候選方案劃分為G×G×GG \times G \times GG×G×G個子體素(sub-voxels)。其中心點就是網格點,由于3D特征volumes是很稀疏的,非空voxels大約只占3%空間,不能直接對每個voxel使用最大池化操作。這里作者設計了一個PointNet模塊,將近鄰voxels特征融合到網格點,模塊如下:
ηi=max?k=1,2,?,K{Ψ([vik?gi;?ik])}\boldsymbol{\eta}_{i}=\max _{k=1,2, \cdots, K}\left\{\Psi\left(\left[\boldsymbol{v}_{i}^{k}-\boldsymbol{g}_{i} ; \boldsymbol{\phi}_{i}^{k}\right]\right)\right\}ηi?=k=1,2,?,Kmax?{Ψ([vik??gi?;?ik?])}
其中vik?giv_i^k-g_ivik??gi?表示相對坐標,gig_igi?是網格點坐標,?ik\phi_{i}^{k}?ik?是voxel特征向量,Ψ\PsiΨ表示多層感知機,ηi\eta_{i}ηi?是融合的特征向量。在具體實現上,作者在3D主干網最后兩層提取了voxel特征,并且在每一層使用了兩個不同的曼哈頓距離進行voxel融合,最后將這些不同層不同距離的voxel特征進行融合來獲得RoI特征。
Accelerated Local Aggregation: 在這里作者還提出了一個加速PointNet模塊。如下圖所示,在圖(a)中,假設有MMM個網格點,每一個網格點需要查找KKK個voxels,每個voxel特征向量為C+3C+3C+3,融合后的特征向量為C′C^{\prime}C′。則時間復雜度為O(M×K×(C+3)×C′)O\left(M \times K \times(C+3) \times C^{\prime}\right)O(M×K×(C+3)×C′)。
在圖(b)中,將voxel特征和相對坐標進行拆分,由于特征向量和網格點是相互獨立的,我們對每個voxel進行特征變換,則此時間復雜的為O(N×C×C′)O\left(N \times C \times C^{\prime}\right)O(N×C×C′);進行voxel query后,我們對相應voxel進行位置特征轉換,此時間復雜度為O(M×K×3×C′)O\left(M \times K \times 3 \times C^{\prime}\right)O(M×K×3×C′),最終時間復雜度為O(N×C×C′+M×K×3×C′)O\left(N \times C \times C^{\prime} + M \times K \times 3 \times C^{\prime}\right)O(N×C×C′+M×K×3×C′),由于M×KM \times KM×K高出NNN一個數量級,所以其時間復雜度小于O(M×K×(C+3)×C′)O\left(M \times K \times(C+3) \times C^{\prime}\right)O(M×K×(C+3)×C′)。
2.2 Training Objectives
( 本節的主干網和區域方案部分以及檢測頭這里就不詳細介紹了,大家可以查看原文,這里對損失函數進行介紹。)
Losses of RPN: RPN損失函數為分類損失和回歸損失,函數為:
LRPN=1Nfg[∑iLcls(pia,ci?)+1(ci?≥1)∑iLreg(δia,ti?)]\mathcal{L}_{\mathrm{RPN}}=\frac{1}{N_{\mathrm{fg}}}\left[\sum_{i} \mathcal{L}_{\mathrm{cls}}\left(p_{i}^{a}, c_{i}^{*}\right)+\mathbb{1}\left(c_{i}^{*} \geq 1\right) \sum_{i} \mathcal{L}_{\mathrm{reg}}\left(\delta_{i}^{a}, t_{i}^{*}\right)\right]LRPN?=Nfg?1?[i∑?Lcls?(pia?,ci??)+1(ci??≥1)i∑?Lreg?(δia?,ti??)]
其中NfgN_{fg}Nfg?為前景anchors數量,piap_{i}^{a}pia?和δia\delta_{i}^{a}δia?是分類和回歸輸出,ci?c_{i}^{*}ci??和ti?t_{i}^{*}ti??是對應分類和回歸目標。1(ci?≥1)\mathbb{1}\left(c_{i}^{*} \geq 1\right)1(ci??≥1)表示只計算前景anchors的回歸損失。分類損失函數為Focal Loss,回歸損失函數為Huber Loss。
Losses of detect head: 第二階段置信度函數為:
li?(IoUi)={0IoUi<θLIoUi?θLθH?θLθL≤IoUi<θH1IoUi>θHl_{i}^{*}\left(\mathrm{IoU}_{i}\right)=\left\{\begin{array}{ll}0 & \mathrm{IoU}_{i}<\theta_{L} \\\frac{\mathrm{IoU}_{i}-\theta_{L}}{\theta_{H}-\theta_{L}} & \theta_{L} \leq \mathrm{IoU}_{i}<\theta_{H} \\1 & \mathrm{IoU}_{i}>\theta_{H}\end{array}\right.li??(IoUi?)=????0θH??θL?IoUi??θL??1?IoUi?<θL?θL?≤IoUi?<θH?IoUi?>θH??
其中IoUi\mathrm{IoU}_{i}IoUi?是第iii個方案和對應真值框的IoU\mathrm{IoU}IoU。θH\theta_HθH?和θL\theta_LθL?是前景IoU\mathrm{IoU}IoU和背景IoU\mathrm{IoU}IoU的閾值。置信度預測為二分類交叉熵函數,回歸損失為Huber Loss,最終的損失函數為:
Lhead?=1Ns[∑iLcls?(pi,li?(IoU?i))+1(IoU?i≥θreg?)∑iLreg?(δi,ti?)]\begin{aligned}\mathcal{L}_{\text {head }}=& \frac{1}{N_{s}}\left[\sum_{i} \mathcal{L}_{\text {cls }}\left(p_{i}, l_{i}^{*}\left(\operatorname{IoU}_{i}\right)\right)\right.\left.+\mathbb{1}\left(\operatorname{IoU}_{i} \geq \theta_{\text {reg }}\right) \sum_{i} \mathcal{L}_{\text {reg }}\left(\delta_{i}, t_{i}^{*}\right)\right]\end{aligned}Lhead??=?Ns?1?[i∑?Lcls??(pi?,li??(IoUi?))+1(IoUi?≥θreg??)i∑?Lreg??(δi?,ti??)]?
其中NsN_sNs?是訓練階段的采樣區域方案數量,1(IoU?i≥θreg)\mathbb{1}\left(\operatorname{IoU}_{i} \geq \theta_{r e g}\right)1(IoUi?≥θreg?)表示只計算IoU\mathrm{IoU}IoU大于θreg\theta_{reg}θreg?的區域方案。
3. Experiments
實驗部分,作者分別在KITTI和Waymo數據集上進行了驗證,實驗細節這里不介紹了,可以查看代碼和論文,下面幾張表是實驗結果。
下表是Voxel R-CNN在KITTI數據集上的排名情況,在開源項目中目前暫列第一(截至2021-03-01)。
最后作者做了一些分析實驗,對本分提出的voxel query和accelerated PointNet進行了實驗分析,下面對表格中的5種方法實驗結果進行總結:
- ( a )在BEV特征上進行一階段檢測,效率很快,但精度不高。
- ( b )添加檢測頭,精度得到了提高,但使用了ball querry和原始PointNet Module,效率下降很多。
- ( c )使用voxel query,效率得到提高。
- ( d )使用加速PointNet Module,效率進一步提高。
- ( e )本文提出的 Voxel R-CNN,取得了最好的檢測性能,同時也取得了voxel-based 方法中最快的檢測效率。
總結
以上是生活随笔為你收集整理的详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直播间粉丝超2000万 新东方主播董宇辉
- 下一篇: 动手学无人驾驶(4):基于激光雷达点云数