一文读懂PV-RCNN: Point-Voxel Feature Set Abstraction for 3D Object Detection

本文主要是介绍一文读懂PV-RCNN: Point-Voxel Feature Set Abstraction for 3D Object Detection,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了致敬*一文读懂Faster RCNN*,本文取名如此。希望能帮助大家以轻松的姿态理解这一霸榜kitti大半年的3D目标检测算法。
0. 立论依据
按照点云的前处理方法划分,通常3D目标检测可以分为基于体素和基于点的方法。文中提到二者有其各自的特点:基于体素的方法能有效地进行region proposal,但是感受野受到卷积核大小的限制。而基于点的方法恰好能够获得灵活的感受野,更捕获更精确的上下文信息。(??此处迷惑,即使是基于体素的方法的感受野难道不是随着卷积层数的增加而逐渐扩大的吗??讲真,大家都说二个方法有其各自特点,但是目前我还没有见过谁把二者特点真正给讲清楚的)
anyway,作者希望能够将二者结合。
那么如何结合呢?一个直觉的想法是,第一阶段用voxel-base方法得到proposal,再用point-based的方法对proposal中的所有点进行第二阶段的refine。但是因为这样非常占显存,作者认为不可行。后面的消融实验也证明了这样做的效果并不如pvrcnn好。
那么作者究竟是怎么做的呢?

  1. stage1:region proposal
    pv-rcnn framework
    如上图所示,pvrcnn是一个两阶段检测算法。stage1采用常规的voxel-based的方法得到proposal。具体来说,以kitti数据集为例(作者还在waymo数据集上进行了实验),将原始点云空间(x:(0,70.4);y:(-40,40);z:(-3,1))划分为(0.05m, 0.05m, 0.1m)大小的体素,再用VFE(参见论文voxelnet)提取每个体素的特征,再使用3D稀疏卷积(参见论文second)进行下采样,对特征升维。文中分别为1×, 2×,4×, 8×倍下采样,维度分别为16, 32, 64, 64(下采样必然需要更高维的特征向量来承载相同的信息量)。
    搞明白了卷积怎么回事,再来看看图1中的***to BEV***是如何实现的。前面提到z方向上整个空间的高度是4m,体素高度为0.1米,所以z方向上共有40个体素。由于最高进行了8倍下采样,所以第4层卷积后z方向有5个体素,每个体素的特征向量为64维。***to BEV**所进行的操作就是把这5个体素合并为1个修长的体素,特征向量进行拼接,变为645=320维。这样后续的region proposal过程就能进行快捷的2D卷积了。
    stage1后续得到RoI的操作和2D检测就很像了,此处不再赘述。

  2. stage 2:refine
    如前文所述,得到RoI后,作者并不是把ROI中的每个点特征用来进一步的refine操作,而是基于关键点的特征来进行refine。那么关键点的特征是哪里来的呢?这就是下图中绿框部分的工作。
    关键点特征提取
    由上图可以看出,作者首先使用最远点采样算法(关于点云的各种采样算法的特点及实现可以参看我的另一篇博文)从原始点云中采样了一部分点,文中称作关键点(keypoint),并用这部分关键点来代表点云的全貌。再将每一个关键点找到在“特征体”(就是图中4个白色的立方体)中对应的位置。(ps:具体是怎么对应的我没搞清楚,文中貌似也没有说。难道是根据坐标的比例关系?)
    anyway, 找到对应的点之后,就开始利用pointnet++中的set abstraction模块提取周围某邻域球体内的特征了。并将在4个“特征体”中提取到的特征拼接起来,作为这个关键点的特征。作者认为这样还不够,于是他把set abstraction模块在采样到的关键点和鸟瞰图上再操作一遍,就得到6个尺度的特征,并把他们concatenate起来,代表这个关键点最终的特征。后面的消融实验证明作者加入这两个尺度的特征对提升精度确实是用一定帮助的。
    上面说的只是对一个关键点的操作,其他关键点完全一样。最终,我们可以得到每个关键点的特征。

经过stage1我们得到了RoI, 经过刚刚的关键点特征提取我们得到了每个关键点的特征。好了,现在我们终于可以进行refine了。不对,等等,还有一个Predicted Keypoint Weighting模块。它的作用主要是想降低不是前景点的关键点特征对refine阶段的影响。它的实现也很简单,见下图。通过训练两层MPL来使得模型能够区分哪些是前景点,哪些是背景点,并对背景点赋予较小的权重。
在这里插入图片描述
发现没有?其实到目前为止,作者已经将voxel-based方法和point-based方法结合起来了。但是,精彩还在继续,作者在refine阶段又将两个方法结合了一遍。
在第一阶段得到的RoI中,作者随机生成了6 * 6 * 6个格子点(grid point),如下图。注意只看左边和右下角就好了,右上角可以先不管。

注意上图中的key point和raw point都是点云中真实存在的点,而grid point是生成的参考点。其实refine阶段raw point并没有什么用,因为它的特征已经被“吸收”进关键点了,作者在途中画出来只是让你知道有这么个玩意儿。当然grid point更不提供特征,他只是用来标记位置的。
具体来说,作者以gird point为球心,以某一设定值为半径画球,对包括在其中的关键点再次进行set abstraction操作,得到更高级的特征。这样做有一个好处就是,在画球的过程中,有可能将RoI之外的点包括进来,从而提供更丰富的语义信息,帮助模型更好的回归。这样重复6 * 6 * 6次,就能得到6 * 6 * 6个特征向量。现在大家应该能明白上图中右上角的含义了。
得到整个RoI的特征后,就可以进行confidence和regression预测了。值得注意的是,此处的confidence预测作者采用了一篇ECCV2018论文(Acquisition of Localization Confidence for
Accurate Object Detection)的思想,不是直接预测概率,而是预测iou。

到这里,整个模型就介绍完毕了,最后的结果大家应该都清楚,效果一骑绝尘。但是据说被电子科大的新研究超越了?
anyway,最后表达一下我个人的看法:

  1. 其实除了point-based和voxel-based的方法还有graph-based的方法。是不是可以排列组合一下,融合多种方法?那按这个道理是不是point-voxel-graph-based的方法最无敌,hhh。可能速度会很慢吧,是不是可以考虑把graph-based的方法作为辅助网络呢,就像阿里达摩院的sa-ssd那样。
  2. ……

这篇关于一文读懂PV-RCNN: Point-Voxel Feature Set Abstraction for 3D Object Detection的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507278

相关文章

一文详解如何在Python中使用Requests库

《一文详解如何在Python中使用Requests库》:本文主要介绍如何在Python中使用Requests库的相关资料,Requests库是Python中常用的第三方库,用于简化HTTP请求的发... 目录前言1. 安装Requests库2. 发起GET请求3. 发送带有查询参数的GET请求4. 发起PO

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入探讨Java 中的 Object 类详解(一切类的根基)

《深入探讨Java中的Object类详解(一切类的根基)》本文详细介绍了Java中的Object类,作为所有类的根类,其重要性不言而喻,文章涵盖了Object类的主要方法,如toString()... 目录1. Object 类的基本概念1.1 Object 类的定义2. Object 类的主要方法3. O

一文带你搞懂Nginx中的配置文件

《一文带你搞懂Nginx中的配置文件》Nginx(发音为“engine-x”)是一款高性能的Web服务器、反向代理服务器和负载均衡器,广泛应用于全球各类网站和应用中,下面就跟随小编一起来了解下如何... 目录摘要一、Nginx 配置文件结构概述二、全局配置(Global Configuration)1. w

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm