PointPillars

论文:CVPR 2019 Open Access Repository (thecvf.com)

image-20220105165859553

论文概述

本篇文献主要解决将点云编码为适合更适合目标检测的格式的问题。作者没有预训练网络,所有权值随机使用均匀分布。

特征解码网络

将点云转换为稀疏的伪图像。

不同于voxelNet将整个点云分割为许多的voxel,PointPillar只在xOy面进行划分,整个点云空间被分割为若干个高度为点云图高度(在z方向上近似是无限的,因此不需要超参数控制z维度)的柱体。

与voxel类似,大部分的柱体都是空的。而对于包含点数过多N的柱体采用随机采样,对于包含点数过小的柱体应用零填充。并通过限制非空柱体的数量P,将整个点云用一个尺寸为(D,P,N)的密集张量。

接着使用简化的PointNet,对于每个点应用一个线性层(张量的1×1卷积)、一个BN层、一个ReLU层,产生一个尺寸为(C,P,N)的张量。(C=64)然后对其进行max操作,创建一个尺寸为(C,P)的输出张量(将三维点云转换为二维数据)。因为作者是使用的柱体而非voxel,所以可以在卷积中间层避免三维卷积,极大的提升计算效率。

编码后特征被分散到原始位置,以创建一个大小为(C,H,W)的伪图像(H,W为画布的高度和宽度)

二维卷积骨干网络

将伪图像转换为高层的表示。该网络又可以分解为两个小的网络

  1. 自上而下网络:在越来越小的空间分辨率上产生特征
  2. 对自上而下的特征进行上采样和连接

作者使用Block(S,L,F)来表示自顶向下的主干,每个block的操作步长为S(与初始的伪图像大小有关),每块都有一个二维卷积层L和输出通道F,以及一个BN层、一个ReLU层。

第一层卷积步长为S/Sin,以确保block在执行步长为Sin卷积操作后还可以执行步长为S的操作。(对于汽车S=2,对于行人、自行车S=1)(The first convolution inside the layer has stride S/Sin to ensure the block operates on tride S after receiving an input blob of stride Sin)。后续block上的卷积步长为1.

最终从每个自顶向下block得到的特征通过一定的上采样和拼接进行组合:

  1. 对特征进行上采样Up(Sin,Sout,F),初始步长Sin,最终步长Sout,利用转置二维卷积和F得到特征
  2. 使用 BatchNorm和ReLU 应用上采样特征,最终的输出特征是从不同步长级联得到的特征

Detection Head

检测三维box,并进行回归。这里的 Detection Head是模块化的,即对于不同的任务可以使用不同的 Detection Head。就像使用不同的镜头来拍摄不同的照片。

作者这里使用 Single Shot Detector (SSD)以来处理三维目标检测。同时,使用二维的IoU将ground truth与先验box相匹配。而将box高度与高度elevation作为额外的回归目标

损失函数

回归残差:
$$

\Delta x=\frac{x^{gt}-x^a}{d^a}, \Delta y=\frac{y^{gt}-y^a}{d^a}, \Delta z=\frac{z^{gt}-z^a}{d^a}\quad(d=\sqrt{(w^a)^2+(l^a)^2});\\ \Delta l=\log{\frac{l^{gt} }{l^a} }, \Delta w=\log{\frac{w^{gt} }{w^a} }, \Delta h=\log{\frac{h^{gt} }{h^a} }, \Delta\theta=\theta^{gt}-\theta^a;

$$
定位损失:由于角度定位无法区分翻转的box,在离散化方向上使用softmax分类损失Ldir学习车辆前进方向
$$
L_{loc}=\sum_{b\in(x,y,z,w,l,\theta)}SmoothL1(\Delta b)
$$
目标分类损失:p^a是锚点是类的概率,α=0.25,γ=2
$$
L_{cls}=-\alpha_a(1-p^a)^\gamma\log{p^a},
$$

总损失函数:Npos为正锚点的数量、βloc=2、βcls=1、βdir=0.2
$$

L=\frac{1}{N_{pos} }(\beta_{loc}L_{loc}+\beta_{cls}L_{cls}+\beta_{dir}L_{dir}),

$$
损失函数是以哦那个初始学习率为0.0002的Adam进行优化,每15个epoch减少0.8倍。用于验证与测试的epoch个数分别为160、320,batch大小分别为2、4.

超参数设置

  • xy分辨率:0.16m
  • 点柱最大数量P:12000
  • 点柱内最多点数N:100
  • 轴对齐非极大抑制NMS的IoU阈值:0.5

汽车检测任务:

  • x,y,z检测范围:[(0, 70.4), (-40, 40), (-3, 1)]

  • 锚点宽、长、高:(1.6, 3.9, 1.5)m,z中心:-1m

  • 匹配正负阈值:0.6、0.45

行人、自行车检测任务:

  • x,y,z检测范围:[(0, 48), (-20, 20), (-2.5, 0.5)]

  • 行人锚点宽、长、高:(0.6, 0.8, 1.73)m,z中心:-0.6m

  • 自行车锚点宽、长、高:(0.6, 1.76, 1.73)m,z中心:-0.6m

  • 匹配正负阈值:0.5,0.35

数据增强

  1. 类似SECOND,创建一个查找表,其中包含所有类别的ground truth 3D boxes以及box中相关联的点云;对于每个样本随即选择若干个汽车、行人、自行车的真实样本将其放入当前环境中以提升对于不同环境下目标检测的能力
  2. 对所有 ground truth boxes独立的旋转、转换,进一步丰富训练集。
  3. 执行两个全局增强集合:随机沿x轴翻转并执行全局旋转和放缩、使用N(0,0,2)模拟噪声对x、y、z坐标转换

实验结果

image-20220105165859553

实验发现该网络对于行人的检测仍有一些不足,行人与自行车会被误认为彼此。行人也容易被混淆为狭窄的带有垂直特性的物体,如树干、电线杆。

推理速度快也是该网络的一大优势,总的运行时间:16.2ms。主要推理过程如下:( Intel i7 CPU and a 1080ti GPU)

  1. 根据图像的可见性、范围加载、过滤点云1.4ms
  2. 将点分配到点柱并进行处理2.7ms
  3. 将点柱张量加载进GPU2.9ms、编码1.3ms、分散为伪图像0.1ms
  4. 由卷积骨干网、检测头处理7.7ms
  5. NMS处理0.1ms(使用CPU)

编码阶段是该网络运行时间少的关键,VoxelNet的解码时间190ms、SECOND的编码时间50ms。同时该网络只使用一个PointNet网络进行编码,将pytorch的运行时间减少了2.5ms。将第一个block的尺寸缩减到64以匹配解码输出的尺寸,并将上采样特征层输出尺寸减半到128,这些都大幅减少了运行时间。

实验证明,当推理速度达到105Hz时,准确率只减少了一点。相比之下,激光雷达的工作频率为20Hz。但是需要注意的是,现在的实验是使用桌面级GPU,如果应用于实际,使用嵌入式GPU,计算效率会下降;一个可操作的AV需要查看完整的环境并处理全部点云,而实验使用的KITTI数据集中,只会使用10%的点云数据。实际中需要计算的数据量有很大区别。

消融实验

作者通过一系列消融实验得到以下结论:

  1. 好的编码器明显优于固定的编码器,特别是对于更大的分辨率。
  2. box增强并不会带来更大提升,反而在检测行人方面导致性能下降
  3. 更小的点柱使得定位更准确以及学习的特征更多,更大的点柱计算速度更快(更少的非空点柱)

做出的贡献

  1. 提出一个新的基于点云解码器和网络PointPliiar,适用于端到端的基于点云的三维目标检测网络的训练
  2. 将对点云的柱上的计算变为密集的二维卷积,使得推理速率到达62Hz
  3. 在KITTI数据集上的实验,该网络表现出对于汽车、自行车、行人检测最先进的结果
  4. 通过消融实验 ablation studies,发现对检测性能起到关键影响的因素
  5. 作者提出的点柱偏移Xp、Yp以及簇偏移Xc、Yc、Zc带来更好的检测效果
谢谢你请我吃糖果
0%