最近想通过模拟生成激光雷达数据,用来提供给无人车感知模块训练深度学习模型。主要原因是因为训练深度学习模型需要大量标注好的数据,如果可以批量生成模拟数据来进行训练模型,并且达到和真实数据一样的效果,可以极大的节省标注成本和模型训练效率。

数据生成方法

目前主要的方法分为3类:

  1. 基于真实数据生成。主要的思路是真实数据没有办法覆盖一些天气、光照变化,因此用GAN通过真实数据生成模拟数据,模拟出的数据会在真实场景上增加白天和夜晚的场景,以及下雨、下雪等情况。
  2. 基于模拟器生成。主要的思路是通过在游戏引擎中建立模拟真实场景的模型,然后模拟激光雷达的物理特性,游戏物理引擎发出射线检测来获取当前环境的距离信息,然后生成激光点云。
  3. 基于结构化数据生成增强数据。这部分的方向比较多,有基于虚拟数据生成增强现实数据的方法,也有基于图片生成三维点云数据的方法。

生成数据只是第一步,实际上最重要的问题是如何判断生成的数据是否满足要求,是否能够完全替代真实数据。

数据生成方法的评价标准

实际上如何评价数据生成的是否足够好,以及方法是否能够平滑迁移非常重要。

  1. 方法是否通用,功能是否可以平滑迁移。很简单的例子,如果通过真实数据训练好GAN模型,当迁移到另外一个城市的时候,之前训练好的GAN模型生成的数据不太好,那么就失去了数据生成的意义。因为花力气训练一个数据生成模型,然后再用生成的数据训练模型,还不如直接去标注真实数据。
  2. 生成的数据是否足够好。如何判断生成的数据是否足够好,这是个相对困难的问题,必须要有一套评价体系来证明生成的数据和真实数据的差异。

有大量的训练任务。如果需要训练的数据量比较小,就不需要花这么大代价去生成数据了。

论文解读

下面我们主要是分析"Augmented LiDAR Simulator for Autonomous Driving"这篇论文来介绍如何模拟激光雷达数据,方法比较有借鉴意义,具体的实现需要验证。

首先,论文中提到目前标注真实数据的成本很高,如果可以通过生成数据并且提供标注好的ground truth,那么可以极大的减少标注成本。并且不同于采用仿真器中通过3D模型来模拟生成激光点云的方法,直接采用扫描并且仿真的方法,该方法不需要建立完善的3D模型,直接通过激光雷达扫描对应的街道,然后在街道中放入动态物体的模型,最后生成模拟好的点云数据。

激光雷达发射教程(如何真实的模拟激光雷达)(1)

生成点云的流程

下面我们主要介绍下该方法如何生成点云。论文模拟生成点云的方式分为3个步骤:

下面我们详细分析下这3个步骤。

1.扫描真实场景

先通过激光雷达扫描真实的街道,一般需要多次采集(5次),这样能够保证采集到的点云足够稠密。采集完点云之后,需要把动态物体去掉,这里采用了PointNet 模型来去掉动态物体(包括静止的动态物体),然后把去掉的点云根据周围的环境填充。

激光雷达发射教程(如何真实的模拟激光雷达)(2)

采集点云效果图

2.动态物体添加

动态物体包括行人、车辆等,这里通过统计学的方法,根据物体出现的常见程度出现的概率也不一样,然后在静态场景中添加动态物体,动态物体主要是一些模型,甚至包括三轮车、婴儿车等。

激光雷达发射教程(如何真实的模拟激光雷达)(3)

动态模型

这里还提到了模型的姿态对结果的影响也很大,随机放置模型的效果和采用增强概率图方式的效果差距还是很大,下面是动态物体放置方法差异的结果图。

激光雷达发射教程(如何真实的模拟激光雷达)(4)

模型放置方法效果对比

3.合成生成模拟点云

通过上面2个步骤,我们得到了真实环境的点云地图,同时还得到了动态物体模型和出现的概率模型。那么如何根据这些生成点云呢?

这里的思路是通过之前扫描好的点云通过"surface splatting"方法进行渲染,动态物体模型通过传统方法渲染,渲染到一个立方体上。

激光雷达发射教程(如何真实的模拟激光雷达)(5)

点云和动态物体渲染到立方体

因为论文中没有详细介绍这一步的流程,所以这里我简单说下自己的想法,先把之前扫描得到的点云通过"surface splatting"方法通过点云建立好平面,然后通过平面投影到立方体上生成深度信息。动态物体模型因为可以直接获取点和Mesh,因此可以直接渲染,之后就得到了类似全景的深度图信息。最后再根据激光雷达的位置和当前的深度图相交,得到距离信息。实际上这里会建立3种立体图:深度图、普通图、材质图。

这里对雷达的建模也比仿真器中考虑的要素要多,通过如下的公式建模。

激光雷达发射教程(如何真实的模拟激光雷达)(6)

其中Eemit代表激光雷达的能量强度,Rrel代表物体表面的反射率,Ria表示激光照射角度对反射的影响比例,Ratm表示空气对激光的衰减。

同时激光雷达建模还考虑到了角度噪音和距离测量噪音,实际上激光雷达的光束会有角度偏差噪音,并且测量距离也有一定的噪音,论文中对距离增加了0.5cm的噪音,对激光角度增加了0.05度的噪音。得到激光雷达噪音的方法也很简单,把激光雷达固定在一个位置一段时间,然后采集数据,最后通过统计这些数据的误差,得到上述角度噪音和距离测量噪音。

数据评判

得到了数据之后,论文采用了如下的方法还评判生成数据的效果。采用KITTI数据集的数据作为标准数据(KITTI是采集的真实数据集),然后把这部分数据分为2部分,一部分做为训练集,一部分作为验证集。

  1. 通过CARLA仿真器生成的数据训练模型,然后拿KITTI的验证数据集进行验证。
  2. 通过论文中的方法生成数据然后训练模型,拿KITTI的验证数据集进行验证。
  3. 通过KITTI的训练集训练模型,拿KITTI的验证数据集验证。
  4. 通过CARLA仿真器生成的数据和KITTI的数据混合训练,拿KITTI的验证数据集验证。
  5. 通过论文中的方法生成数据和KITTI的数据混合训练,拿KITTI的验证数据集验证。

下图是上述方式训练的效果。

激光雷达发射教程(如何真实的模拟激光雷达)(7)

不同数据训练效果

可以看到单纯通过仿真器训练出的数据效果比较差,很多数据只有真实数据一半的效果,最差的效果不到1/4。通过论文中的方法效果基本和真实数据相当,通过混合的效果超过了在真实数据集上的效果。

那么既然混合训练的效果最好,那么真实数据和模拟数据的占比是多少呢?下面给出了数据占比的效果图。

激光雷达发射教程(如何真实的模拟激光雷达)(8)

通过上述的数据可以看出,只需要100k的模拟数据,16K的真实数据基本就达到了真实100k数据的精度,可以节省84%的真实数据标注。

最后我们总结下上述方法,上述方法只需要对需要仿真的场景进行点云采集,然后通过框架生成对应的点云数据,可以平滑迁移。另外检测真实数据上,论文中也测试了在新的场景中使用得到了比较好的效果,看起来是可行的。

对上述的方法也存在一些疑问,通过点云生成深度图的方式是否可以重复利用,是不是每次都要重新生成深度图,还是类似游戏模型,生成一次之后后面一直可以使用。另外论文生成深度图的方法和游戏中生成的模型的方式其实比较类似,只是对激光雷达的建模比较准确,并且增加了噪音,实际上的原理非常相似。

,