作者:Panzerfahrer


0. 前言

虽然论文已经发表一年多了, 截止目前 (2020.04.18) pointpillar 依旧是kitti排行榜上速度最快的"男人", 而且有着不错的AP结果,出自安波福,是为数不多可以应用在自动驾驶领域的模型.

论文链接:https://arxiv.org/pdf/1812.05784.pdf

代码链接:https://github.com/nutonomy/second.pytorch

pytorch->onnx->tensorrt 工具链:​https://github.com/SmallMunich/nutonomy_pointpillars​

1. 介绍

首先说应用深度学习在点云上做object detection的两个思路, 一个是3D卷积, VoxelNet是第一个endtoend的网络, 后来SECOND对此作了改进, 但是仍然3D卷积的瓶颈依旧明显; 另一个是投影到BEV (Bird's Eye View)像图像做二维卷积, 第二种方法虽然时间更快, 但是点云的稀疏性让卷积的不实用,效率很低, 所就用了 Fast Encoder, 简单来说就是对点云密度比较高的地方进行卷积, 速度提升还是很明显的.

2. 网络架构

PointPillars:点云物体识别的快速编码_点云

2.1 Pillar Feature Network

PointPillars:点云物体识别的快速编码_3d_02

对于识别Car而言, 识别范围为 前后左右上下[(0, 70.4), (-40, 40), (-3, 1)], 将点云投影到二维栅格中, 每个Pillar (栅格柱子) 的大小为 0.16*0.16, 可以理解为图像里的一个像素, 那么伪图像的尺寸就是 440*500. 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几何中心的偏移.

因为~97% 的Pillar都很稀疏, 所以需要筛选出稠密(dense)的Pillar做卷积, 如上图所示, 选出的 Stacked Pillars的尺度为(D, P, N) 分别代表特长度D=9, Pillar的个数P=2847(假设), 点的数量N=100(假设), 这里用了一个简单的PointNet, 之后接了一个BN和一个ReLU得到尺度为(C, P, N) 的Tensor, 这里特征C的长度为64,然后经过max操作得到尺寸为(C, P)的Tensor, 然后在反投影回伪图像上, 因为反投影的Pillar个数只有2847, 剩下的将被填充为0.

2.2 Backbone& Detection Head

下图是BackBone和RPN的结合, 论文用的是SSD, 但实际用的是RPN.

PointPillars:点云物体识别的快速编码_点云_03

3. Loss Function

Loss分为三部分, 定位Loss, 方向Loss 和分类Loss:

PointPillars:点云物体识别的快速编码_卷积_04

这里提一句, Pointpillar 可以识别朝向,也就是会做是否旋转180°的处理。

总结与思考

1. 其实投影到二维的做点云物体识别的网络很多(例如 RT3D:自动驾驶中利用3D点云实时车辆识别), 这篇文章的主要贡献在于 "Fast Encoder", 也就是将点云稠密的Pillar(上文提到2847个)输入给网络, 很多博客都没提到这一点,我觉得这才是这篇论文的精髓所在, 这大大提升了识别速度, 论文写可以达到62Hz.

2. 虽然速度快但是也有缺点,首先网络的输入只是部分"稠密"的Pillar这必将略微降低识别效果; 另外因为网络中训练不同种类时使用的卷积stride和Anchor的尺寸不一样, 导致多分类的效果不理想.


PointPillars:点云物体识别的快速编码_3d_05