《PointPillars: Fast Encoders for Object Detection from PointClouds》 CVPR2019
用于点云目标检测的快速编码器
首先说应用深度学习在点云上做object detection的两个思路, 一个是3D卷积,VoxelNet是第一个end to end的网络, 后来SECOND对此作了改进, 但是仍然3D卷积的瓶颈依旧明显; 另一个是投影到BEV (Bird’s Eye View)像图像做二维卷积, 第二种方法虽然时间更快, 但是点云的稀疏性让卷积的不实用,效率很低,所就用了 Fast Encoder, 简单来说就是对点云密度比较高的地方进行卷积,速度提升还是很明显的。
图2.网络概述。该网络的主要组件是支柱特征网络,骨干网和SSD检测头。有关详细信息,请参阅第2节。原始点云被转换为堆叠柱张量和柱索引张量。编码器使用堆叠的柱来学习一组可以分散回到卷积神经网络的2D伪图像的特征。检测头使用骨干的特征来预测物体的3D边界框。注意:这里我们展示了汽车网络的主干尺寸。
对于识别Car而言, 识别范围为 前后左右上下[(0, 70.4), (-40, 40), (-3, 1)], 将点云投影到二维栅格中, 每个Pillar (栅格柱子) 的大小为 0.16*0.16, 可以理解为图像里的一个像素, 那么伪图像的尺寸就是 440x500。 Pillar中的每个点特征D长度9, D=[x, y, z, r, x_c, y_c, z_c, x_p, y_p], 其中r代表intensity/reflection, [x_c, y_c, z_c] 代表一个Pillar中所有点的质心坐标, [ x_p, y_p] 代表质心和Pillar几何中心的偏移。其中c下标表示到支柱中所有点的算术平均值的距离,p下标表示到支柱中心的偏移量。
因为~97% (1 - (6k/9k)/(440x500) ≈ 97%)
的Pillar都很稀疏, 所以需要筛选出稠密(dense)的Pillar做卷积, 如上图所示, 选出的 Stacked Pillars的尺度为(D, P, N) 分别代表特征长度D=9, 非空Pillar的个数P=2847(假设),N为每个pillar的采样点数(设定值),N=100(假设),每个柱子中点多于N的进行采样,少于N的进行填充0。这里用了一个简单的PointNet,之后接了一个BN和一个ReLU得到尺度为(C, P, N) 的Tensor, 这里特征C的长度为64,然后经过max操作得到尺寸为(C, P)的Tensor,一旦编码,特征被分散回原来的支柱位置,以创建一个大小(C,H,W)的伪图像, 因为反投影的Pillar个数只有2847, 剩下的将被填充为0。至此,我们就用一个(C,H,W)的tensor完成了点云数据的表达。
分为2部分
用的ssd,高度z是单独回归的。基于SSD的目标检测头进行bbox回归。
在本文中,我们使用单光探测器(SSD)[18]设置来执行三维目标检测。与SSD类似,我们使用联合上的2D交集(IoU)将先验框与地面真值相匹配[4]。边界框高度和高程不用于匹配;而是给定二维匹配,高度和高程将成为其他回归目标。
与预先训练我们的网络不同,所有权重都是按照[8]中的统一分布随机初始化的。编码器网络具有C=64输出功能。除第一个街区的跨步外,车辆和行人/自行车手靠背相同(S=2对于车辆,S=1用于行人/骑自行车者)。两个网络都由三个模块组成:块1(S、4、C)、Block2(2S、6、2C)和Block3(4S、6、4C)。每个块通过以下放大步骤向上采样:Up1(S、S、2C)、Up2(2S、S、2C)和UP3(4S、S、2C)。然后将Up1、Up2和Up3的特征连接在一起,为检测头创建6C特征。
3d box由(x,y,z,w,l,h,θ)确定. 类似于2d box由(x,y,w,h)确定,3d box多了一个z方向的数据,以及一个角度,用以预计3d box的朝向(绕z轴的角度).
loss由3部分组成:
定位loss:
我们使用SECOND [28]中介绍的相同损失函数。 Ground truth boxes and anchors 由(x,y,z,w,l,h,θ)定义。ground truth and anchors 之间的定位回归残差由以下因素定义:
对象分类loss
我们使用focal loss [16],focal loss通过对不同样本的loss赋予不同的权重,该权重是一个与当前样本预测概率相关的值。
系数为(1-p)的变种,从而达到p越小,loss权重越大的目的,即放大hard example的loss,从而使得模型更好地适应难以分类的样本.
方向loss:
由softmax得到。
由于角度定位损失无法区分flipped boxes,我们在离散化方向上使用softmax分类损失[28],Ldir,这使网络能够学习航向。
作用: 由于localization loss不能区分box的 +/- π, 所以加上direction loss。
总损失
这里提一句,Pointpillar 可以识别朝向,也就是会做是否旋转180°的处理。
使用了 pillar的方式,一个(x, y) location只有一个pillar, 而不是many voxels, 元素便少了,自然速度就快了。
SECOND的loss、data augmentation还是比较经典。虽然速度快但是也有缺点,首先网络的输入只是部分"稠密"的Pillar这必将略微降低识别效果; 另外因为网络中训练不同种类时使用的卷积stride和Anchor的尺寸不一样, 导致多分类的效果不理想。
参考(感谢)
https://zhuanlan.zhihu.com/p/102994173
https://zhuanlan.zhihu.com/p/107975261
https://www.cnblogs.com/sdu20112013/p/12455629.html