一. 背景介绍
在智能驾驶领域, 根据使用的传感器的不同,对障碍物的检测和识别通常有三种做法:
1.一种是基于相机图像和点云鸟瞰图的纯图像障碍物检测, 比如YOLO三维;
2.一种是将相机和雷达进行联合标定, 使用相机图像,利用基于深度学习的物体检测网络识别图像中物体,将相机得到的检测目标投射到3维的点云空间,融合图像检测和点云聚类实现目标检测和分类;
3.另一种是,直接利用激光雷达的点云,进行点云分割和聚类(也有利用基于点云的神经网络), 识别出路面和障碍物;
本例实现包括本文及前面两篇博文,通过第3种方式实现智能驾驶的障碍物检测.
接前两篇(十九,二十)博文分别完成了: 视觉与点云图像在3D空间视觉融合,基于YOLO v5的物体检测. 本文将介绍基于两者的输出,完成在3D空间的视觉场景构建及物体检测(障碍物).
博文十九构建的是一个除了空间距离之外没有语义信息的3D场景, 博文二十则在相机的成像像素平面坐标系构建了具有语义信息的二维图像. 下一步的目标是把二维空间检测到的物体信息(标签,边框,得分)通过坐标映射,映射到3D场景, 并利用落在该物体上的点云,经聚类操作计算尽可能准确的物体(障碍物)轮廓, 最终以长方体的形式投射到3D场景.
二.准备工作
详见前两篇博文:
十九.在ROS系统基于深度相机点云和视觉图像数据融合构建3D空间彩色点云
二十. 在ROS系统上实现基于PyTorch YOLO v5的实时物体检测
三.主要思路和步骤
按照惯例, 准备工作做完, 先从整体上了解实现我们的目标还需要哪些更细节的步骤, 先想清楚再动手做. 承接前两篇博文这里给出一张流程图:
如图中粉色方框:
1. 统计2维图像上每个物体检测边框内落入的点云点;
2. 对每个物体检测边框内落入的点云点,做点云聚类和去除离散点,即去除非物体的背景点云点;
这一步尝试过使用语义分割网络: FCN或DeepLab直接对物体检测边框区域图像做语义分割,这样物体(障碍物)轮廓计算更精准, 结果是使用语义分割网络计算开销太大,在现有计算资源上无法实现实时计算, 最后放弃,仍采用对点云点做欧几里德聚类计算的方法.
3. 根据落在每个物体上的所有点云点,计算物体的最大轮廓形成长方体坐标;
4. 发布各检测物体的立体轮廓,即ROS系统消息visualization_msgs::MarkerArray到相机3维坐标系空间, 和 博文十九的彩色3D场景,功能组成自动驾驶的实时3D视觉场景.
四.实现效果
实时物体检测,并将检测到的物体投射到相机坐标系的3D场景中. 因为我设置投射的Cube为半透明的,所以可以有透视效果.