赞
踩
DipG-Seg采用基于像素的图像方法,将点云投影到两个图像面,经过投影图像生成,图像预分割、图像精细分割、标签投票等步骤,完成对于地面的分割。验证后其分割效果优于patchwork++等传统算法,16线激光雷达可以达到200hz的速度。
代码可以由单模态激光雷达数据扩展到多模态点云数据,地面分割效果理想。
代码仓库: https://github.com/EEPT-LAB/DipG-Seg
论文连接: https://ieeexplore.ieee.org/abstract/document/10359455
DipG-Seg主要分为图像生成、预分割、分层精细分割、地面标签投票等4个主要步骤,激光传感器默认为水平向前安装。
图像生成过程中,主要将激光点云数据投影到d-image(点在Oxy平面上与传感器之间的距离)和z-image(点距离地面的高度距离z轴正方向向上)上,并对投影后的图像进行一级图像修复和二级图像修复操作。
其中R和C代表行和列的投影角向量,d_sensor 代表当前点距离传感器的距离,r和c代表像素的列索引和行索引,z_sensor代表激光传感器的固定安装高度,D和Z代表d-image和z-image图像。(
x
i
x_i
xi ,
y
i
y_i
yi,
z
i
z_i
zi )表示激光点云中第i个点的坐标。
当多个点投影到同一个像素上时,后面的投影点将被忽略,但是它们在点云中的索引将被保存起来用于后续的标签投票操作。
投影后的图像D和Z如下两图所示:
可以发现,image-z图像上越靠近图像下部分像素越小,符合理论分析。
PS:经过上述步骤生成的d-image和z-image由于部分点缺失(吸光材质导致该点消失)、传感器变化(64线激光雷达换成16线) 导致部分像素的值未进行赋值,依然为初始值,但是图像处理过程中这些值会造成图像对应数据的不连续性(由上图中的列方向上的不连续关系可以发现),影响边缘等计算结果,进而影响地面分割的准确性。
一级图像修复主要分为3部分,分别为图像顶行(a)、图像中间行(b)、图像底行(c)。当顶行数据缺失时,若其下邻居行存在数据,则将下邻居行数据复制给它;当底行数据缺失时,若其上邻居行存在数据,则将上邻居行数据复制给它;当中间行数据缺失时,若上下邻居行均存在有效数据,则将其均值复制给它。
一级图像修复后的d-image和z-image数据如下所示:
PS:可以发现很多情况下,如果设置的参数(图像的分辨率、宽高大小、角度分辨率)存在偏差,一级修复无法完成对于上述两个图像的修复,修复效果微乎其微,因此需要进一步进行二级图像修复步骤。(完全可以跳过一级修复,直接进行二级修复,减少计算量)
二级图像修复过程中会遍历当前像素的同列上step行数据(prev)和下step行数据(next),遍历过程中若prev和next代表的像素值偏差在阈值范围内,则记录下当前的两个数据;待完成整个上邻域和下邻域的邻居点遍历后,当前像素的值设为邻域内值的平均值,否则的话依然设置为无效数据。
二级图像修复后的d-image和z-image数据如下所示:
PS: 经过二级图像修复后,大量无效像素数据被设置为有效值,完成了整个图像生成步骤。
在设置完成后,还对高程z-image进行了3*3范围内的均值滤波,将当前像素替换为邻域内的相邻像素平均值,效果如下:
上述操作后,梯度变化较大的部分得到了一定平滑作用,防止出现高程敏感问题。
完成图像生成步骤后,需要对修复后的图像进行预分割。预分割阶段是基于Edge图(边缘图)、slope图(斜坡图、斜面图)、HSV图(Horizontal Slope Variation 水平斜率变化图)、STDZ图(z方向标准差图)实现的。因此该步骤需要首先生成edge图、slope图、HSV图和STDZ图;然后根据这些图像进行预分割。
根据公式: 方差 = 平方的均值 - 均值的平方
以33的矩形像素作为邻域,计算邻域中的像素平方均值和均值的平方,再进行开方操作,得到最终的STDZ图像。记录了每个像素在33邻域中的高程标准差信息。其效果如下:
PS:可以观察到z-image中的下半部分黑色像素较多,也就是标准差较小,高度大多位于等高范围内,这也符合理论认知。世界中的障碍物数据高程标准差变化明显,但是地面数据的高程标准差基本不变。
edge图中像素表示该像素是否属于边缘像素,若属于边缘像素,则z图像的水平相邻像素变化较大,而非边缘像素的相邻像素变化较小。其实该图像所反映的物体意义即,沿着传感器y坐标系方向,找出高度变化较大的部分数据,该部分数据必然是边缘数据,如果是正常地面数据,那么同一高度情况下沿传感器y轴的像素值不会发生较大的变动。
edge图像效果如下所示:
PS:可以观察到,edge图像中属于边缘的部分被全部反映出来,这一部分反映了边缘数据信息。
slope图存放的是坡度斜率像素。通过z方向上的高度梯度 / xy平面上的距离梯度,得到当前像素的局部梯度。当然再计算z-image和d-image中对应的局部梯度差时,如果仅仅取相邻两行同列的元素求解,那么如果出现误差,必然会出现异常值。因此,作者通过一个补偿向量进行分析,该补偿向量本质上是通过隔行选点计算他们的局部梯度,这样通过长距离的邻接点求解,缓解了局部偏差造成的异常问题。
上述过程的理论公式如上图所示,其中 Ccpt对应的补偿向量中隔行选点时的行数,越接近传感器的中心,该数据越小,月靠近边缘,所存储的数据就越大。
生成出的效果图如下:
PS:可以观察到,在大部分坡度斜率较大的像素出现在边缘及临界区域中。
如上图所示,当连续的水平扫描角对应于三个斜率角α1,α2和 α3,其中 α1和 α2等于平面 S 的斜率角,而 α2和 α3不相同,意味着平面的不连续性,通过这一特征来表示平面的平坦度。在slope图像的基础上,通过计算slope图像同一行中两个连续像素之间的斜率差,很容易得到 HSV 图像。
生成效果图如下:
PS: 当沿传感器y轴方向上的倾斜角度变化角度时,该区域对应的像素更大。
当上述4个像素图生成完成后,对slope图和HSV图像进行3*3局部邻域均值操作,可以缓解局部范围内的传感器观测误差造成的坡度和水平斜率变化问题,这种均值操作,如果真的遇到障碍物数据,那像素值虽然会被降低,但依然明显高于观测数据产生的数据变化。
预分割生成possibility图像,possibility图像中,非地面像素置为1,地面像素置为0。
由下向上,由左向右逐元素遍历各个像素,获取各元素对应的edge图、slope图、HSV图和STDZ图像素值,首先对高程方向的沿传感器y轴方向的高度偏差进行判断,若该偏差满足阈值(说明该像素可能属于地面像素,此时若满足斜坡梯度下限或者y方向斜坡角度偏差下限或者最低高程阈值下限中的一个则属于地面像素,若都不满足则说明该像素为非地面像素);若偏差不满足阈值(并且不满足斜坡梯度上限或者y方向斜坡角度偏差上限或者最低高程阈值上限中的一个则属于非地面像素)。
也就是所谓的利用低阈值从非边缘像素中寻找地面像素,利用高阈值从边缘像素中重新确认非地面像素。
效果如下:
PS:完成预分割后则初步完成了地面像素分割。因为仅通过这些操作会出现很多个过分割问题,大量的障碍物点被分为了地面像素(FP),部分离散的非地面像素也没有和邻居像素进行比较,也容易产生地面像素归为非地面像素(FN)的可能。
因此需要进一步向下,引入精细分割过程。
尽管预分割生成了HC可能性图像,但是HC地面和非地面像素不能直接看作真正的TP和TN。但是有些像素根据上述特征无法区分开。不能完全消除处理步骤之前的噪声像素。
为了减少HC图中被错误划分为地面像素的非地面像素,将图像进行闭操作,比较3*3邻域中的像素数据,由于白色部分代表的为非地面像素,黑色部分代表地面像素。闭操作执行之后,先膨胀再腐蚀,这样原先离散的黑色像素就被融入进白色像素中,这样一定程度上减少了离散地面像素的个数,降低FP的比例。
闭操作后的效果如下:
PS: 可以观察到,很多离散黑色像素被被去除掉,根据地面连续性的假设,当前像素分类符合。即使进行闭操作之后的HC图像也是存在大量的离散地面像素信息的,也就是FP比例降低,但仍然存在,且对于原先的FN比例也不能做到抑制,需要进一步处理。
所谓的多数票核心卷积,就是比较3*3邻域内的9个像素,对9个像素进行投票。当邻域内的像素均为1(全为非地面像素,参数设置)时,才将其归类为非地面像素(non_ground_pixel)。其非地面像素效果如下:
PS: 经过上述操作之后,非地面个数减少,FN的比例得到一定抑制,并且此时所对应的非地面像素必然正确。
同时,邻域内的9个像素中,当存在至少存在7(参数设置)个为非地面像素时,则认为该像素可能为非地面像素(ground_pixel)。其可视化效果如下:
PS: 这种做法无疑是构建当前像素与3*3邻域之间的分类关系,为了消除部分离散的非地面像素数据,排除异常值的影响,对其进行形态学开操作,效果如下:
PS: 可以观察到,部分的离散非地面像素被去除。
对HC可能性图以及MVK卷积之后的掩码进行叠加判断,得到最后的可能性结果:
possibility = (possibility & ground_pixel) | non_ground_pixel
其处理效果如下:
PS: 处理的可能性标签掩码的物理意义:如果初始HC图判断当前像素属于非地面像素并且邻域范围内至少存在7个像素也属于非地面像素,那么它才真正为非地面像素;如果初始HC图判断当前像素属于地面点,但是邻域范围内的邻居满足非地面点的个数阈值,那么该点也被判定为非地面像素。
经过上述过程已经可以大致区判定出地面像素和非地面像素标签。但是根据现实世界的地面连续性假设,上图所示的黑色离散像素属于错误标签,造成分类错误的原因主要由于先前的所有判断条件仅是针对局部邻域中的数据处理,其感受野仅维持在3*3的邻域范围内,但是未进行全局考量,因此地面标签投票步骤就显得尤为重要。
地面标签投票本质上为一种启发式的生长算法,由图像底行元素选取地面像素生长点,将所有连接的地面像素的像素(上下左右4个像素)进行扩展,直到地面像素不再连通。这样处理后,地面和非地面像素之间就存在明显的边界关系,不存在越界行为。
PS: 由上图观察到,白色部分代表地面像素标签,黑色部分代表非地面像素标签,与处理后的HC图进行对比,发现离散的地面像素标签全被剔除掉,剩下的均为连通地面标签数据。
整篇论文的思路清晰,代码实现完整,后续会加入自己一些多传感器数据的处理以及cuda加速方法的实现,相比先前的patchwork系列算法,处理效果相对较好,几乎没有FN数据出现。
本人水平有限,若存在错误,请各位指正!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。