PointPillar是2019年提出来的模型,相比于之前的点云处理模型,它有3个要点:
处理点云最先需要大量的手工作业,后来VoxelNet第一次引入了真正的端到端的特征学习。
但VoxelNet又是基于PointNet的基础上做了进行的模型设计。
VoxelNet很优秀,但有2个不足的地方:
因为,VoxelNet慢,所以,后面又有了新的网络SECOND.
SECOND将速度提升到了20Hz,但是仍然保留了3D卷积。
好了,轮到PointPillar出场了。
在它的前辈
PointNetVoxelNetSECOND基础上,它有一些显著的特性:
PointPillar处理点云到结果分3个步骤。
在VoxelNet当中会将所有的点云切割成一个一个Grid称为Voxel。
PointPillar也这样做,但是在z轴上它不进行切割,相当于精简版本的Voxel,也可以看成z轴上的Voxel合成一个Pillar。
在一个Pillar中单个点云可以被如下表示:
这是个9维的增广向量,维度用D表示,这里D=9。其中
x,y,z是物理位置r是点云反射率下标c是指代一个Pillar的质心,在这里需要求出一个点云xyz相对质心的偏移量下标p指代Pillar的物理中心,同样要求x,y的相对偏移量为了把稀疏的点云形成稠密的数据,PointPillar运用了2个手段:截取和补齐
最终所有的点云会聚集到一个稠密的尺寸为(DxNxP)的Tensor上。
然后对于每一个点云运用一个简化版本的PointNet,之后再跟着一个简单的线性层
BNReLu这个线性层等效于1x1的卷积。
最终能够学习到点云特征,产生了尺寸为(CxPxN)的Tensor。
现在,还需要做一步工作,将点云根据索引移动回来原来的位置,产生伪图像(pseudo-image),尺寸是(CxHxW),HW是画布的高和宽.
和2D目标检测一样,3D目标检测网络中也有backbone模块。
PointPillar中的backbone长这样。
backbone的处理流程有3步:
下采样由一系列Block(S,L,F)组成。
S是相对于伪图像的stride。L是3x3尺寸的2D卷积层数F是输出通道数
上采样的操作用UP(S_{in},S_{out},F)表示。
in和out代表stride是从in的数量到out的数量.
最终要得到F个featrue,最终一起拼接起来。
个人的理解:为了得到不同尺寸的信息,所以需要下采样,但为了将所有信息重新统一定位到原pseudo-image上,所以要通过上采样重新调整尺寸.
PointPillar中是用SSD来做3D检测的。与先验的box对比采样的也是2D的IoU。向上的height和elevation没有参与IoU,但添加到了额外的回归任务当中。
PointPillar的Loss函数和SECOND保持一致。
Loss由3个子Loss组成:
先看定位:
然后,d^{a}代表anchor的对角线.
最终的定位Loss如下:
再看Dir的Loss,它直接采用Softmax分类形式。
目标分类的Loss采用FocalLoss:
在这里\alpha=0.25,\gamma=2最终的Loss由3个Loss调和形成。
N_{pos}是anchorbox正样本数量。\beta_{loc}=2,\beta_{cls}=1,\beta_{dir}=0.2
PointPillar也是以KITTI为测试基准的,好其他网络一样,由于样本数量过少,数据增加也就是必不可少的操作。
PointPillar论文中有提到,它是跟随SECOND的思路做的一张lookuptable,然后对于每个类别随机取样。
之后就是常规的旋转、翻转、缩放、平移之类。
PointPillar将自己的表现划分2个指标:mAP和AOS.
这个无非是想说,我很牛,我基于纯Lidar数据能够和lidar+Image融合数据后的模型媲美。
其实,我更感兴趣的是AOS这个指标。
AOS是averageorientationsimilarity(AOS)的意思,自然是衡量3Dbox的方向相似度。
PointPillar充分吸收前人的思想,一字排开:
所以,它很棒,点个赞,在自动驾驶世界中,快是王道,不讲速度的模型是耍流氓。