详解两阶段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是一阶段检测算法,PV-RCNN是两阶段检测算法,PV-RCNN使用了检测头进行检测的进一步优化。
  2. PV-RCCN中的关键点保留了3D结构信息,而SECOND是在鸟瞰图(BEV)上进行检测。

从表1可以看出添加了检测头之后,SECOND的检测精度提升了0.6%,但是仍然远低于PV-RCNN,这表明两阶段检测能提高检测精度,但是鸟瞰图仍然不足以对3D物体进行准确表示。表2可以看出,PV-RCNN中作者提出了VSA模块,这是一个点-体素(point-voxel)特征交互操作,基本消耗了整个运行时间的一半,直接导致检测效率大幅下降。

简单总结下:

  1. 3D结构对于3D检测器来说至关重要,而鸟瞰图表示不足以精准预测bounding-box。
  2. point-voxel特征计算非常耗时,影响着检测效率,最终作者在本文提出了一个voxel-only的3D检测器。
在这里插入图片描述 在这里插入图片描述

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中心坐标

{

v

i

=

(

x

i

,

y

i

,

z

i

)

}

i

=

1

N

\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

=

1

N

\left\{\phi_{i}\right\}_{i=1}^{N}

{ϕi​}i=1N​组成。

Voxel Query: 如下图所示。在之前的最近邻voxel查找方法中,使用最多的是Ball Query,这里作者提出了Voxel Query,使用曼哈顿距离来进行查找,通过设置曼哈顿距离阈值来采样

K

K

K个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之间的曼哈顿距离计算公式为:

D

m

(

α

,

β

)

=

∣

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β​∣

假设有

N

N

N个非空voxels,使用Ball Query则时间复杂度为

O

(

N

)

O(N)

O(N),使用voxel query时间复杂度则为

O

(

K

)

O(K)

O(K),最近邻voxels查找效率上得到了有效改善。

在这里插入图片描述
Voxel RoI Pooling Layer: 首先将候选方案划分为

G

×

G

×

G

G \times G \times G

G×G×G个子体素(sub-voxels)。其中心点就是网格点,由于3D特征volumes是很稀疏的,非空voxels大约只占3%空间,不能直接对每个voxel使用最大池化操作。这里作者设计了一个PointNet模块,将近邻voxels特征融合到网格点,模块如下:

η

i

=

max

⁡

k

=

1

,

2

,

⋯
 

,

K

{

Ψ

(

[

v

i

k

−

g

i

;

ϕ

i

k

]

)

}

\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​])}

其中

v

i

k

−

g

i

v_i^k-g_i

vik​−gi​表示相对坐标,

g

i

g_i

gi​是网格点坐标,

ϕ

i

k

\phi_{i}^{k}

ϕik​是voxel特征向量,

Ψ

\Psi

Ψ表示多层感知机,

η

i

\eta_{i}

ηi​是融合的特征向量。在具体实现上,作者在3D主干网最后两层提取了voxel特征,并且在每一层使用了两个不同的曼哈顿距离进行voxel融合,最后将这些不同层不同距离的voxel特征进行融合来获得RoI特征。

Accelerated Local Aggregation: 在这里作者还提出了一个加速PointNet模块。如下图所示,在图(a)中,假设有

M

M

M个网格点,每一个网格点需要查找

K

K

K个voxels,每个voxel特征向量为

C

+

3

C+3

C+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

×

K

M \times K

M×K高出

N

N

N一个数量级,所以其时间复杂度小于

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损失函数为分类损失和回归损失,函数为:

L

R

P

N

=

1

N

f

g

[

∑

i

L

c

l

s

(

p

i

a

,

c

i

∗

)

+

1

(

c

i

∗

≥

1

)

∑

i

L

r

e

g

(

δ

i

a

,

t

i

∗

)

]

\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∗​)]

其中

N

f

g

N_{fg}

Nfg​为前景anchors数量,

p

i

a

p_{i}^{a}

pia​和

δ

i

a

\delta_{i}^{a}

δia​是分类和回归输出,

c

i

∗

c_{i}^{*}

ci∗​和

t

i

∗

t_{i}^{*}

ti∗​是对应分类和回归目标。

1

(

c

i

∗

≥

1

)

\mathbb{1}\left(c_{i}^{*} \geq 1\right)

1(ci∗​≥1)表示只计算前景anchors的回归损失。分类损失函数为Focal Loss,回归损失函数为Huber Loss。

Losses of detect head: 第二阶段置信度函数为:

l

i

∗

(

I

o

U

i

)

=

{

0

I

o

U

i

<

θ

L

I

o

U

i

−

θ

L

θ

H

−

θ

L

θ

L

≤

I

o

U

i

<

θ

H

1

I

o

U

i

>

θ

H

l_{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​​

其中

I

o

U

i

\mathrm{IoU}_{i}

IoUi​是第

i

i

i个方案和对应真值框的

I

o

U

\mathrm{IoU}

IoU。

θ

H

\theta_H

θH​和

θ

L

\theta_L

θL​是前景

I

o

U

\mathrm{IoU}

IoU和背景

I

o

U

\mathrm{IoU}

IoU的阈值。置信度预测为二分类交叉熵函数,回归损失为Huber Loss,最终的损失函数为:

L

head 

=

1

N

s

[

∑

i

L

cls 

(

p

i

,

l

i

∗

(

IoU

⁡

i

)

)

+

1

(

IoU

⁡

i

≥

θ

reg 

)

∑

i

L

reg 

(

δ

i

,

t

i

∗

)

]

\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∗​)]​

其中

N

s

N_s

Ns​是训练阶段的采样区域方案数量,

1

(

IoU

⁡

i

≥

θ

r

e

g

)

\mathbb{1}\left(\operatorname{IoU}_{i} \geq \theta_{r e g}\right)

1(IoUi​≥θreg​)表示只计算

I

o

U

\mathrm{IoU}

IoU大于

θ

r

e

g

\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 方法中最快的检测效率。

在这里插入图片描述

版权声明:本文为CSDN博主「自动驾驶小学生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cg129054036/article/details/114271897

相关推荐

【MV-3D】----多视图的3D目标检测网络

一、前言
目前主流的空间点云检测主要有两种。一种是直接以三维点云作为输入,直接送入卷积网络或者转化为体素送入。另一种是将3D点云映射到2D,主要为鸟瞰图或者前视图。一般来说第一种方法目标的检测信息比较丰富&#xff

MMdet 网络集简介

mmdet网络简介:
一、模块化设计 我们将检测框架分解成不同的组件,通过组合不同的模块,可以很容易地构建自定义的对象检测框架。
二、支持多个框架开箱即用 工具箱直接支持流行的和当代的检测框架&#x