paper:
- PV-RCNN https://arxiv.org/abs/1912.13192
- PV-RCNN++ https://arxiv.org/abs/2102.00463
github:使用OpenPCDet进行训练测试 https://github.com/open-mmlab/OpenPCDet
PV-RCNN
简介
PV-RCNN的提出是想要综合 point-based 和 voxel-based 3D目标检测方法的优势:既要尽可能保留原始点的精确位置信息,又要降低运算消耗。
PV-RCNN主要贡献:
- Voxel & Point based Method 点和体素方法的结合:实现了更高的识别性能和可控的内存消耗。
- Voxel-based 体现在3D稀疏CNN场景编码的过程中,将场景转换为多种尺度的特征空间,并且生成了高品质的预选框。
- Point-based 体现在 Voxel-to-Keypoint 和 Keypoint-to-RoI grid 这两个步骤当中,它们本质上都是把邻域内点的信息汇集到当前的点上面。
- Voxel-to-Keypoint scene encoding 从体素到关键点的场景编码:作为 3D稀疏CNN和预选框细化两个步骤之间的桥梁,关键点(Keypoint) 精简了整个场景的特征表达,同时还保留了点云丰富的上下文关联信息以及原始点精确的位置信息。
- Multi-scale RoI feature abstraction 多尺度RoI特征提取:每个预选框的格点得到了来自其邻域内的关键点所携带的特征信息、原始点的位置信息和原始点之间的上下文关联信息。而且,这些信息还是在不同尺度,也就是不同规模的感受野当中汇集的。
网络结构
步骤如下:
- 将空间中的点云数据体素化,利用3D稀疏卷积网络进行多次的特征提取下采样。
- 在3D稀疏卷积网络特征提取的每一层使用体素特征抓取模块提取多尺度特征。
- 将3D稀疏卷积网络提取的特征投影到鸟瞰图上,并利用鸟瞰图生成一阶段的目标检测结果。
- 利用体素特征抓取模块得到的多尺度特征对一阶段目标检测结果进行优化得到最终的检测结果。
3D Voxel CNN for Efficient Feature Encoding and Proposal Generation
- 点云数据体素化提取特征
首先将空间中的点云数据进行体素化,其中非空体素的特征被直接计算为所有内部点的逐点特征的平均值。
然后使用3D稀疏卷积提取体素层面的特征,并且通过设置Stride的方式对空间数据进行下采样,最终实现8倍的下采样。 - 转为BEV进行一阶段预测
在卷积之后,将特征在Z轴上堆叠实现将特征图投影到2D平面,生成[W/8, L/8]的BEV图。随后在鸟瞰图的基础上,使用anchor-based的方法生成对检测目标的Propoals和置信度打分。
PV-RCNN在第一阶段简单地生成3D Bbox框,第二阶段需要进行的是对生成的区域的优化和调整。其中,在OpenPCDet中PV-RCNN的阶段1与SECOND网络结构一样。
Voxel-to-keypoint Scene Encoding via Voxel Set Abstraction
- Keypoints Sampling
采用FPS,对KITTI数据集的关键点个数为2048,对Waymo数据集为4096个点,用于代表整个场景的特征信息。
- Voxel Set Abstraction Module
对从3D CNN特征量(步骤1中的几个稀疏卷积结果)到关键点的多尺度语义特征进行编码。
使用的是PointNet++中所提出的类似聚合方法。但在PN++中,每个关键点聚合的是周围原始点云中一定距离的点特征,而在VSA中,每个关键点聚合的是周围一定距离内的体素的特征。
聚合完成之后放入类似于PointNet的结构进行特征提取。使用公式表示如下:
其中 M 表示采样聚合过程(采样是因为阈值限制,即聚合体素数量有限制), G 表示提取特征的多层感知机, max 就是经典的最大池化了。和PN++一样,文中设置了多个距离用于周围体素聚合。
本文的voxel CNN共有4层,所以每个关键点可以得到4个特征,在这四层中可以设置不同的范围阈值(ball 半径)。
- Extended VSA Module
作者认为2D的鸟瞰图对Z轴有着更广的感受野,因此将关键点pi投影到2D鸟瞰坐标系,并利用双线性插值从鸟瞰特征中获得特征 f i b e v f_i^{bev} fibev。
最终得到关键点 p i p_i pi的特征为:
其中,
f
i
p
v
f_i^{pv}
fipv是VSA过程得到的4个特征并进行拼接
f
i
r
a
w
f_i^{raw}
firaw是初始点云进行fps提取的点云(进行mlp)
f
i
b
e
v
f_i^{bev}
fibev是初始点云(只考虑x,y)在Bev上相对位置并双线性插值的特征
- Predicted Keypoint Weighting
考虑到前景关键点要比背景点贡献更多目标信息,本文提出了PKW模块,通过额外监督来重新加权关键点特征。其中,额外的监督是指3D分割,label是根据关键点坐标和真实的3Dbbox的位置关系得到的,判断该点是不是在内部得到label (0:不在内部, 1: 在内部)。
PKW模块设计如下:
点云特征通过 2个mlp 并sigmoid得到概率(0–1 float)。可以看作是让两个MLP去学习判断:给出点云特征来推测对应特征点在3Dbbox中的概率。
带权重的关键点特征表示为:
PKW模块通过focal loss进行训练,默认超参数用于处理训练集中前景/背景点的不平衡数量。
Keypoint-to-grid RoI Feature Abstraction for Proposal Refinement
- RoI-grid Pooling via Set Abstraction
聚合关键点特征到Roi-grid点:作者提出RoI-grid pooling 模块以将关键点特征和RoI区域中的点结合起来。这个部分和前面的VSA模块很相似。在每个Propoals中选出 6×6×6=216 个点,称为grid points。将每个grid points视作中心点,使用PN++的方法,聚合周围一定距离内的关键点特征(同样的是多个距离阈值以获得多尺度信息)。同时在每个关键点特征上拼接上一个坐标信息,该坐标信息的值为关键点到对应中心点的坐标差;
之后就可以使用和VSA中一样的 M() 、 G() 函数进行特征处理,如下所示:
然后再将采集216个中心点得到的特征通过一个两层的MLP进行转换,得到的特征即代表这个Propoals了。作者认为,得益于关键点丰富的信息,该文每个Propoals中得到的特征信息包含了丰富的上下文信息,具有灵活的感受野(多尺度、且被聚合的邻域范围内的关键点可以在该3D box外部)。
- 3D Proposal Refinement and Confidence Prediction
聚合后的特征经过MLP去预测anchor的cls和reg:
PV-RCNN++
简介
PV-RCNN++(v2版本)是基于 PV-RCNN(v1版本) 进行改进的,包括两点,
- 第一个是 sectorized proposal-centric (proposal中心扇形化)策略,用于生成更具代表性和更均匀分布的关键点;
- 第二个是VectorPool aggregation,以取代 set abstraction,更好地聚合局部点云特征,并且资源消耗也少的多;
基于以上两步改进策略,PV-RCNN++运行速度在是v1版本的三倍,且在Waymo开放数据集上以10 FPS的推理速度在150m×150m检测区域获得最好的效果。
网络结构
Sectorized Proposal-Centric Sampling
在 v1 中,使用最远点采样(FPS)算法从原始点云中对关键点进行采样,有两个缺点:
- FPS算法由于是 O(n2) 复杂度而耗时,尤其是对于大规模点云采样时,阻碍了训练和推理速度;
- FPS算法将生成大量背景关键点,这些关键点对第二阶段的网络回归是没有帮助,因为 RoI-grid 操作只能检索 proposal 周围的关键点。
为了解决这些缺点,提出了 SPC 采样算法。
- Proposal-Centric Filtering
以 proposal 的中心为圆心对关键点进行过滤,将关键点采样的候选数量从 P 大幅减少到 P’,这不仅降低了后续关键点采样的复杂性,而且关键点比较集中,可以更好的对 proposal 周围的区域进行编码。
- Sectorized Keypoint Sampling
为了进一步并行加速的关键点采样过程,我们将 proposal-centric 点集 P’分布到以整个场景中点为中心的 s 个扇区中,第 k 扇区的点集可以表示为 Sk’:
其中,每个扇区采样的点数等于 (落在该扇区内的点数 / 第一步筛选后的总点数) * 需要采样的点数。从每个Sk’ 中采样特定数量的关键点,使用的是FPS方法,因此通过实验发现FPS均匀分布的性能明显优于其他关键点采样算法。
这些 s个子任务可以在GPU上并行执行,从而关键点采样的规模则从 P’减少到 m a x k ∈ { 1 , . . . , s } ∣ S k ′ ∣ max_{k\in \{1,...,s\}}|S_k^{'}| maxk∈{1,...,s}∣Sk′∣。因此,SPC关键点采样大大减少了关键点采样的规模,这不仅有效地加快了关键点采样过程,而且将关键点集中到3D proposal 的邻域,提高了关键点特征表示的能力。
Local Vector Representation
v1在 VSA 和 RoI-grid pooling 中采用 SA 进行局部特征聚合,对于点云的大规模局部特征聚合,SA 操作是非常耗时和耗费资源的。因此,在v2框架中,提出了用于从点云进行局部特征聚合的 VectorPool 聚合操作,以实现更准确、更高效的 3d 对象检测。
v2提出的 VectorPool 聚合模块中,建议通过使用单独的内核权重和单独的特征通道对不同的空间区域进行编码来生成位置敏感的局部特征,然后将其连接为单个向量表示以显式地表示局部点特征的空间结构。
具体来说,给定一个目标中心点 qk,首先识别其立方相邻区域内的支撑点,可以表示为:
请注意,本文将原始立方空间的一半长度加倍,以包含更多相邻点,用于该目标点的局部特征聚合。
为了生成位置敏感的特征,我们将关键点q 其周围空间邻域分割为nx×ny×nz密集体素;通过距 Yk 的三个最近邻来插值第 t 个子体素的特征,其中 t ∈ {1,… , nx ×ny ×nz} 表示每个子体素的索引,生成第 t 个子体素的特征为:
结果 h t ( v ) h_t^{(v)} ht(v)对该局部立方体中的特定第 t 个局部子体素的局部特征进行编码。
不同局部子体素中的那些特征可能代表非常不同的局部特征。因此,建议使用单独的局部内核权重对不同的局部子体素进行编码,以捕获位置敏感特征,而不是使用共享参数 MLP 来编码局部特征,如下所示:
最后,直接根据局部子体素特征 Ut 沿每个 3D 轴的空间顺序对其进行排序,并将它们的特征依次连接以生成最终的局部向量表示:
其中 U ∈ R c o u t U\in{R_{cout}} U∈Rcout 。内部顺序串联通过简单地将不同位置的特征分配到相应的特征通道来对结构保留的局部特征进行编码,这自然地保留了以qk为中心的相邻空间中的局部特征的空间结构,最终处理该局部向量表示使用多个MLP将局部特征编码到Cout特征通道以进行后续处理。
值得注意的是,本文的 VectorPool 聚合模块还可以与(Sun et al 2018)中的通道缩减技术相结合,通过在进行 VectorPool 聚合之前汇总输入特征通道来进一步减少计算/内存资源。
与SA相比, VectorPool 聚合可以通过采用通道求和并利用 MLP 之前提出的局部向量表示来大大减少所需的计算和内存资源。此外,本文提出的局部向量表示可以对具有不同特征通道的位置敏感特征进行编码,而不是像集合抽象中那样对局部逐点特征进行最大池化,从而为局部特征学习提供更有效的表示。