百度开源的旧版点云网络是cnn_segmentation,是三维语义分割网络,apollo3.0-apollo5.0一直沿用,由于采用了百度的大规模数据集训练,其检测性能(主要是鲁棒性、边缘拟合度)要胜于基于KITTI训练的神经网络。但该神经网络对GPU的性能要求高,需要GTX1080以上的显卡才能维持10HZ的推理频率。
因此百度在apollo6.0推出了其新的检测网络模型,在速度上有很大提升。
(1) 网络模型解析,检测算法解析博客
(2) 3d_obstacle_perception_cn.md
(3) 源码阅读解析博客
cnn_seg对点云的三维数据首先进行鸟瞰图投射,然后采用二维网络进行分割。如下图所示。
点云中的每个点落在了对应的网格中,进而可以用网格中的位置索引到点云的任意点,无序的点云数据从而可以,输入到全卷积神经网络(利用这些网络提取特征)。特征包含:
- 单元格中点最大高度
- 单元格中最高点的强度
- 单元格中点的平均高度
- 单元格中点的平均强度
- 单元格中的点数
- 单元格中心相对原点的角度
- 单元格中心相对原点的距离
- 二进制表示单元格是否被占用还是空的
然后,通过进入卷积神经网络FCNN的障碍物检测,cnn_seg获取了每个单元格的4个预测信息。“中心偏移” “对象性” “ 积极性” “对象高度” 。用来进行后续的处理。
后处理过程详细见网络模型解析。“构建障碍物集群” “集群分类” “障碍物边框构建” 。
(cnn_seg属于百度自创的网络,由于没有开源其训练,无法获知其LOSS等。网上有一些博客,通过自己写训练代码,可以对KITTI等进行训练)
apollo6.0激光雷达,算法库有更新,激光雷达用了新的模型pointpillars。并对其进行了改进,提高了检测性能。详细解析见以下两个链接。
(1) 源码阅读博客
(2) 检测模型解析分析博客,含与原版pointpillar的对比
(由于百度没有开源其训练,所以分析原版的pointpillars 网络)pointpillars是cvpr2019的优秀网络。使用pillar描述点云数据,使用编码器网络学习其特征;整个方法采用2D卷积层。这样的效果就是:pillar的数据表示可以不需要针对具体的雷达做适配,2D卷积的速度较快,此外自学习的特征表示有较好的范化能力。
网络结构是由以下组成:“Pillar feature net", " Backbone (2D cnn)", “Detection head(ssd)”.
其中,“Pillar feature net"是首先在鸟瞰图上对其进行网络分割,得到(H X W)个柱子分割,即为pillar;然后对每个柱子的每个点取9个维度作为网络的输入(x,y,z,r,xc,yc,zc,xp,yp),x,y,z是位置,r是反射率,xc,yc,zc是点到pillar内点的算数平均值的距离,xp,yp是点相对于网路中心的偏差。
”Backbone (2D cnn)",包含了用于采集不同尺度特征信息(卷积、归一、非线性层)的子网络,和用于将不同尺度特征信息融合(反卷积)的子网络。
“Detection head(ssd)”,采用了SSD做检测网络。
损失函数采用了类似SECOND的损失函数,由“定位回归损失” “HEADING损失” “分类损失”组成。数据集的ground truth包含(x,y,z,l,w,h,o)即位置、长宽高、heading 。