点云降采样输入到caffe数据输入层

欢迎访问我的个人博客:zegnzeyu.com

前言


KITTI 数据根据上篇博文 KITTI unorganised cloud to organised cloud 输出尺寸为 HxW = 64x4500, 本文准备复现论文 CNN for Very Fast Ground Segmentation in Velodyne LiDAR Data, 根据论文内CNN网络结构需要对数据尺寸进行调整,调整尺寸为 HxW = 64x360, 相当于读源数据进行了降采样(downsampling),由于无法使用 pooling 池化操作来达到此目的,所以进行手工调整。

点云数据调整


调整规则


尺寸调整规则

将点云数据由 HxW = 64x4500 调整为 HxW = 64x360,可见数据在 H 高度方向上不发生改变, W 水平方向上由 4500 调整为 360,本文依据以下规则进行调整:

调整前尺寸: |- - - - - - - - - - - - - - - - - - - - . . . 4500 . . . - - - - - - - - - - - - - - - - - - - - - - |
调整后尺寸: | - 12 - | - 13 - | - 12 - | - 13 - | . . . . . . . . . . . . .| - 12 - | - 13 - | - 12 - | - 13 - |

1213 个与卷积 kernel 类似的结构定义为卷积容器,上述两个尺寸的卷积容器交替进行采样,得到最终结构输出尺寸为 4500 / 25 x 2 = 360

数据调整


对每一个卷积容器内的数据进行提取操作,依据不同的数据使用不同的数据提取规则。以一个卷积容器为例,假设已经得到了容器内的数据,下面将对卷积容器内不同情况进行讨论。

1. 明确提取代表点的原则,目标

假设要提取的点为 A = [ r, c, h, w, l ] 点提取代表点不是为了正确反应卷积容器内的所有点的特征分布,而是,A点自身的特征能和容器内最相近的数据点label能一一对应,这样才能保证训练网络时的数据准确性。
因为我们的目标是,最后训练得到网络之后,通过网络来进行预测,那么,对于测试数据,也要进行尺寸 rescale 为 4500 / 25 x 2 = 360 操作,最后,根据对代表点 label 的预测,将 label 赋值到同卷积容器内的其他点。

2. 当容器内数据不为空,选取代表数据规则可进行下面三个方向的思考:
  • 采用平均值方法: 依据容器内数据个数取 [range, height] 平均值,并根据二者数据的权重方向思考寻找容器内与计算得出的平均值特征最近的点,用作代替,但是,用哪个做代表值作为寻找代替点的依据,需要仔细考量!
  • 采用最近距离方法: 一次迭代就可查找出结果,直接用最近距离点作为代表点
  • 采用高度方法: 考虑到高度方向的作为障碍物与地面区分的重要特征,可用此方法

数据调整输出


以 label data 为例输出显示,使用matplot进行绘图,python代码如下:

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
in_label = in_file[:,:,0]
fig = plt.figure()
origin_label = fig.add_subplot(121)
origin_label.imshow(in_label)
rescale_label =
plt.show(fig)

调整前后数据(源数据)

由下图可看出,点颜色有三种,分别是代表三个 label 值: [ -1, 0, 1 ]

调整尺寸后点颜色有二种,分别代表两个 label 值: [ 0, 1 ]

Screenshot from 2018-03-29 16:04:32.png