详解两阶段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。从检测性能来看,基于点的检测精度更高,相应地计算效率还不是很快。随着检测算法的日益成熟,现在有一个新的问题出现了:我们是否能设计一个算法,既能达到基于点检测的高精度又能实现基于体素检测一样高的效率?

下面作者在文中回顾了SECONDPV-RCNN两类检测算法,可以看到SECONDPV-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 poolingDetect 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{Ψ([vikgi;ϕik])}

其中vik−giv_i^k-g_ivikgi表示相对坐标,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=Nfg1[iLcls(pia,ci)+1(ci1)iLreg(δia,ti)]

其中NfgN_{fg}Nfg为前景anchors数量,piap_{i}^{a}piaδia\delta_{i}^{a}δia是分类和回归输出,ci∗c_{i}^{*}citi∗t_{i}^{*}ti是对应分类和回归目标。1(ci∗≥1)\mathbb{1}\left(c_{i}^{*} \geq 1\right)1(ci1)表示只计算前景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θLIoUiθL1IoUi<θLθLIoUi<θHIoUi>θ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 =Ns1[iLcls (pi,li(IoUi))+1(IoUiθreg )iLreg (δ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

实验部分,作者分别在KITTIWaymo数据集上进行了验证,实验细节这里不介绍了,可以查看代码和论文,下面几张表是实验结果。

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

下表是Voxel R-CNN在KITTI数据集上的排名情况,在开源项目中目前暂列第一(截至2021-03-01)。
在这里插入图片描述
最后作者做了一些分析实验,对本分提出的voxel queryaccelerated PointNet进行了实验分析,下面对表格中的5种方法实验结果进行总结:

  • ( a )在BEV特征上进行一阶段检测,效率很快,但精度不高。
  • ( b )添加检测头,精度得到了提高,但使用了ball querry原始PointNet Module,效率下降很多。
  • ( c )使用voxel query,效率得到提高。
  • ( d )使用加速PointNet Module,效率进一步提高。
  • ( e )本文提出的 Voxel R-CNN,取得了最好的检测性能,同时也取得了voxel-based 方法中最快的检测效率。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java容器类1:Collection,List,ArrayList,LinkedList深入解读

1、 Iterable 与 Iterator Iterable 是个接口&#xff0c;实现此接口使集合对象可以通过迭代器遍历自身元素. public interface Iterable<T> 修饰符和返回值方法名描述Iterator<T>iterator()返回一个内部元素为T类型的迭代器default voidforEach(Consumer<?…

无限场景开放式仿真器 PGDrive:Improving the Generalization of End-to-End Driving through Procedural Generation

本文介绍一个拥有无限场景开放式驾驶仿真器&#xff1a;PGDrive&#xff0c;通过 Procedural Generation 技术可以生成无限多的驾驶场景&#xff0c;由香港中文大学周博磊团队开发。 论文地址&#xff1a;https://arxiv.org/pdf/2012.13681.pdf 项目地址&#xff1a;https://…

java容器类2:Map及HashMap深入解读

Java的编程过程中经常会和Map打交道&#xff0c;现在我们来一起了解一下Map的底层实现&#xff0c;其中的思想结构对我们平时接口设计和编程也有一定借鉴作用。(以下接口分析都是以jdk1.8源码为参考依据) 1. Map An object that maps keys to values. A map cannot contain du…

两阶段3D目标检测网络 SIENet: Spatial Information Enhancement Network for 3D Object Detection from Point Cloud

本文介绍一篇两阶段的3D目标检测网络&#xff1a;SIENet。 这里重点是理解本文提出的 Hybrid-Paradigm Region Proposal Network 和 Spatial Information Enhancement module。 论文链接为&#xff1a;https://arxiv.org/abs/2103.15396 项目链接为&#xff1a;https://githu…

java容器类3:set/HastSet/MapSet深入解读

介绍 Set&#xff1a;集合&#xff0c;是一个不包含重复数据的集合。&#xff08;A collection that contains no duplicate elements. &#xff09; set中最多包含一个null元素&#xff0c;否者包含了两个相同的元素&#xff0c;不符合定义。 上一篇学习了Java中的容器类的一…

Bandit算法原理及Python实战

目录 1&#xff09;什么是Bandit算法 为选择而生。 Bandit算法与推荐系统 怎么选择Bandit算法&#xff1f; 2)常用Bandit算法 Thompson sampling算法 UCB算法 Epsilon-Greedy算法 Greedy算法 3&#xff09;Bandit算法Python实战 参考资料&#xff1a; 推荐系统里面有…

ava容器类4:Queue深入解读

Collection的其它两大分支&#xff1a;List和Set在前面已近分析过&#xff0c;这篇来分析一下Queue的底层实现。 前三篇关于Java容器类的文章&#xff1a; java容器类1&#xff1a;Collection,List,ArrayList,LinkedList深入解读 java容器类2&#xff1a;Map及HashMap深入解…

Waymo离线点云序列3D物体检测网络 (3D Auto Labeling): Offboard 3D Object Detection from Point Cloud Sequences

本文介绍一篇Waymo基于点云序列的3D物体检测网络&#xff1a;3D Auto Labeling&#xff0c;论文已收录于CVPR 2021。 这里重点是理解本文提出的 Object-centric Auto Labeling。 论文链接为&#xff1a;https://arxiv.org/abs/2103.05073 2021-09-02补充&#xff1a;本文作者…

Waymo自动驾驶数据集介绍与使用教程

本文将对Waymo自动驾驶数据集&#xff08;Waymo Open Dataset&#xff09;进行介绍。 论文链接为&#xff1a;https://arxiv.org/abs/1912.04838v7 项目链接为&#xff1a;https://github.com/waymo-research/waymo-open-dataset 数据集链接为&#xff1a;https://waymo.com…

Java 并发基础——线程安全性

线程安全&#xff1a;多个线程访问某个类时&#xff0c;不管运行时环境采用何种调度方式或者这些线程将如何交替执行&#xff0c;并且在主调代码中不需要任何额外的同步或协调&#xff0c;这个类都能表现出正确的行为&#xff0c;那么久称这个类是线程安全的。 在线程安全类中封…

详解一阶段3D物体检测网络 SE-SSD: Self-Ensembling Single-Stage Object Detector From Point Cloud

本文介绍一篇一阶段的3D物体检测网络&#xff1a;SE-SSD&#xff0c;论文已收录于 CVPR 2021。 这里重点是理解本文提出的 Consistency Loss 、Orientation-Aware Distance-IoU Loss、Shape-Aware Data Augmentation。 论文链接为&#xff1a;https://arxiv.org/pdf/2104.0980…

详解3D点云分割网络 Cylindrical and Asymmetrical 3D Convolution Networksfor LiDAR Segmentation

本文介绍一篇3D点云分割网络&#xff1a;Cylinder3D&#xff0c;论文已收录于 CVPR 2021。 这里重点是理解本文提出的 Cylindrical Partition 和 Asymmetrical 3D Convolution Network。 论文链接为&#xff1a;https://arxiv.org/pdf/2011.10033.pdf 项目链接为&#xff1a;…

自动驾驶3D物体检测研究综述 3D Object Detection for Autonomous Driving: A Survey

本文介绍一篇最新的自动驾驶3D物体检测研究综述&#xff08;2021年6月份发布&#xff09;&#xff0c;来源于中国人民大学&#xff0c;论文共26页&#xff0c;99篇参考文献。 论文链接为&#xff1a;https://arxiv.org/pdf/2106.10823.pdf 0. Abstract 自动驾驶被看作是避免人…

Java中接口的多继承

我们知道Java的类只能继承一个类&#xff0c;但可以实现多个接口。但是你知道么&#xff1f;Java中的接口却可以继承多个接口。本文就来说一说Java中接口的多继承。 进入主题之前&#xff0c;先扩展一下。Java为什么只支持单继承呢&#xff1f; 我们不妨假设Java支持多继承&a…

详解基于IMU/GPS的行人定位: IMU/GPS Based Pedestrian Localization

本文介绍一篇使用 IMU/GPS 数据融合的行人定位论文&#xff0c;这里重点是理解本文提出的 Stop Detection 和 GPS Correction。 论文地址为&#xff1a;https://www.researchgate.net/publication/261452498_IMUGPS_based_pedestrian_localization 1. Introduction 低成本的 …

每次maven刷新jdk都要重新设置

pom.xml <java.version>17</java.version> 改为<java.version>1.8</java.version>

【CodeForces - 706D】Vasiliy's Multiset(01字典树)

题干&#xff1a; Author has gone out of the stories about Vasiliy, so here is just a formal task description. You are given q queries and a multiset A, initially containing only integer 0. There are three types of queries: " x" — add integer …

详解自动驾驶仿真框架OpenCDA: An Open Cooperative Driving Automation Framework Integrated with Co-Simulation

本文介绍一款同时支持协同驾驶开发与测试、自动驾驶全栈开发 和 CARLA-SUMO联合仿真的开源框架 OpenCDA&#xff0c;论文已收录于 ITSC 2021。主要feature有&#xff1a; 支持CARLA-SUMO联合仿真&#xff0c;CARLA端主管环境渲染、传感器模拟、车辆动力&#xff0c;Sumo端主管…

JavaMonitor 监视器

为什么wait(), notify()和notifyAll()必须在同步方法或者同步块中被调用&#xff1f; 当一个线程需要调用对象的wait()方法的时候&#xff0c;这个线程必须拥有该对象的锁&#xff0c;接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的…

KITTI自动驾驶数据集可视化教程

本文介绍关于自动驾驶数据集KITTI的基本操作&#xff0c;包括Camera和LiDAR可视化教程&#xff0c;源码已上传&#xff1a;https://download.csdn.net/download/cg129054036/20907604 1. 数据准备 将 KITTI 数据 (calib, image_2, label_2, velodyne) 添加到 dataset/KITTI/ob…