1、简介
这篇论文是IROS2020年的论文,9月1号提交的,还没提交几天。IROS2020是10月份才开始。这篇论文代码链接论文代码,不过似乎还没完全弄好(毕竟9月1号才提交,到现在都没几天),论文链接。
文章用划分网格的方式把点云划分成一个个小方格,在每个网格中,用Pointnet提取特征,生成一个伪图像,文章中是把点云划分成100X100的网格,相当于一个像素大小为100X100的图像,图像中是有RGB三个通道,而这个是Pointnet提取64个通道,接下来用类似于Segnet的网络(还没看过Segnet)来估计每个网格中的高程值。这个高程值相当于在当前位置的地面估计高度,在高程值一点范围内的为地面点,超过一定范围内的为非地面点。数据集用的是Segmatic KITTI数据集生成一个新的带标记信息的地面高程数据集。生成方法有两种,后面再讲。
2、数据集生成
文章的数据集是基于Segmatic KITTI数据集来生成的,Segmatic KITTI数据集中标签很详细,有28个类,很详细,首先要确定的是什么是地面点,把人行道,停车场,道路,其他地面这几个类认为是地面点,其他的点为非地面点,具体可参考我的博客,里面有个是用open3d来显示地面点与非地面点,显示结果红色为地面点,绿色为非地面点。
步骤:
1、去除非地面点(留下人行道,停车场,道路,其他地面这几个类的点,其余点去除)
2、划分网格(以激光雷达为原点的鸟瞰图,X轴范围为(-50,50),Y轴范围为(-50,50),大小为1X1,划分成100X100的网格)
3、用生成方法(有两种方法,一种是形态学方法,一种是基于CRF的方法)生成数据集。
首先是形态学方法:
1、每个网格中有多个点,取点的平均值来表示当前网格的高程值。但是也会有什么点都没有的网格,把这部分网格先记作0.
2、用膨胀的方法来扩张有点的的网格,再用膨胀后的网格减去没有膨胀的网格,就得到了我们需要去估计高程值的网格。如下图,a为没经过膨胀的网格图,b为膨胀后的网格图,c为需要估计地面高程值的网格图。不知道什么是膨胀,在网上找了个大佬的链接
3、用基于双调和函数的方法(论文地址)来估计地面高程值,填补到需要估计地图高程值的网格图中。
基于CRF的方法:
文章并没有细说,提到是用论文地址中的方法来建模地面。
在本文章中,也是选取基于CRF的方法来生成地面高程数据集,为了使网络具有更好的泛化能力,关于x轴和y轴随机增加了在(-10,10)范围内的3D旋转。用11个序列中的7个序列来作为训练集,4个序列作为验证集。有6584帧用作训练,有3040帧用作验证。Segmatic KITTI数据集中有00到10序列是由标签的,其中,00中有4540帧,01中有1100帧,02中有4660帧,03中有800帧,04中有270帧,05中有2760帧,06中有1100帧,07中有1100帧,08中有4070帧,09中有1590帧,10中有1200帧。不是很清楚是选了哪4个序列跟哪7个序列进行验证和训练。有点懵。因为这11个序列的数据加起来是不止9624帧的。先不纠结这个问题。
3、网络模型
看这个图,感觉挺直观的。
把点云划分网格,得到100X100的网格图,每个点,如果只看空间坐标是3维的,KITTI中还提供了强度,就是4维,然后再进行扩充,扩充成(x,y,z,i,xc,yc,zc,xp,yp),x,y,z,i就是点以激光雷达为原点得到的空间坐标跟反射强度,xc,yc,zc表示当前点到当前点属于的网格中点的平均值之间的x方向距离,y方向距离,z方向距离,xp,yp表示在划分网格中的下标。
设置一个先验N值,表示每个网格中点的数量,只对非空网格进行处理,如果点的数量超过N,则用随机采样的方式,选取其中的N个点,如果是少于N,则用0扩充到N个点,文章中N为100.
开始用pointnet对网格提取特征,提取特征后成为一个100X100X64的伪图像,用Conv1(64, 128),Conv2(128, 128), Max-pool, Conv3(128, 256), Conv4(256,256), Max-pool, Max-unpool, Conv5(256, 256), Conv6(256,128), Max-unpool, Conv7(128, 64), Conv8(64, 64), and regression layer Convreg(64, 1).最后得到一个地面高程估计值。其中池化层大小为2X2,步长为2,卷积核大小为3X3,步长跟填充都为1,激活函数是ReLU。
4、损失函数
文章中损失函数由两部分构成,平滑损失跟回归损失:
其中I表示真实的地面高程值,就是标签。I冒(不知道怎么打,就用I冒。)表示估计出来的地面高程值。平滑损失:
α跟β的值,在文章的实验部分是分别取的0.9与0.1。
接下来就是代码部分。
5、代码部分
5.1、生成数据集
Segmatic KITTI数据集请参考我前面写的博客。
第一步就遇到了难点,看样子关于GNDNET的代码部分学习留到后面再补上吧。