点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
文章导读
采用传统的点云处理算法做障碍物检测有一个重要的环节就是地面分割,本文介绍各种常用的地面分割方法,并通过实际测试分析其场景的不适应性,最后推荐几种开源的分割算法供大家尝试。
1
为什么要做地面分割
采用激光雷达做低层次感知的障碍物检测任务,考虑硬件性能,开发周期,数据成本等问题,可以采样传统的点云处理算法进行障碍物的分割、拟合、跟踪。在这个过程中使用聚类算法进行障碍物分割,而聚类算法依据点之间的欧式距离来度量属性,因此地面点会对位于地面上物体点集造成干扰。
深度学习的方法往往不需要预先分割出地面是因为无论将点云转换成何种方式输入,卷积都会以滑窗的方式遍历到每一块局部区域提取特征,然后做分类回归。
2
有哪些地面分割的方法
地面分割算法通常可以分为:
平面栅格法
点云法向量
模型拟合法
面元网格法
平面栅格法
栅格法通常是根据设定好的尺寸建立平面网格(也可以做多层网格或者三维体素),然后将原始点云投影到各自的网格中,对每个网格中的点集提取特征,比如:平均高度、最大高度、高度差、密度等等。
具体方法:
设置网格尺寸生成栅格图;
根据点的x,y坐标投影到对应的栅格中;
统计每个栅格中的点集高度特征;
用统计量与设定的阈值比较进行分类;
投影后的栅格图类似于鸟瞰图,如下所示:
存在问题:
当激光雷达线束比较少的时候,比如下图用的16线激光雷达采集的道路数据,车辆前方20米以外的地面上,能够打到的激光点已经比较少了,而且打到障碍物上的激光线束一般也只有一条,如果在栅格中采用高度特征进行地面过滤,遇到低矮的障碍物很容易会被当成地面点过滤掉。
点云法向量
点的法线估计是需要其邻域点的做支持,邻域的大小一般由邻域半径值或临近点个数来表示。过大的邻域会抹平三维结构细节使得法向量过于粗糙,而过小的邻域由于包含了太少的点受噪声干扰程度较强。
用法向量进行地面分割是考虑到地面点的法向量一般为竖直方向,通过设置角度阈值,求每个点的法向量与地面法向量的夹角,与阈值对比进行分类。
考虑到人行道,车顶等道路上很多物体都存在法向量为(0,0,1)或(0,0,-1)的区域,所以通常会把点云法向量作为特征与其他方法结合过滤地面点集。
引入法向量能够解决什么场景呢?
在栅格法中,我们一般会利用高度信息对点集进行分类,但是往往地面高度和路两边的人行道高度差距只在30cm左右,如果没有先验信息提取出道路ROI区域的话,使用高度阈值划分道路,路沿,障碍物可能存在误差,但是引入点云法向量,可以较好的提取出道路两旁法向量突变的点集构成路沿,从而配合栅格化将道路区域,非道路区域,障碍物进行划分。如下图所示:
模型拟合法
常用的模型拟合方法包括以下几种:
平面拟合-RANSAC
高斯过程-GP-INSAC
平面参数拟合(特征值)
以RANSAC平面拟合的方法为例,具体流程如下:
在设置的迭代次数内,每次随机选取3个点确定一个平面方程(Ax+By+Cz+D=0);
将所有点依次带入该平面方程中,根据设定的距离阈值做判定,若在阈值范围内,则认为属于该平面的内点,否则为外点,遍历所有点后统计内点个数;
在迭代次数内内点数量最多的平面方程即为地面方程,该地面方程下的内点就是地面点云集,外点就是障碍物点云集;
在理想的路面采用基于模型类的方法分割地面,效果尚可,如下图所示:
存在问题:
1. 交通道路从排水考虑通常是中间凸起,两边低洼,类似于拱桥形状,虽然曲率不大,但是通过随机采样一致性算法计算地平面,可能会得到倾斜于一侧的平面作为地面方程;
2. 在上下坡的时候同样因为地面非绝对平面,计算出的地面方程,会出现把前方地面点集作为障碍物点的情况;
3. 由于RANSAC是在点云空间随机的取三个点构建平面,如果场景中存在大块墙面时,会出现将墙面作为地面方程的情况;
面元网格法
基于面元的分割可以分为局部类型或者表面类型,常采用区域增长的方式进行地面分割。其核心是基于点法线之间角度的比较,将满足平滑约束的相邻点合并在一起,以一簇点集的形式输出,每簇点集被认为是属于相同平面。
区域增长的具体流程如下:
选择种子点:在当前点集A中选择有最小曲率的点加入种子点集;
区域增长:寻找种子点的邻域点,对于位于A中且与种子点的法向量夹角小于阈值的邻域点,将其加入当前区域中,如果其曲率小于阈值则也加入种子点集;
对于每个种子点重复上一步操作,最终输出一组类,每个类的点都认为是同一平滑表面的一部分;
采用面元区域增长的方法在一定程序上能够较好的应对地面存在曲率的情况。对于比较平缓的曲面或者平面能够达到较好的分割效果,但是实际道路中的噪声点太多,直接使用区域增长分割地面,会出现较多零星的地面点被当成障碍物点集。
而且区域增长算法的时耗较大,时间复杂度和面积成正比,对于实时性要求较高的感知算法模块,需要进一步优化。比如将平面的区域增长降为到边缘,或者划分区域,在小范围呢进行分割等等。
3
如何分割带坡度的地面
道路坡度问题在传统点云分割算法中一直是个难点。考虑到一个平面方程无法应对现实中的道路,研究者往往会采用分而治之的思想,对区域进行划分,然后在小范围中拟合直线或平面;或者利用激光雷达扫描线之间的角度信息作为先验知识,利用不同线速打到地面上的间隔距离或者角度进行判别,一定程度上弱化了高度信息的敏感性。
近些年也有不少较鲁棒的地面分割算法实测效果良好,思想大多是基于分段的方式。下面推荐几种小编认为不错的方法:
a. 《Fast segmentation of 3d point clouds for ground vehicles》通过对点云(x,y,z)三维空间进行降维到(d,z)的二维栅格中,同时采取不同的划分扇区点云策略划分网格segments和bin,通过局部拟合直线来判断是否为地面点。
b. 《Fast segmentation of 3D point clouds: A paradigm on LiDAR data for autonomous vehicle applications》首先提取地面种子候选点集,再划分segments的基础上进行SVD分解求取法向量平面参数,最后迭代求取最佳法向量。
c. 《Efficient Online Segmentation for Sparse 3D Laser Scans》首先将点云数据转换成深度图像,图像中的行数由垂直方向上的光束的数量定义,列数由激光每360度旋转得到的距离值;用距离值求取连接两点的倾斜角度,最终与约束条件比较判断地面点集。
最终在工程模块中,任何单一算法都不足以覆盖很多场景,通常建议采用多个算法的结合来判断当前点的类型,并且考虑落地嵌入式的性能约束,针对算法中可以分块的部分可以尝试并行运算做加速。下图是一张分割去除地面的效果图:
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python+OpenCV视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:Pytorch常用函数手册
在「小白学视觉」公众号后台回复:pytorch常用函数手册,即可下载含有200余个Pytorch常用函数的使用方式,帮助快速入门深度学习。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~