一文读懂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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/hughlee815/article/details/106922260
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/507278

相关文章

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

一文带你搞懂Python中__init__.py到底是什么

《一文带你搞懂Python中__init__.py到底是什么》朋友们,今天我们来聊聊Python里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没... 目录先搞懂 python 模块(module)Python 包(package)是啥?那么 __in

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那