Voxel R-CNN

Voxel R-CNN: Towards High Performance Voxel-based 3D Object Detection

Voxel R-CNN: Towards High Performance Voxel-based 3D Object Detection,2021年论文已收录于AAAI 2021。论文提出了Voxel R-CNN模型,该模型是两阶段3D目标检测模型,基于SECOND以及PV-RCNN模型。论文提出3D点云目标检测大致可以分为基于点的检测方法和基于体素的检测方法,其中基于点的方法有着更高的检测精度,但是速度较慢。基于体素的方法有着较高的检测速度,但是精度较低。模型希望构建在速度和精度方面均衡的模型,达到体素模型的速度以及点模型的精度,因此提出了Voxel-RCNN模型,在SECOND模型的基础上添加了3D特征,完成了高效且高精度模型的构建,至今(2023年5月21日)仍然作为3D目标检测模型的经典baseline。

本文在SECOND模型介绍的基础上对于Voxel R-CNN论文进行精读。如果对SECOND模型不了解的同学可以看我上两篇文章:

基于Opean-pcdet的SECOND代码精讲:https://blog.csdn.net/qq_44080282/article/details/130687784?spm=1001.2014.3001.5502

SEOND模型理论——稀疏卷积&方向损失:https://blog.csdn.net/qq_44080282/article/details/130461447?spm=1001.2014.3001.5502

原始论文信息:

论文链接:https://arxiv.org/pdf/2012.15712.pdf

项目链接:https://github.com/djiajunustc/Voxel-R-CNN

ps:文章中的我们指Voxel R-CNN的作者。

Abstract

3D目标检测进展:3D目标检测最近的进展很大程依赖用于3D数据的表示形式,大致分类基于点的表示形式基于体素的表示形式

基于点的表示方法:目前高性能的检测器是基于点的检测器,因为这样的方法能够更好的保留点云结构信息,从而提升模型的精度。然而,点级别的特征会带来高的计算开销。

基于体素的表示方法:与之相反,基于体素的结构更适合特征提取,且速度更快,但是常常因为数据被分到各个网格中而产生精度下降。

论文构思:我们发现精确的原始点位置信息对于高性能的3D目标检测不是必要的。粗粒度的体素表示形式也可以提供充足的检测特征需求。

模型提出:基于这个发现,我们提出了简单且高效的基于体素的框架Voxel R-CNN。通过充分在两阶段方法中利用体素特征,我们的方法实现与SOTA方法相当的精确度,但是更小的计算开销

模型构成:Voxel R-CNN包括3D骨干网络2D区域建议网络和一个检测头。voxel RoI pooling来直接从体素中获取RoI特征进行进一步精炼。

**模型效果:**我们在KITTI数据集和Waymo数据集上进行了实验,结果显示我们的模型有着更高的检测精度和更快的检测速度。

1 Introduction

**3D目标检测的背景和挑战:**3D目标检测在各个领域都有着应用。深度学习的发展对2D图像检测带来了革命性的提升,但是这些大部分方法无法直接应用于3D目标检测,特别是应对稀疏且无序的3D点云数据。另外,3D目标检测器通常需要完成高效检测任务,这使得设计3D检测器来检测大规模空间成为难点。

现存方法分类:现存的检测方法可以分为两大类,基于体素的方法和基于点的方法。

  • 基于体素的方法:将点云处理成规则的体素网格,这样的形式便于使用CNN进行特征提取,相比于基于点的方法更加快速。但是这样的方法常常存在信息损失导致检查精度损失

  • 基于点的方法:现存的SOTA方法通常采用基于点的方法。这样的方法以原始点云作为输入,使用采样和组织的方法对点云数据进行特征提取。通常认为基于点的方法可以充分保留点之间的结构信息,这样的结构信息对于检测而言是至关重要的,因此基于点的方法通常精度更高。但是这样的方法也存在一定的缺陷,由于点形式的表示,点间关系的查询过程需要巨大的时间开销,这样的方法是低效的。

模型初步构思:随着检测算法的成熟,我们计划将这些算法应用在现实环境中。我们希望构建一个模型,有着基于点方法的精确度并且有着体素方法的效率。基于此,我们决定使用基于体素的方法,在此基础上去提升模型的精准度。我们认为:精确的点位置结构信息虽然是很好的,但是对于精准的3D目标检测非必要。

SEOND结构图

STD以及PV-RCNN以及Voxel R-CNN对比

发现问题:基于上述图,我们观察到,基于体素的方法尽管输入的是3D信息,最终通常在BEV图进行预测。而基于点的方法还原点结果信息去进行预测精炼。可以看到STD方法直接使用原始点作为模型处理数据形式,处理过程中记录了点精细位置信息,指导体素化后的的检测。PV-RCNN中在3D骨干网络部分也获取了基于点级别的3D空间位置信息,使用该信息产生RoI网格区域。我们发现现存体素方法的关键缺陷在于将3D特征转化到2D图后没有保留3D结果信息

模型构建:基于上述缺陷,我们提出了从3D体素特征中聚合3D结构质地信息。我们提出了Voxel R-CNN模型。

Voxel R-CNN具体结构:

  1. 3D骨干网络

  2. 2D骨干网络以及RPN

  3. 带有 voxel RoI pooling的检测头

其中3D骨干网络获取3D体素特征。2D骨干网络和RPN生成浓密的区域建议信息。之后RoI特征由 voxel RoI pooling在3D体素特征中直接获取。

在设计voxel RoI pooling的时候,我们设计了利用局部样本属性来聚合局部样本信息(Voxel Query + Voxel RoI Pooling)并设计了高效的局部聚合方法(Accelerated Local Aggregation)来加速这个过程。最终3D的RoI特征用于进一步精炼边界框。

简单来说,模型总共提出了4个创新点:

detect head:将原始的单阶段检测转变为两阶段检测,提升检测精度。

Voxel RoI pooling:获取3DRoI特征,保留3D空间特征,用于精炼初始检测结果,提升检测精度。

voxel query:球状查询换成体素查询,加快近邻体素查询过程,提升模型速度。

Accelerated Local Aggregation:浓密特征分割为位置特征与内容特征,分布进行处理融合,加快局部聚合过程提升模型速度。

**贡献:**我们主要的贡献是设计了Voxel-R-CNN,在速度和精度直接进行了平衡。最后的实验也证明了我们的观点:精确的点位置信息对于高性能3D目标检测是非必要的,粗粒度的体素表示也能提供充足的空间语义信息。我们的工作可以作为一个简单高效的baseline去进一步探索之后的研究工作 。

2 Reflflection on 3D Object Detection

这一节,我们回顾两个方法的baselines,并且提出能够提升检测器性能的关键点。

2.1 Revisiting

**SECOND:**没啥好说的,体素化,VFE,3D骨干网络(稀疏卷积),2D区域建议网络,检测头完成分类、回顾和方法分类任务。

SEOCND结构

PV-RCNN:PV-RCNN通过向SECOND中添加了关键分支保留3D结构信息。VSA模块整合多尺寸的3D体素信息,之后使用RoI网格池化进行box精炼。

PV-RCNN

2.2 Analysis

分析两个模型差距:

  • SECOND是一阶段模型,而PVRCNN使用了检测头精炼检测结果。
  • PV-RCNN中使用了关键点去保留3D结构信息,而SECOND直接在BEV结果上进行检测。

为了验证box精炼的影响,我们向SECOND中添加了检测头。

预先实验结果

直接添加了检测头之后,在中等难度有了0.6的提升,但是与PV-RCNN结果还有距离。这证明了box精炼的效率并且展示了BEV 的表达能力受到了限制。

VSA耗时

在PV-RCNN中整合了点结构信息,但是这个过程需要很大的计算开销。这也使得PV-RCNN的速度远不如SECOND的速度。

找到不足 :总的来说,通过分析BEV的表示的限制以及PV-RCNN的时间开销,我们观察到以下几点:

  • 3D结构信息对于3D检测器而言非常重要,BEV表示不足以精确地预测3D空间中的边界框。
  • 点-体素的特征融合时间开销是巨大的,影响了检测器整体的效率。

3 Voxel R-CNN Design

Voxel-RCNN模型整体结构

检测器类型:Voxel R-CNN是基于体素两阶段目标检测框架。

整体包括:

  • 3D骨干网络
  • 2D骨干网络和RPN
  • 体素RoI池化和box精炼子网络

运行流程:

  • 首先将点云划分成规则的体素表示并且利用3D骨干网络进行特征提取。
  • 之后将3D的体素转化到BEV表示,在BEV上我们利用2D骨干网络和RPN网络生成3D区域建议。
  • 最后我们使用体素RoI池化获取RoI特征,送入子网络优化检测结果。

3.0先前阶段概述

参考我的:(90条消息) 基于Opean-PCDDet的SECOND模型_'十月’的博客-CSDN博客

这是一个详细一点的概述,因为是在SECOND模型上进行改进的,其他部分有很多相同的地方,这里直接使用之间对应Opean-pedet项目中的SECOND构造方法进行概述:

一: Point Cloud Grouping数据处理完成点云体素化

二: Mean VFE 体素特征编码

三: VoxelBackBone8x,3D骨干网络,用于提取体素特征

四: HeightCompression Z轴方向压缩,3D转2D

五: BaseBEVBackbone2D特征提取网络

六: AnchorHeadTemplate锚框检测头模板

七:Anchor_head_single利用2D特征进行检测分类以及回归

八:Detector3DTemplate构建模型

其中1-5都是相同的。

3.1 Voxel RoI pooling

目的:直接从3D体素中聚合空间上下文信息。

  • Voxel Volumes as Points:我们使用非空的体素中心点表示体素和他们对应的特征向量。 使用indices, voxel sizes 和 pointcloud boundaries,也就是体素索引,体素尺寸以及空间范围去表示各个空间中各个体素的位置信息以及索引信息。

  • Voxel Query:我们提出了体素查询的操作来从3D体素特征中寻找相邻的体素。

体素查询

构思:与无序的点云相比,体素是规整分布在量化空间中的,很容易能够找到相邻的体素。例如可以向体素中添加相邻体素偏移信息,通过偏移很容易能够发现相邻的体素。基于体素表示的优势,我们提出了体素查询,以每个体素为查询点,通过索引变化就能够高效地寻找到临近的体素。

**构建:**体素查询使用Manhattan distance,在一个距离阈值内采用k个体素。

曼哈顿距离:

Dm(α, β) = |iα iβ| + |jα jβ| + |kα *kβ|.

**优势:**对于N个非空体素而言,球状查询需要O(n)的时间复杂度查找到邻居体素,而体素查询只需要O(k)的时间复杂度。领域属性使得我们使用体素查询组织相邻体素相比于球状查询更加高效。

  • Voxel RoI Pooling Layer:我们设计了voxel RoI pooling层,用于体素RoI区域池化。

初始Voxel RoI Pooling Layer

字符意义:

总共有M个网格点(M=rxGxGxG),r是RoI区域的数量G是网格的尺寸。

每个网格点需要整合局部K个体素的信息。

N是所有体素(C+3),3代表位置信息,C代表特征信息。

将这K个局部体素信息维度从C+3拓展到C’

==时间复杂度:==M个网格,每个网格查询周围的K个体素信息,使用FC将K个体素的(C+3)维特征变化到C‘维度。时间复杂度为O(M x K x (C+3) x C’)

构思:我们首先将建议区域划分为GGG的规则子体素,以中心点代表各个体素。因为3D特征十分稀疏,我们不能直接在子体素集合中使用最大池化。我们从相邻的体素中整合局部信息作为网格点的特征提取。这里池化用于聚合局部信息,最大池化结果不能合适地代表部分局部区域,但是可以获取部分区域特征进行整合作为该区域特征。

设计:具体而言,对于一个网格点,我们使用体素查询得到局部邻居信息,整合这些邻居信息到网格中。我们利用体素RoI池化来从3D骨干网络的最后两个阶段获取体素特征。对于每个阶段,Manhattan distance的阈值都根据组织体素的尺寸设置了多个尺度,最后我们聚合来自不同池化层的特征信息。

  • Accelerated Local Aggregation

初始与加速后结构对比

在使用体素查询的情况下,局部特征聚合还是需要巨大的时间开销。

字符意义:

  • 总共有M个网格点(M=rxGxGxG),r是RoI区域的数量G是网格的尺寸。

  • 每个网格点需要整合局部K个体素的信息。

  • N是所有体素(C+3),3代表位置信息,C代表特征信息。

  • 将这K个局部体素信息维度从C+3拓展到C’

因此我们构建了加速模块来减少复杂的计算开销。如图所示,相关位置信息和体素特征分成了两个分支,体素特征独立于网格点,因此可以划分两个分支进行单独处理。处理过程中,通过一次体素查询可以得到当前处理的网格点对应的K个体素,取索引号就好,根据索引可以得到这些体素的位置信息和特征信息。

位置信息分支:我们首先使用体素查询得到每个网点对应的K个体素位置信息,对于K个体素位置信息进行全连接处理,拓展位置信息的维度到C’,一遍后续进行融合。

特征信息分支:首先使用FC对全部的体素特征信息进行处理(进行维度拓展?),于此同时将通过体素查询得到的各个网格点对应的K个体素的特征信息,同样经过FC或1x1卷积进行维度变化到C’。

信息融合:将位置信息与特征信息进行简单的相加,得到这K个体素的综合信息。最后通过最大池化得到该网格点的聚合局部信息。

加速结构

==原始设计时间复杂度:==M个网格,每个网格查询周围的K个体素信息,使用FC将K个体素的(C+3)维特征变化到C‘维度。时间复杂度为O(M x K x (C+3) x C’) = O(M x K x C x C’ + M x K x 3 x C’ )

加速后时间模型时间复杂度:M个网格,每个网格查询周围的K个体素信息。

位置分支将K个体素的3维位置信息进行拓展:O(M x K x 3 x C‘)

特征分支将K个体素C维特征进行拓展:O(N x C x C’)

改进设计时间复杂度O(M x K x 3 x C‘)+O(N x C x C’) = O(M x K x 3 x C‘ + N x C x C’)

对比:

O(M x K x C x C' + M x K x 3 x C’)
    O(N x C x C' + M x K x 3 x C‘)
相差的就是 MxK 与 N
MxK 比 N高一个数量级,所以改进后时间复杂度更低。

怎么从实际运行流程理解呢,这么说:

改进之前,我每个网格(共M个)在N个体素中查询到了K个体素。我都需要对位置信息和特征信息组合起来的完整特征信息进行处理,每一次查询后,特征和位置时绑定在一起的,我需要同步进行维度变化处理,这时候可能产生冗余。

来举一个栗子改前:比如V3这个网格查询到体素V1是V3相邻的体素,需要进行维度变化处理,好了这里我处理了一次V1了。后面第V2的网格查询后,V1又是相邻的体素,我又需要对V1进行一次维度变化处理,这是计算开销大的来源,不能将V1处理后的结果记录下来。

来举一个栗子改后:我不等到查询,我直接把V1等所有的体素进行一遍特征维度变化处理,得到一个处理之后特征库,也就是说我记录了所有特征拓展后的结果。这时候我们不论是V3还是V2查询到V1这个体素 ,我只需要从特征库中取到这个拓展后的特征即可,这个操作时间开销大大减小。

举个栗子

也就是说,如果3个人想喝果汁,但需要用果子榨汁。

  • 小a想要喝橙汁,去拿了橙子榨了杯橙汁。
  • 小b想要喝西瓜汁,去拿了西瓜榨了西瓜汁。
  • 小c想要喝梨汁,去拿了橙子榨了杯梨汁。

但是这样是比较慢,改进后方式相当于服务员提前将各个果子榨成了汁。剩下了每个人榨汁的工作。

  • 小a想要喝橙汁,直接拿了杯橙汁。
  • 小b想要喝西瓜汁,直接拿了杯西瓜汁。
  • 小c想要喝梨汁,直接拿了杯梨汁。

改进之后,我直接对于所有的体素特征信息进行了处理,我查询得到了每个网格(共M个)在N个体素中查询到了K个体素之后,对于位置信息,我需要进行FC的维度变化处理,但是对于特征信息,我直接拿处理好的根据索引拿处理好的机构就行。这个过程不需要多少时间开销,真是nice啊.

3.2 Backbone and Region Proposal Networks

3D骨干网络进行体素特征的提取。

之后得到张量沿着Z轴压缩,得到BEV图。

2D骨干网络由两部分组成:一个自顶向下的特征提取子网络,由两个标准的3x3卷积层组成和一个多尺度融合子网络,上采样并且聚合特征。

最后2D骨干网络的输出通过1x1卷积生成3D区域建议。

3.3 Detect Head

使用两个MLP完成检测任务。将得到的特征展品,之后特征维度变为分类维度以及回归维度。

RPN

3.4 Training Objectives

  • Losses of RPN

对于前景锚框计算分类和回归的损失,分类损失采用FocalLoss,回归损失采用HuberLoss。

Losses of RPN

  • Losses of detect head.

    对于训练阶段的建议区域,计算分类置信度损失和IoU大于阈值的回归损失。分类置信度损失就是说分类的分数,在低阈值和高阈值之间算均匀分布,高于高阈值得分为1,低于低阈值得分为0。

    这个分数计算如下图所示:

置信度分数计算
实例

4 Experiments

4.1 Datasets

对数据集进行了介绍,包括两个3D目标检测常用的数据集KITTIWaymo Open Dataset

KITTI

在这里插入图片描述

4.2 Implementation Details

Voxelization:包括一些配置,原始的点云数据将首先被处理成体素,之后输入到Voxel-RCNN网络中。

在这里插入图片描述

Network Architecture. :骨干网络设计遵循Second和PV-RCNN。3D骨干网络经过4次下采样,拓展特征维度,减少特征图尺寸。2D骨干网络由两个卷积层构成,每个卷积层有5个卷积块构成,特征维度为(64,128)。以及一些网络结构设计。
在这里插入图片描述

Training:使用Adam optimizer对Voxel R-CNN进行端到端的优化。KITTI训练80个epoch, batch size 16。包括各个超参数设置,步长,优化衰减稀疏,阈值等等。我们随机采样128个RoI区域作为检测头训练样本。其中一半为正样本,其与gtbox的IOU大于阈值。数据增强策略等等参照SECOND和PV-RCNN。在Opean-Pcdet3D目标检测项目基础上实现。

Inference:推断阶段,我们首先在RPN结果上进行NMS。保留前100个区域建议框,之后再次利用NMS排出冗余框。

4.3 Results on KITTI Dataset

我们对比了 Voxel R-CNN和KITTI中SOAT模型。我们的模型做到了速度与精度间最好的平衡,通过充分利用体素的表示,模型实现了81.62%AP在车类别上,并能能够保证实时检测。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总而言之,验证集和测试集的结果都展示了Voxel R-CNN模型实现了SOAT的平均精度,同时是一个高效的基于体素的模型。

4.4 Results on Waymo Open Dataset

the LEVEL 1 objects have more than 5 points while the LEVEL 2 objects have 15 points.

我们的模型在两个级别的检测结果都超过了先前的模型。我们的模型在远距离目标检测的效果超过PV-RCNN很多,说明我们的模型在远距离目标检测的优势。

在这里插入图片描述

4.5 Ablation Study

在这里插入图片描述

  1. 方法a使我们的baselines单阶段模型,虽然时间很快,但是精度不高,这说明了BEV特征对于精准的3D目标检测是不够的。

  2. 方法b在a的基础上添加了一个检测头用于box精炼。该检测头利用3D体素信息提升了basle的效果,说明了体素信息足以完成高精度的3D目标检测。然而球状查询的时间开销很大,导致模型速度大大减小。

  3. 方法c在b的基础上,将球状查询替换成了体素查询,实现了1.7速度的提升。体素查询充分利用到了体素的邻接表示优势。

  4. 方法d使用加速模块在球状查询的基础上进行了加速,提升了模型的速度。

  5. 方法e是最终Voxel-RCNN模型架构,使用检测头拓展了baseline,提升了模型进度,使用体素查询和加速模块提升了模型的速度。

5 Related Work

Point-based Methods:介绍了一种基于PointNet++的三维区域建议网络,利用点云RoI池提取每个方案的三维区域特征。

Voxel-based Methods:首先将点划分成三维体素,并使用一个微小的点网将每个体素中的点转换为一个紧凑的特征表示。然后,利用3Dcnn来聚合空间环境并生成三维检测。然而,由于非空体素在大空间中的稀疏性,利用传统的卷积网络进行特征提取是效率低下的。

6 Conclusion

本论文中,我们提出了Voxel R-CNN,一个基于体素的新颖的3D目标检测器。以体素作为是输入,Voxel R-CNN首先从BEV中生成了浓密的区域建议,之后利用voxel RoI pooling来获取3D体素区域建议用于进一步优化。通过充分利用体素的表现形式,我们的模型在精度和效率间取得了平衡。为了提升KITTI Dataset and Waymo Open Dataset的检测表现,我们的模型可以作为一个简单高效的baseline 来促进3D目标检测和其他相关工作的研究。

到此论文精读结束,如果对你有帮助,我很开心~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Voxel R-CNN是一种基于3D点云数据的物体检测算法,其目标是在点云数据上准确地定位和识别不同物体。该算法的Python实现代码包含以下几个主要部分。 1. 数据预处理:首先,点云数据被转化为一系列体素(voxel),以便进行后续的处理。具体而言,点云被划分为不同的小体素,每个小体素表示为一个固定大小的三维网格。每个小体素可以包含多个点,或者为空(无点)。这样的表示方式旨在将原始点云数据转化为规则的三维网格结构,方便后续的计算。 2. 网络结构:Voxel R-CNN使用了经典的R-CNN结构,其中包括三个主要组件:特征提取、区域建议和物体分类。首先,对每个小体素使用3D卷积操作提取特征。然后,通过一个区域生成网络(RPN)对感兴趣的目标区域进行建议。最后,对候选区域进行分类和定位。 3. 物体分类和定位:在区域建议阶段,RPN网络生成一系列候选的目标区域。然后,对于每个候选区域,进行物体分类和定位。具体而言,通过一个Mask R-CNN网络对候选区域进行目标分类,并生成目标的3D边界框,用来估计物体的位置和姿态。 4. 损失函数和训练过程:Voxel R-CNN使用多任务损失函数来训练网络。该损失函数由分类损失、边界框回归损失和3D边界框定位损失组成。这些损失函数用于优化网络参数,使得网络能够准确地定位和分类不同的目标。 总而言之,Voxel R-CNN是一种基于3D点云数据的物体检测算法,通过将点云数据转化为体素表示,并结合R-CNN网络结构进行特征提取、区域建议和物体分类定位,从而实现对不同物体的准确检测。该算法的代码实现包含数据预处理、网络结构、物体分类和定位以及损失函数和训练过程等几个主要部分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值