概述
首先,本文是基于点云,并且将点云处理成体素
的3D目标检测网络。
本文的核心概念就是点密度,主要贡献如下:
- Voxel Point Centroid Localization(体素点质心定位)就是使用非空体素中点计算体素的质心,然后结合质心点的特征得到包含细粒度位置信息的点密度分布,并使用它来实现候选框的回归,从而避免采样点云。
- Density-Aware RoI Grid Pooling(密度感知RoI Grid Pooling)在PV-RCNN的RoI Grid Pooling基础上进行变化,添加额外通过KDE编码的局部点密度信息并通过self-attention操作获取候选框全局的点密度信息。
- Density Confidence Prediction(密度置信度预测)将bbox的质心位置以及原始点云的数量作为额外特征,辅助置信度预测。
细节
点密度问题
由于激光雷达的特性,采集到点云的密度是不均与的,即距离越远点云就会越稀疏,越近点云就会越密集。当前的方法基本都使用一些策略缓解这种不均匀带来的影响:基于体素的方法通过体素化忽略点密度,因此导致体素特征和点云特征是不对齐的,从而影响性能;而基于点的方法通过FPS缓解点密度不均匀,但是这个步骤直接采样原始点云计算量大,而本文则将这种特性(点密度变化)作为额外信息提高网络的性能。
上图中(a)是采样了体素中心,可以看到,这种采样方式因为没有考虑到密度的变化,采样后丢失了物体原本的细节信息,车的形状已经看不出来了。因此考虑用FPS采样弥补密度的变化(因为稠密的地方,选取的点肯定会多一点,但是这种方式容易受到离群点的影响,并且计算量比较大。),如(b),但是最远点采样计算量比较大,而且采样后会减少原本的目标点云数量,对小目标(自行车,行人)的检测效果会变差。
实验表明点密度对于小目标(自行车、行人)的检测是很有帮助的,而这也是当前的sota们所欠缺的。
网络结构
- 体素化并对非空体素进行特征提取,使用最后的特征通过RPN网络进行分类和初始化候选框的操作,因为后续需要,所以中间若干stage的特征也要保留。
- 计算每个stage中体素的点质心以及它对应的特征
- 对生成的候选框均匀划分得到 u 3 u^3 u3的网格点
- 每个网格点使用球查询聚集特征提取网络中每个stage中体素点质心的特征得到网格点特征
- 网格点特征+位置编码送入self-attention得到考虑了位置信息和全局信息的网格点特征
- 使用候选框的网格点特征进行候选框的微调,得到预测框
- 使用候选框的网格点特征+预测框的信息,得到最后的置信度
3D体素特征提取网络
模块作用
:划分体素、提取体素特征并生成候选框,判定类别以及粗粒度bbox回归
具体
:这部分和PV-RCNN、SECOND以及Voxel-RCNN一样,首先将点云划分到体素中,并通过稀疏卷积网络对非空体素进行特征提取,其中每个体素特征层相对于原体素进行了1倍、2倍、4倍和8倍的下采样,并将最终的特征图投影到鸟瞰图上,利用鸟瞰图进行anchor的分类以及候选框的生成
体素点质心定位
模块作用
:用于后续的密度感知ROI网格池化中聚集非空体素特征。
具体
:首先,根据空间坐标和体素网格维度计算每个点的体素索引,相同索引的点就被聚集到一个体素当中了。接着计算每个体素的点质心,就是所有点坐标的平均值。
由于体素是规律的,所以我们可以使用卷积的特点计算出下一层体素的点质心
。其中假设第
l
l
l层的n个体素通过卷积得到
l
+
1
l+1
l+1层的一个体素,那么
l
l
l层n个体素对应的点质心就构成了集合
c
k
l
+
1
c^{l+1}_{k}
ckl+1,将n个体素对应的点个数与点质心坐标相乘并相加,除以n个体素内所有的点数和就得到了
l
+
1
l+1
l+1层中对应体素的点质心了。简述:
就是在卷积的过程中对体素的点质心取平均得到新的对应体素的点质心,但是单纯取平均少了点信息,于是先使用体素对应的点数加权,然后取平均。
这样就可以避免每个体素特征层都扫描所有点了。
密度感知的RoI Grid Pooling
密度感知的RoI Grid Pooling在RoI Grid Pooling(参考PV-RCNN)的基础上添加了KDE和self-attention部分,用于编码候选框的点密度特征。
首先在候选框中均匀采样
U
3
U^3
U3个网格点,然后对每个网格点在体素特征层中采样,采样的是以网格点为中心,半径为
r
r
r的球形区域中的体素点质心,然后基于这些体素点质心得到新的点特征(包括体素点质心的特征、体素点质心与网格点的相对距离以及使用KDE生成的当前网格点下对于体素点质心的密度估计)注:
体素点质心的密度估计表示的含义是,如果当前体素点质心与其他的体素点质心比较接近,那么就代表当前的点云比较密集,该值就会比较大。
采用pointNet++中的MSG的方式聚合这些点特征得到网格特征。
上面是在某一个体素特征图上得到网格网格点特征,接着把所有体素特征图上对应的网格点特征concat起来,就得到了最终的网格点特征,这些特征是汇集了多层的特征的、对于点云稠密度敏感的特征
这些网格点特征是通过球查询得到的,接着使用self-attention操作引入他们(非空的网格点,空网格点不做处理。注:空就是特征全0)之间的依赖关系,同时引入点云的点密度信息来刻画几何信息(因为点密度存在一定的距离信息)。
self-attention的结果就是就是将非空的网格点的特征送入transformer的encoder,然后做个残差。
点密度信息引入,首先将将候选框均匀划分为
U
∗
U
∗
U
U*U*U
U∗U∗U,也就是为每个网格点创建一个体素,然后使用网格点和体素点质心的相对坐标以及体素内的点数的log值来表示点密度位置信息。
密度置信度预测
首先将密度感知的RoI Grid Pooling部分的输出展平,FFN处理之后分两路。首先进行bbox的回归得到最终的检测结果,然后再进行另一路的置信度预测。这边我们添加两个额外特征(分别是当前bbox的点质心特征以及bbox中的点数),然后的得到置信度预测结果(注:
这也是一个小技巧,先bbox回归然后再预测置信度,而不是并行。并且将点密度又考虑了进来,贯彻全文思想 哈哈哈哈哈)
loss
包括两个部分,分别是RPN网络的loss以及RCNN loss
其中IoU的loss来自PV-RCNN中,参考这里