PV-RCNN 阅读笔记
date
Mar 26, 2022
Last edited time
Mar 27, 2023 09:03 AM
status
Published
slug
PV-RCNN阅读笔记
tags
DL
CV
3D
summary
有部分参考自知乎, 链接已给出
type
Post
origin
Field
Plat
PV-RCNNAbstractIntroductionPV-RCNN for Point Cloud Object Detection3D Voxel CNN for Efficient Feature Encoding and Proposal GenerationVoxel-to-keypoint Scene Encoding via Voxel Set AbstractionKeypoint-to-grid RoI Feature Abstraction for Proposal RefinementTraining lossesExperimentsPV-RCNN++PV-RCNN++: F ASTER AND B ETTER 3D DETECTION W ITH PV-RCNN F RAMEWORKSectorized Proposal-Centric Sampling for Efficient and Representative Keypoint SamplingLocal Vector Representation for Structure Preserved Local Feature Learning from Point CloudsExperiments
PV-RCNN
Abstract
- 本文的特征提取方式充分利用的 3D voxel 卷积和基于点的 pointnet 卷积方式。其中作者给出的解释是 3D voxel 卷积高效,而 point-based 的方法感受野可变,因此结合了这两种检测方法的优点。
- 该方法是一个两阶段的方法, 第一阶段提 proposals,第二阶段为 refine
- 该方法远远好于 KITTI 其他的方法,在精度的表现上看。
一个简单的过程如下,盲猜为多尺度特征融合到 key-point 上的一个创新工作。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F35ba4484-be87-46eb-abca-760bd3363c05%2FUntitled.png?table=block&id=e0f81f8f-f70b-41da-9ee6-017c97b91226&cache=v2)
Introduction
- 3D 检测应用
- 本文是一个将 point_based 的方法和 voxel_based 方法的结合的新型网络结构(在文章作者称 voxel_based 为 grid_based 的方法,实则同一种方法)
- 一些 point_based 和 grid_based 方法的简单介绍。并且提取存在的问题。这也是作者的论文出发点,结合这两种方法的优点。(高效 + 可变感受野)
the grid-based methods are more computationally efficient but the inevitable information loss degrades the finegrained localization accuracy, while the point-based methods have higher computation cost but could easily achieve larger receptive field by the point set abstraction
- PV-RCNN 为结合这两种方法的算法,采用 multi-scale 的方法获得由 voxel_based 方法得到的高质量的 proposals,然后再利用 Point_based 的方法获得精细的局部信息。
The principle of PV-RCNN lies in the fact that the voxel-based operation efficiently encodes multi-scale feature representations and can generate high-quality 3D proposals.
- 核心也就是如何将上述的两种方法有效的结合起来,这里作者的做法是:在每一个 3D proposals 内平均的采样一些 Grid-point,然后再通过 P2 的 FPS 最远点采样的方法得到该 Grid_point 周围的点,再通过结合去进一步 refine 最后的 proposals
- 因此,作者采用两阶段的方法去更好的结合上述的两种算法的优点。
- 第一阶段为:“voxel-to-keypoint scene encoding step”,这一步是提出 proposals,作者首先对整个场景采用 voxel 的方法进行特征提取,同时对场景的原始点云采用 FPS 采样得到key_point 的位置. key_point 的 feature 则使用 Voxel Set Abstraction Module 方式获得.
- 第二阶段为‘keypoint-to-grid RoI feature abstraction’:这一步骤,作者提出了一个新的 RoI-grid pooling module,该模块将上一步骤的
key_points
的特征和RoI-grid points
特特征融合.
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F66eaae54-79fb-40a1-a968-385176085b3e%2FUntitled.png?table=block&id=c93abe89-7a71-4f9e-93fa-8c1d45def79d&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fd34d68a4-99f5-4386-9f61-750c29cfc9d2%2FUntitled.png?table=block&id=a9761e47-cb9e-45ba-aca8-99f01aa2a78c&cache=v2)
PV-RCNN for Point Cloud Object Detection
3D Voxel CNN for Efficient Feature Encoding and Proposal Generation
- Discussions
- 目前大多精度高的工作都采用了 refine 优化的工作,这里作者提出两个问题,如果采用类似
roi_pooling
的方式去做,那么由于 8 倍的下采样会使得分辨率很低,此外如果采样得到的是较高的分辨率图片又会得到稀疏的表示(Fast-PointRCNN)。第二个问题是传统的 ROI-POOLING 和 ROI-ALIGN 实际上得到仅能在一个小的区域内进差值,因此如果在 3D 稀疏的表达上可能得到几乎都是 0 的特征表示。 - 进一步的,P2 提出的
Set-Abstruction
的操作很好的编码 “可变” 领域的特征,后续考虑到去 voxel 上差值的内存占用,作者提出了先提出关键点,然后再利用关键点编码 voxel 卷积过程的多尺度特征。
Voxel-to-keypoint Scene Encoding via Voxel Set Abstraction
- Keypoints Sampling
采用 FPS 采样,对 KITTI 数据集的关键点个数为 2048,对 waymo 数据集为 4096 个点。用于代表整个场景的特征信息。
- Voxel Set Abstraction Module
作者自行设计了
Voxel Set Abstraction (VSA) module
这样的一个模块,这个模块的作用是将 key_point
周围非空的 voxel 特征采集出来结合在一起,原文用了很多数学表达,含义大致如此。- Extended VSA Module
进一步的在二维上,采用的是双线性插值得到关键点投影到 BEV 上的特征。最终的特征将有三部分组成,分别是来自 voxel 语义信息
fipv
, 来自原始点云的特征信息 firaw
(作者说这一部分信息是为了弥补之前在 voxel 化时丢失的信息),来自 BEV 的高级信息fibev
.相关代码
代码中 Voxel Set Abstraction Module 和 Extended VSA Module 是写在一起的
作者使用这两个模块从原始点云, Voxel特征, BEV特征中找到key_point所对应的位置, 将其邻域使用
pointnet2
的方法提取特征, 作为 key_point 的 feature. - Predicted Keypoint Weighting.
- 上述的特征融合实际上都是为了进一步的 refine 做准备,第一阶段的 proposals 实际上是由 voxel-based 的方法提出来的,这一步 Keypoint Weighting 的工作是为了给来自背景和前景的关键点一个不一样的权重,使得前景对 refine 的贡献更大。
- 为了做这样的一个工作,作者设计了如下的额为的网络结构。这里面的 Label 对应的是是否在 gt 内,采用 fcoal_loss。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fdd775a64-6b2b-4e90-b33d-c48ef9600c3f%2FUntitled.png?table=block&id=9aace0ce-fbe7-47c5-865f-8d0569f13f5a&cache=v2)
Keypoint-to-grid RoI Feature Abstraction for Proposal Refinement
这就是作者提出的第二阶段,refinement,前文提到通过 3D 稀疏卷积处理 voxel 已经得到了比较好的精度的 proposals,但是多尺度的 keypoint 的特征是为了进一步 refine 结果。因此作者在这个阶段提出了 keypoint-to-grid RoI feature abstraction 模块。如下:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F074860d1-3a3d-43e4-b97f-97f9649a0894%2FUntitled.png?table=block&id=e4147d29-5297-47ee-a68f-de3dc237de98&cache=v2)
- 从该模块名称和图就可以看得出来,作者是想通过将 key-point 的特征整合到 grid-point 中去,并且也采用了 multi-scale 的策略。作者在每个 proposals 中都采样 6×6×6 个 grid points.
- 首先确定每一个 grid-point 的一个半径下的近邻,然后再用一个 pointnet 模块将特征整合为 grid_point 的特征,这里会采用多个 scale 的特征融合手段。
- 得到了所有的 grid-point 的点特征后,作者采用两层的 MLP 得到 256 维度的 proposals 的特征。
- 3D Proposal Refinement and Confidence Prediction 作者在 confidence prediction branche 这一分支上采用了前人提出的 3D Intersection-over-Union (IoU),对于第 k 个 ROI 的置信度的目标是如下公式:
该公式中 表示第 k 个 ROI 对应的 GT,因此 confidence prediction branche 的 LOSS 函数采用的是交叉熵 loss:
Training losses
- RPN loss
- keypoint seg loss 也就是前背景关键点的权重 loss。
- refinement loss 定义如下:
这里的两部分 loss 第一个置信度 LOSS 也就是前文提出的 LOSS,后面的 SmoothL1 LOSS 和以前的一样。
相关代码
Experiments
有一些参数设置和实验的实现细节,博主就不写下来了。原文很详尽。列出实验效果吧。在 test 的数据集上: 几乎都好比第二名好几个点,真的牛。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F3f11c527-1996-4f1c-af4d-3b354123e62b%2FUntitled.png?table=block&id=d5d1679e-9521-46ac-827e-7a415400e127&cache=v2)
在 waymo 上如下:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F90f40af4-916e-4a71-8dff-e4033223e652%2FUntitled.png?table=block&id=5596e939-ad64-401d-8835-a1d685cdeb1f&cache=v2)
PV-RCNN++
作者在 PV-RCNN 的基础上提出了 PV-RCNN++ 模型. PV-RCNN++ 模型主要有两点改进: 1. 提出了 SPC (sectorized proposal-centric strategy) 采样方法, 替代了原来的 FPS 方法. 2. 使用
VectorPoolAggregationModuleMSG
方法来替代原来在 VoxelSetAbstraction
中使用的 StackSAModuleMSG
方法, 能够更好地提取点云特征并且消耗更少地资源. 使用了这两种方法, PV-RCNN++ 模型的速度是 PV-RCNN 的2倍, 占用更少的资源, 并且能得到更好的效果.
PV-RCNN++: F ASTER AND B ETTER 3D DETECTION W ITH PV-RCNN F RAMEWORK
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F1fc5196a-9204-4a11-b3e7-9d3326da9410%2FUntitled.png?table=block&id=13ecf377-a404-4caa-b50b-9f2e24f4eac6&cache=v2)
Sectorized Proposal-Centric Sampling for Efficient and Representative Keypoint Sampling
Farthest point sampling 方法生成 key_point 的计算量大, 并且会在我们所需要的 ROI 范围之外生成大量无用的 key_point, 这大大影响了训练以及推理的效率. 因此, 文章提出了一种新的采样方法: Sectorized Proposal-Centric (SPC) Keypoint Sampling.
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F676dd8ab-2489-4dd3-b448-6805b502cc47%2FUntitled.png?table=block&id=578cecf7-901b-46d4-af27-cf82c435d4f1&cache=v2)
简单来说, 就是把原始点云提取出 ROI 内的部分, 然后从 Scene center 把已经分批的点云再次分批. 这样多批次的点云可以同时运行 FPS 采样, 大大加快的运行的效率.
Local Vector Representation for Structure Preserved Local Feature Learning from Point Clouds
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4b186c41-4579-4548-b5fb-f936a786ce32%2FUntitled.png?table=block&id=ec39eb74-30b7-4e5f-ac65-6d4625eb3922&cache=v2)
- Limitations of Set Abstraction
作者提出原来的 Set Abstraction 操作会花费大量的时间和空间来运行. 假设有 个需要获得 feature 的点, 每个点的 feature 从其周围的 个点获得, 而这 个点又有 的通道. 比如在 Roil-grid 模块中, . 然后使用 MLP 将 维通道降维到 维. 此外, 使用的 MaxPooling 操作丢失了点云的空间信息, 这影响了特征提取的效果.
- VectorPool Aggregation for Structure-Preserved Local Feature Learning
- 更简洁的特征
- position-sensitive 的特征表达
作者提出了 VectorPool aggregation 方法, 据说能既保留空间特征, 又能减少计算量和内存使用量.
原始点云数据维度为 , 作者将原始的特征做了一个折叠来减少特征数量. 折叠之后的特征维度为 .
作者使用插值的方法, 从原始点云中获得特征表达. 下面是插值的公式
为距离点 最近的三个点. 为点云中的 key_poin 距离 grid_point 的距离的倒数.
Experiments
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F697f4363-e16d-4d79-a663-80f3de4b3f26%2FUntitled.png?table=block&id=b12da483-102e-427b-97d8-bd2cd1e6a11c&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F847542c8-e587-4ab3-805e-5f02ada100e0%2FUntitled.png?table=block&id=aa54a383-f15c-4234-a9e7-547d36bdb3c5&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9f725098-ec89-4407-a090-14df350e77ba%2FUntitled.png?table=block&id=94a8d654-e66c-4c8b-8691-505751e1983a&cache=v2)