3D点云学习:SECOND目标检测①论文阅读

论文: 论文链接.
源码: 源码链接.
由于本来是准备研究PV-RCNN网络的,可是发现源码还没有开源。但是在PCDet.上发现包含了SECOND等几个网络
源码2: 源码链接2.

1 摘要

基于LiDAR或基于RGB-D的目标检测被用于从自动驾驶到机器人视觉的众多应用中。 在处理点云LiDAR数据时,基于Voxel的3D卷积网络已经使用了一段时间,体素方法能够在处理雷达点云数据时的保留更多的信息。 但是,仍然存在问题,包括推理速度慢和方向估计性能低。因此,我们研究了一种改进的稀疏卷积方法用于这种网络,这显着地增加了网络训练和推理的速度。通过引入角度损失的方法来提高方向估计性能,以及一种新的能增强收敛速度和性能的数据增强方法。所提出的网络在KITTI 3D物体检测基准测试中产生最先进的结果,同时保持快速的推理速度。

2 网络结构

3D点云学习:SECOND目标检测①论文阅读_第1张图片
作者将网络分为了三大部分:

1 第一部分a voxelwise feature extractor用于生成体素和体素特征提取

包括图中的前两部分

Point Cloud Grouping

个人理解是将点云数据转化为体素格式,转化方法为:首先根据cfg中预先设定的体素数量设置一个缓冲区,即指定大小的一个tensor,全部给0,然后遍历点云计算点云分别属于哪个体素,记录所属的体素坐标和每个体素的点数,这个步骤使用的方法是哈希表。最后得到的数据是all voxels,their coordinates and the number of points per voxel三个。这些体素在生成时限制了体素所处的实际位置以及每个体素可以包含的最大点数。

Voxelwise Feature Extractor

使用体素特征编码(voxel feature encoding VFE)层提取体素特征。 VFE层以同一体素中的所有点的数据作为输入,并使用由线性连接层,批归一化(BatchNorm)层和激活函数层(ReLU)组成的完全连接网络(FCN)来提取逐体素提取特征。 然后,它使用逐体素最大池来获取每个体素的局部聚合特征。 最后,将获得的体素局部特征平铺,并将这些平铺的体素局部要素和每个点的特征拼接在一起。再然后使用一个FCN(cout)将输入这些逐点的特征转换为cout维的输出特征,FCN(cout)也是一个Linear-BatchNorm-ReLU层。 总体而言,三维特征提取器由几个VFE层和一个FCN层组成。

1第二部分a sparse convolutional middle layer稀疏3D卷积层,对体素进一步特征提取

论文中首先介绍了2D密集卷积方法到3D稀疏卷积方法的原理,同时指出了现有的稀疏卷积的缺点:在浅层的卷积中,激活状态的体素数量比较少,稀疏卷积效果明显,计算量减少,但是随着网络的深入,激活状态的体素数量增多,因为卷积操作导致很多没有数据的位置上也出现了数据,系数卷积的效果下降,计算开始增大。
接着作者实现了一种基于GPU的submanifold convolution,该方法可以有效解决上面提到的问题。基于这些理论,作者提出了自己的稀疏卷积层:
3D点云学习:SECOND目标检测①论文阅读_第2张图片
通过将normal sparse convolutionsubmanifold convolution进行结合,最后加入一个sparse-to-dense layer将3D稀疏特征转化为密集的2D特征,用于进一步的处理。

3第三部分RPN,Region Proposal Network

RPN在Faster R-CNN中第一次提出来,简单来说就是SASSD和SECOND网络里面的anchor,在每一个框或者体素上提前生成一个预选框/锚框/候选区域,网络的输出视为对候选区域的偏移和缩扩,再将预选框和网络输出的结合,经过阈值的筛选,得到整个网络目标检测的结果。
3D点云学习:SECOND目标检测①论文阅读_第3张图片
SECOND的RPN如图所示,看起来和YOLO-V3的rpn有些相似,都是经过了三层的con+deconv,对每一层进行拼接,再使用卷积转化为准备求损失的形式。

3 训练和损失

SECOND中加入了一个针对角度问题和朝向问题的损失,比较特殊

1角度损失

角度损失
按照文中所说,这样做的有点有两个:(1)解决了0和pai方向之间的对抗性示例问题,也就是本来0和pai两个角度对应的bbox是一摸一样的,没有这一项损失时,两种情况的损失一样,这样再优化时,可能会造成优化方向的逆向,越来越差;(2)自然地针对角度偏移函数对IoU进行建模。(不太懂)

2 朝向损失

论文中的说法:如果绕地面真相的z轴的偏航旋转大于零,则结果为正;否则为负。
转化成了一个目标识别问题,只用输出一个1或者-1就可以了,再与truth进行比较。

3 总损失

关于bbox和bbox class的损失,采用的方法比较常规,Focal Loss和SASSD中一样,总损失是:

4 数据增强 Data Augmentation

我们在训练中遇到的主要问题是地面实况样本的存在太少,这极大地限制了网络的收敛速度和最终性能。 为了解决这个问题,我们引入了一种数据扩充方法。 首先,我们从训练数据集中生成了一个包含所有地面真相标签及其关联点云数据(地面真相3D边界框内的点)的数据库。 然后,在训练过程中,我们从该数据库中随机选择了几个基本事实,并通过级联将它们引入当前的训练点云中。 使用这种方法,我们可以大大增加每个点云的地面真相数目,并模拟存在于不同环境中的对象。 为避免物理上不可能的结果,我们在对地面真相进行采样并除去与其他物体碰撞的所有采样物体后进行了碰撞测试。
将所有数据的中的box按照类别不同,对label和points进行同意保存,得到database文件,再对每一帧数据按照一定的目标个数进行填充/增强,这样每次训练都不会因为label量太小而影响训练优化结果。
SASSD中的数据增强也是一样的SASSD.

整篇看下来,SECOND中比较特殊的是
1>他对体素数据的初步处理,怎样由一个体素中的所有点得到能够代表这个体素的特征,可以与SASSD比较比较
2>数据增强方法原来是这里首创的,简单粗暴有效
3>这篇文章的作者是重庆大学的,而且也是学电气的,在研究生实习期间写下这篇,羡慕了多多学习

参考博客感谢作者.

你可能感兴趣的:(点云目标识别,计算机视觉,人工智能,pytorch,自动驾驶)