一、前言
PVRCNN是2019年12月发布的一篇3d目标检测的文章,代码已经在2021年4月开源。 传统的目标检测网络一般是基于 3d voxel 或者基于 pointnet 的方式,而PVRCNN,它结合了基于 point 和基于 voxel 这两种方式,从而提高了三维检测性能。PV-RCNN的原理在于,基于 voexl 的操作可以有效地对多尺度特征表示进行编码,并可以生成高质量的3D proposals,而基于PointNet的 SA 操作可以通过灵活的感受野保留准确的位置信息。
论文里对网络结构和性能介绍的很详细,想要全篇了解的可以去读一下 这篇论文翻译:PV-RCNN论文翻译
这里主要对 PV-RCNN中的 RoI-grid Pooling 模块进行详细的说明。(如果对该网络其它的模块也不是很清楚的可以留言,后需会同步更新出来)
二、RoI-grid pooling module流程图及说明
图中: 蓝色块表示一个 tensor 张量; 箭头上面的方框表示某种方法; 绿色块表示 一个子网络; 橙色块表示 简单的module,如fc层。
首先要了解 RoI 的输入分别表示什么意思,RoI-grid pooling module 有三个输入, roi: 表示第一阶段产生的 proposal 这里假设有 100 个框,形状为 (100, 7); point_coords: 为一开始随机选择的关键点坐标,这里假设选择 2048个关键点,形状为 (2048, 3); point_features: 表示2048个关键点的特征,该特征融合了 这些关键点 在 3d层,bev层,和raw原始点云层的特征(一般为反射强度), 融合后的特征用 128 维表示,形状为 (2048,128)。
步骤一: 最主要的就是步骤一,所有的两阶段网络模型,其第二阶段都是想要从第一阶段产生的proposal中提取出主要特征,再进一步优化 box 的回归,那应该提取什么样的特征,又该如何提取这些主要特征成为了第二阶段的关键所在。 这里作者对每一个 proposal 进行了均匀的 6x6x6 的网格划分,也就是把每一个 proposal 都划分成了 216 个网格,每个网格的中心点被称为 grid-point(实际中不存在该点), 一开始随机采样的2048 个点,落在 proposal 中的关键点为 key-point, 而 proposal 中的其它点被称为 raw-point,如下图所示, 因此就得到了 这100 个 proposal 的 216个 grid-point 的相对坐标,roi_grid_point 形状为(100, 216, 3);
具体的操作案例如下: 假设 proposal 的长宽高分别为 (3.1668, 1.5234, 1.4287), 划分成 6x6x6 = 216 个网格, 第一个网格的 索引为 (0, 0, 0), 我们取网格的中心点表示该网格,即(0.5, 0.5, 0.5)。 那么 该 小网格的 相对 proposal 中心点的 x 方向坐标,根据公式:grid_x = x * 3.1668/6 - 3.1668/2 , 即 0.5 * 3.1668/6 - 3.1668/2 = ?1.3195, 同理 可求得第一个小网格的y,z, 得到该坐标为: (-1.3195, -0.6348, -0.5953)
步骤二: 经过旋转和平移,将网格相对中心点的坐标变换到 全局坐标系下的坐标,得到 global_roi_grid_points 形状为(100, 216, 3);
步骤三: 因为关键点的选取是通过 FPS 最远点采样算法,因此会采集到 前景点和背景点,我们希望 特征更注重在 前景点的学习,因此对所有采样的点增加一个权重 weight,该权重 通过一个 3层的 mlp 分支学习, 并且经过sigmoid 函数,使得 权重值在 [0, 1] 之间。
步骤四: 将 步骤二 和步骤三得到的结果,结合关键点的原始坐标信息,经过 SA 操作特征提取,得到 grid-point 的特征。
SA操作的本质 实际上就是: 假设一共有 21600(100x216) 个网格点,每一个 网格点 在 2048 个关键中找到 nsample 个临近点(假设有16个临近点),然后用这16个临近点的特征进行 mlp,maxpooling操作后来表示该 grid_point 的特征; 最终得到 pooled_features (21600, 128);
接下来就是对这些网格点的特征进行两层 fc层,再由两个分支,分别回归 置信度分支 和 box, 得到 细化的 box 信息,如下图所示:
|