ipa 分区算法分析,图解

参考

Room Segmentation: Survey, Implementation, and Analysis. 分区算法调查,实现以及评估对比

相关论文

  • 分区算法

New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形态分割

Interactive SLAM using Laser and Advanced Sonar 距离变换分割,论文仅提了一句用分水岭算法来分区

The Image Processing Handbook 图像处理手册,其中有分水岭分割算法

Learning metric-topological maps for indoor mobile robot navigation Voronoi 图分割

Semantic Labeling of Places using Information Extracted from Laser and Vision Sensor Data 特征/语义分割算法

Voronoi Random Fields: Extracting the Topological Structure of Indoor Environments via Place LabelingVoronoi 随机势场分割

相关文章

ipa 功能包分区算法,覆盖算法调试,本地运行测试

ipa 覆盖算法分析(一)

ipa 覆盖算法分析(二)​​​​​​​

Morphological Segmentation 形态分割算法

形态分割的主要亮点是算法简单和计算速度快。

  1. 该算法在栅格地图 M_1上工作,栅格分为可访问和不可访问两种类型,白色区域代表可访问性,黑色区域表示不可访问性。如图 fig.1 左上角图片。

  2. 对地图 M_1 可访问区域(白色区域)进行形态学腐蚀操作,该操作是通过一个像素一圈一圈地重复腐蚀一定次数(用户设定的参数)。之后得到一些连通区域和分离区域。如图 fig.1 右上角图片。

  3. 在步骤 2 中,注意一定要一个像素一圈一圈地腐蚀。每次腐蚀后判断每个分离区域的面积,若分离区域大小在合适范围内(用户设定的区域大小上下限内),那么标记该分离区域的所有栅格为房间 r_i。地图 M_2 是地图 M_1 的拷贝。把分离出来的房间 r_i 在地图 M_2 中并标记上不同颜色,并且把 M_1 中房间 r_i 区域标记为不可访问区域。如图 fig.1 左下角图片是标记了房间的 M_2

  4. 重复“腐蚀-分离”操作,就能够得到一系列分离的房间并标记在地图 M_2 中。然后扩散每个房间,直到地图 M_2 中的可访问区域被标记完。如图 fig.1 右下角。

fig.1 形态分割算法

Distance Transform-based Segmentation 距离变换分割

  1. 将栅格地图用距离变换计算,距离变换值高说明离障碍物远,距离变换值低说明离障碍物近。栅格数值表示每个可访问像素(白色)到最近的边界像素(黑色)的距离。如图 fig.2 左上角(看起来像 Voronoi 变换)。

  2. 距离变换的局部最大值始终位于空间中心。在狭窄的走廊或门处,局部最大值比大房间内的最大值小。通过设置适当的阈值就可以区分出房间的中心。这里滤波的阈值需要用户根据实际场景设置。如图 fig.2 右上角。

  3. 从高到低地遍历距离变换值阈值 t,从距离变换地图中能够分类出一组分离的空间集合 C。随着遍历的进行,该集合 C 的数量会增加,说明找到了更多的离散空间。当阈值等于门处的局部最大距离变换值时候,两个离散空间会连通起来,空间集合 C 数量会减少。距离变换分割算法要找到一个阈值 t*,使得检索到的空间集合 C 最大。如图 fig.2 左下角。

    其实就是将栅格地图用距离变换转换栅格存储的数据,再用分水岭算法得到离散空间,也就是房间。

  4. 给找到的离散空间标记上,并扩散这些空间,直到所有可访问像素都标记上。

    距离变换分割与形态分割有一些相似之处,因此某些地图的分割结果非常相似。计算复杂度与形态分割相当。

fig.2 距离变换分割算法

分水岭算法 3D 可视化

下面 3D 图形通过 py 节点接收 costmap2d 地图话题,再用 plotly 库显示。

地图话题中,栅格数据表示与障碍物的接近程度,越接近障碍物数值越大,这也是一种距离变换。

栅格数值 100 表示障碍物,-1 表示未知区域,这里把 -1 转为 100 显示。

把地图栅格数据作为 z 轴,得到 costmap2d 的 3d 图形表示,如图 fig.2.1 显示:

fig.2.1 costmap2d 地图的三维显示
fig.2.2 costmap2d 地图

按照步骤 2,需要找到一个阈值来筛选出初始的房间中心,这里选择的阈值 t 是 51。图 fig.2.3 中图形 z 轴上的白色轮廓线就是初步筛选出来的房间中心。当 z 轴等于 51 时候,能够得到 8 个初始房间,即 8 个白色轮廓。

fig.2.3 分水岭初步分房

按照步骤 3 需要从高到低调整阈值 t,但根据我们这边 costmap2d 的距离变换,是从低到高调整阈值 t。接下来“水位上涨”,阈值 t 从 51 开始上升,地图右下角和左侧出现了新的白色轮廓。当阈值 t 达到 62 时候,房间数量达到最大的 10 个。此后阈值继续上升,当阈值 t 等于 66 时候,左侧中间的轮廓与左上角轮廓和中间对角轮廓连通,导致地图房间数量开始减少,“水位溢出”。如图 fig.2.4 显示。

fig.2.4 分水岭水位上涨

阈值 65 就是步骤 3 要找的目标阈值 t*。此时房间,也就是空间集合 C 数目最大,达到 10 个。如图 fig.2.5。

fig.2.5 分水岭得到最大空间集合 C

Voronoi Graph-based Segmentation Voronoi 图分割

基于 Voronoi 图的分割采用更复杂的启发式实现最后的合并步骤,这些启发式方法偏向于分割完整的房间。

  1. 计算广义 Voronoi 图,并通过将叶边缘折叠到其原点的节点中来修剪主骨架。如图 fig.3 左上角。

  2. 在 Voronoi 图上,如果某个 Voronoi 点恰好有两个最近障碍物像素(就是说该 Voronoi 点的最近两个障碍物像素点距离相等(这里必须是两个,因为后面要计算夹角!)。那么这个 Voronoi 点就有可能是两个房间之间的关键点。将这些关键点存储在集合 P 中。如图 fig.3 右上角。

  3. 绘制关键线:将集合 P 中的关键点与其最近障碍物点连接起来。关键线与墙体围成多个封闭区域,其中可能会存在紧密嵌套的封闭区,需要过滤掉多余封闭区,只保留外圈。封闭区的关键点处的夹角,姑且称为关键夹角。在角落中的关键夹角往往会比较小(小于 90°),可以移除掉。大角度的关键夹角经常出现在门口或通道处。经过关键线划分后得到的封闭区,把它称为 Voronoi 单元。尽管有过滤操作,仍会有一些零散的小单元。如图 fig.3 左下角。

    这里紧密嵌套的 Voronoi 单元过滤是比较关键的,论文只是一句话带过:

    The angle between both line segments is important if there are too many critical lines within an area. 
    这部分的处理应该要看 Voronoi 图分割算法的原论文才有更详细的描述。      

  4. 论文用以下启发式方法将 Voronoi 单元合并到类似房间的结构中:

    1. 单元面积小于阈值 (例如 12.5 平方米) ,且只有一个相邻单元,且该单元 75% 的边界不接触墙体。那么该单元就会与其相邻单元合并。

    2. 单元面积小于阈值 (例如 2 平方米) ,若其相邻单元有至少 20% 的边界接触墙体,该小单元合并进相邻单元。

    3. 合并以下区域(这个操作目的是连接同一房间内的两个部分):

      合并当前单元及其相邻单元 ni。

      1. 相邻的单元 ni 最多只有 2 个相邻单元。

      2. 当前这个单元的边界至少 50% 接触墙壁。

        这里感觉有点歧义,丢个原文吧:
        3) Merge regions with (i) exactly one neighbor that has maximal 2 neighbors and with (ii) at least 50% of the perimeter touching walls (this connects two parts inside the same room).
    4. 合并共享大部分边界的区域。例如小单元和大单元相邻,其中小单元至少 20%的边界与大单元接触,这部分边界又至少占大单元边界 10% 。

    5. 一个单元超过 40% 的边界接触相邻单元 nm,合并该单元与相邻单元 nm。(用于合并有离散障碍物的区域)。

应用所有合并规则后得到分割图。如图 fig.3 右下角。

!!!注意!!!

如果步骤 2 中,Voronoi 图上的点总是有多个(3或4个)最近障碍物点,那么步骤 3 中计算关键夹角就无法进行。需要增加策略过滤掉一些关键线,才能计算夹角。

fig.3 Voronoi 图分割算法

GVD 分割单元

下面画图大概表述下步骤 3 的流程:

图 fig.3.1 一个简单的示例场景地图。黑色是墙体。

fig.3.1 简单场景,黑色墙体

图 fig.3.2 通过计算得到地图的广义 voronoi 图,用绿色标记 。这里我只是画了大概的 GVD。

fig.3.2 绿色是 GVD

图 fig.3.3 中红色点是有 2 处最近障碍物点的关键点,紫色是有 3 处最近障碍物点的 GVD 点,是要丢弃的!

fig.3.3 红色是关键点

图 fig.3.4 用关键点连接最近障碍物得到关键线,标记为蓝色像素。关键线与墙体围成封闭区,红线表示封闭区。

fig.3.4 蓝色是关键线

图 fig.3.5 通过关键点密度及其围成的封闭区是否嵌套来过滤掉部分关键线。黄色点是最后剩下的关键线数据点。它们与墙体围成了 voronoi 单元。

fig.3.5 黄色是过滤后的关键线数据点

Feature-based Segmentation 特征/语义分割

  1. 在地图的每个可访问像素位置放置一个模拟的 360° 激光扫描仪,通过扫描一圈地图,得到相应位置的基本特征数据。如图 fig.4 左边。

  2. 这些基本特征数据可以计算出一组 33 个简单的几何特征,例如光线长度差或平均光线长度等。再用 AdaBoost 分类器将特征向量分类出房间标签,例如办公室或走廊。最后,合并具有相同标签的所有相邻点。为了获得良好的分区结果,需要用足够量的代表性数据来训练分类器。不同环境可能需要重新训练对应的分类器。

fig.4 特征/语义分割算法

看起来分割效果不好我就不研究了。

Voronoi Random Fields Segmentation Voronoi 随机势场分割

ipa 源码中新增的分割算法,并不在《Room Segmentation: Survey, Implementation, and Analysis. 》论文中。源码还未实现完该算法,执行会陷入循环。

fig.5 Voronoi 随机势场分割算法

分割效果对比

  • 分区回收率 recall 和精度 precision 对比

回收率定义:实际房间和分区重叠面积 / 实际房间面积。

精度定义:分区房间与实际房间的最大重叠面积 / 分区房间的面积。

第一行是不带家具测试,第二行是带家具测试。

第二列形态分割;第三列距离变换分割;第四列 Voronoi 图分割;第五列特征分割;

fig.6 分割效率对比

  • 分区效果

前三行是不带家具,后三行带家具。

第一列人工分区,第二列形态分割,第三列距离变换分割,第四列 Voronoi 图分割,第五列特征分割。

fig.7 分割效果对比

  • 33
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值