PointPillars是最近两年出现的激光雷达三维检测算法,因为其优越的前向速度和性能,普遍被业内所认可,并被收入百度Apollo的自动驾驶汽车开源项目中.
在我前面的文章中介绍PointNet时,结合过基于点云的目标检测和语义分割方法有四种,这里再复习下:
目前,针对三维点云数据的深度学习检测有四个方向:
1. 体素网格(Voxel Grid)法:
将无序的三维点云划分为有空间依赖关系的有序的体素网格(Voxel Grid). 比如: VoxelNet. 这种方法的精度依赖于体素网格的分割精度, 分割精度提高,带来的就是计算量的增加,且分割效果一般, 现在已经很少使用.
2.基于点云的多视角投影(Multi-view):
其原理就是将三维任务转换为已经十分成熟的二维任务. 基本过程是: 从特定角度,如: 前视图(Front-view),鸟瞰图(Bird-eye view,BEV),将点云数据投射到响应的二维平面上; 再将多视图下的二维图像组合为三维物体. 也可以通过相机和Lidar联合标定获取和融合RGB图像信息后再进一步提取特征.如YOLO三维.
3.直接基于点云的点云网络(PointNet):
该类方法直接在点云进行深度学习, 典型的如前几篇介绍的PointNet/PointNet++, PolarNet, 百度的CNN_SEG,本文介绍的PointPillars及其改进版Apollo7.0中的Mask-Pillars.
4. 基于深度学习的二维图像与三维点云融合:
基于深度学习的多传感器前融合技术, 如:MV3D,AVOD, F-PointNet.
PointPillars网络结构
先看一张来自网络的原作者论文的给我的结构图:
可以看到PointPillars整体网络结果分为三个部分:
- Pillar(立柱)特征提取网络;
- 基于2D CNN的主干网络;
- 基于SSD的物体检测网络.
一. Pillar(立柱)特征表示网络
和多数点云检测网络类似,PointPillars的思路也是将3维的点云转化为2维的伪图像.其基本过程如下:
1. 对BEV视角下的点云进行网格化划分,我们用L和W来表示两个水平方向上的网格数,可以得到 L × W 个Pillars(立柱). 之所以成立柱是因为只在x-y方向做了风格,z方向未做风格, 很形象就是立柱.
这里只展示了一根立柱,想想LxW根立柱整体排列的场景.
2. 对每根立柱内的点云进行采样. 因为点云在空间分布上具有稀疏性和不均性, 为了保证每个立柱内点云个数均衡, 因为这直接影响到后面每根柱子的输入向量表示, 所以在每根立柱内采样 N个点(如果立柱内的点数少于N则值0,负样本). 这个采样过程和前面博文介绍的VoxelNet类似. 这样就得到 L x W x N个点云点.
3. 采样得到的 L x W x N个点的向量表示: 每个点使用(x,y,z,r,xc,yc,zc,xp,yp) 9个值表示,其中x,y,z表示原始点云3维坐标, r为点的反射率, xc,yc,zc为点到当前立柱内所有点的算数平均值的距离,xp,yp是对点相对于网格中心的偏差. 这样每个采样得到的点就有了9个通道的向量表示. 结合分割的立柱个数,整个采样的点云可以用张量[D, (LxW), N]表示. 这里D=9为每个点特征通道数.
4. 用一个简单的特征提取网络对每个立柱内的点进行特征提取,将每个点的向量维度从D维变为C维,即C个通道. 此时,上一步所有点云的张量表示为: [C, (LxW), N] ,这里C=9为每个点特征通道数.
5. 对于张量[C, (LxW), N],在N所在的维度方向上对向量C中每个元素执行max操作,得到新张量: [C, (LxW)],进一步将[C, (LxW), N]展开为二维图像的表示形式[C, L,W], 再配上batch size可以表示为: [H, C, H, W]的形式,是不是很熟悉了(这里L替换为H,前面不用是怕和立柱高度混淆). 最终形成一张二维伪图像形式,方便送入基于二维卷积的特征提取网络提取特征.
整体过程如下图:
二. 基于2D CNN的特征提取
这个阶段比较简单,可以使用你擅长的任何特征提取网络,但作者采用的一种类似VoxelNet的方法:
1. top-down net: 从上(浅)至下(深)地利用卷积提取特征, 特征尺寸越来越小而通道数越来越多,达到原来的4倍,下采样率为8.
2. second network: 利用反卷积做upsample 达到和第1层特征输出一样的尺寸和通道数: [2C,H/2,W/2], 然后做拼接操作, 使输出的特征即包含深层的高语义特征,也包含浅层的高分辨率细节.
三. 基于SSD的物体检测网络
由特征提取网络提取特征后, 直接送SSD物体检测网络,做物体检测. 关于单阶检测器SSD(Single Shot Detector),这里不再阐述.
PointPillars网络结构中的损失(loss)计算
目标的3DBBox使用(x,y,z,w,l,h,θ)表示. 算法的总的loss由3部分组成:
1. 定位loss: 衡量3D BBox的准确度,. 建议结合代码看;
2. 分类loss: 对目标物体分类的概率得分;
3. direction loss: 利用softmax以确定目标物体正向朝向的得分. 比如针对一辆汽车,这种长方体BBox,定位只提供了其方位角. 但并没有确立车头正向具体是哪个方向, 对于一个BBox其θ为30度时,其车头朝向可能是30度,也可能是210度.