本文主要介绍一篇关于雷达数据语义分割的文章。这篇文章将点云通spherical projection投到2D平面后,先通过高效的CNN网络得出segmentation结果,然后还原出点云的segmentation结果,最后用一个精巧的knn-search算法,对结果进行优化。论文、代码地址:
RangeNet++: Fast and Accurate LiDAR Semantic Segmentationwww.ipb.uni-bonn.dePRBonn/lidar-bonnetalgithub.com1. 总体流程
如上图所示,总体流程分为4步:
- A:球映射(Spherical projection)
- B:语义分割(Segmentation)
- C:点云重建(Point cloud reconstruction)
- D:点云后处理(Post-processing)
2. 球映射(Spherical projection)
这步主要将3D点云映射为2D的range image,即将
其中:
- 为2D range image的宽和高;
- 分别为雷达垂直方向的上、下视角范围
- 垂直方向总的视角范围
- 表示一个点到雷达的3D距离
映射完位置后,接着给每个2D位置设置feature。这里,根据每个
- 3D坐标
- 反射率(remission)
- 距离(range)
每个坐标对应以上5个数值,所以最后可以得出一个
这种映射方式可能会丢失一些点。因此,为了后面后处理时对结果进行优化,将丢失的点补上,把所有3D点对应的
3. 语义分割(Segmentation)
这步主要对range image进行语义分割。具体使用如下图所示的沙漏形状的网络:
从图中可以看出,网络在进行downsample和upsample时,只在宽度上进行操作,保持高度不变。只要原因是,使用的数据集是用Velodyne HDL-64E激光扫描仪采集的,垂直方向只能采集64个值,相对于水平方向可以任意旋转360度采集数据来说(2048左右),数据量少很多。因此,为了防止垂直方向的信息步丢失,所以,只在水平方向进行downsample和upsample。
训练时的loss,使用加权的cross-entropy:
其中,
4. 点云重建(Point cloud reconstruction)
这步主要是把2D range image 图片segmentation的结果,映射到每个3D点上。这里需要注意的是,2D range image上的一个
具体操作是用之前保存的所有3D点对应的2D座标,找出其对应的segmentation结果。
5. 点云后处理(Post-processing)
如上图所示,2D range image经过segmentation后,结果看上去还不错。但是把结果投回到3D点云后,一些物体边缘部位的点出错的效果就很明显了。因此,后处理的目的就是对这些边缘点的结果进行修正。整体思路比较直观:通过每个点的一些邻居点的类别,来决定该点的类别。一个边缘点如果出错了,那么在3D点云中,这个点和它的大部分邻居点的类别应该会不一致。反过来,一个点大概率会和它的大部分邻居点的类别保持一致。
基于这种想法,论文提出了一种kNN search的操作。算法流程如下:
- 在2D range image上,定义一个大小为 的窗口,分别用每个2D点作为窗口中心点,用该窗口取出其邻居点(落在窗口内的其他点,视为邻居点)。这步操作可以参考matlab里面的im2col。im2col后,可以得到每个点的邻居点,组成一个矩阵,尺寸为:,每列即为对应点的所有邻居点的索引。
- 前面说到,一个2D的点,可能对应多个3D点,所以,实际的3D点数可能比 要多。通过3D点到2D点的对应关系,还原出每个3D点的在2D图片上的邻居点,得出一个矩阵,尺寸为:
- 每个2D邻居点,包含了其对应的3D点的座标、类别。所以,可以从这些邻居点中,用KNN算法找出距离跟目标点最近的前k个点作为邻居点。论文中使用的距离,是两个点的range差的绝对值,而不是3D距离。这样做,是为了提高效率。此外,论文还使用了一个inverse Gaussian Kernel,来对距离进行调整,即:距离越近,权重越小;距离越远,权重越大。
- 接着,用一个距离阙值(cutoff threshold)对k个邻居点进行过滤,去掉距离大于阙值的邻居点。
- 对于剩下的邻居点集,哪个类的点数比较多,目标点就属于哪个类。
6. 总结
这篇论文提出了一种很直观的后处理方式kNN search。从实验结果看,对性能有明显帮助。