参考
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 功能包分区算法,覆盖算法调试,本地运行测试
Morphological Segmentation 形态分割算法
形态分割的主要亮点是算法简单和计算速度快。
-
该算法在栅格地图 上工作,栅格分为可访问和不可访问两种类型,白色区域代表可访问性,黑色区域表示不可访问性。如图 fig.1 左上角图片。
-
对地图 可访问区域(白色区域)进行形态学腐蚀操作,该操作是通过一个像素一圈一圈地重复腐蚀一定次数(用户设定的参数)。之后得到一些连通区域和分离区域。如图 fig.1 右上角图片。
-
在步骤 2 中,注意一定要一个像素一圈一圈地腐蚀。每次腐蚀后判断每个分离区域的面积,若分离区域大小在合适范围内(用户设定的区域大小上下限内),那么标记该分离区域的所有栅格为房间 。地图 是地图 的拷贝。把分离出来的房间 在地图 中并标记上不同颜色,并且把 中房间 区域标记为不可访问区域。如图 fig.1 左下角图片是标记了房间的 。
-
重复“腐蚀-分离”操作,就能够得到一系列分离的房间并标记在地图 中。然后扩散每个房间,直到地图 中的可访问区域被标记完。如图 fig.1 右下角。
Distance Transform-based Segmentation 距离变换分割
-
将栅格地图用距离变换计算,距离变换值高说明离障碍物远,距离变换值低说明离障碍物近。栅格数值表示每个可访问像素(白色)到最近的边界像素(黑色)的距离。如图 fig.2 左上角(看起来像 Voronoi 变换)。
-
距离变换的局部最大值始终位于空间中心。在狭窄的走廊或门处,局部最大值比大房间内的最大值小。通过设置适当的阈值就可以区分出房间的中心。这里滤波的阈值需要用户根据实际场景设置。如图 fig.2 右上角。
-
从高到低地遍历距离变换值阈值 t,从距离变换地图中能够分类出一组分离的空间集合 C。随着遍历的进行,该集合 C 的数量会增加,说明找到了更多的离散空间。当阈值等于门处的局部最大距离变换值时候,两个离散空间会连通起来,空间集合 C 数量会减少。距离变换分割算法要找到一个阈值 t*,使得检索到的空间集合 C 最大。如图 fig.2 左下角。
其实就是将栅格地图用距离变换转换栅格存储的数据,再用分水岭算法得到离散空间,也就是房间。
-
给找到的离散空间标记上,并扩散这些空间,直到所有可访问像素都标记上。
距离变换分割与形态分割有一些相似之处,因此某些地图的分割结果非常相似。计算复杂度与形态分割相当。
分水岭算法 3D 可视化
下面 3D 图形通过 py 节点接收 costmap2d 地图话题,再用 plotly 库显示。
地图话题中,栅格数据表示与障碍物的接近程度,越接近障碍物数值越大,这也是一种距离变换。
栅格数值 100 表示障碍物,-1 表示未知区域,这里把 -1 转为 100 显示。
把地图栅格数据作为 z 轴,得到 costmap2d 的 3d 图形表示,如图 fig.2.1 显示:
按照步骤 2,需要找到一个阈值来筛选出初始的房间中心,这里选择的阈值 t 是 51。图 fig.2.3 中图形 z 轴上的白色轮廓线就是初步筛选出来的房间中心。当 z 轴等于 51 时候,能够得到 8 个初始房间,即 8 个白色轮廓。
按照步骤 3 需要从高到低调整阈值 t,但根据我们这边 costmap2d 的距离变换,是从低到高调整阈值 t。接下来“水位上涨”,阈值 t 从 51 开始上升,地图右下角和左侧出现了新的白色轮廓。当阈值 t 达到 62 时候,房间数量达到最大的 10 个。此后阈值继续上升,当阈值 t 等于 66 时候,左侧中间的轮廓与左上角轮廓和中间对角轮廓连通,导致地图房间数量开始减少,“水位溢出”。如图 fig.2.4 显示。
阈值 65 就是步骤 3 要找的目标阈值 t*。此时房间,也就是空间集合 C 数目最大,达到 10 个。如图 fig.2.5。
Voronoi Graph-based Segmentation Voronoi 图分割
基于 Voronoi 图的分割采用更复杂的启发式实现最后的合并步骤,这些启发式方法偏向于分割完整的房间。
-
计算广义 Voronoi 图,并通过将叶边缘折叠到其原点的节点中来修剪主骨架。如图 fig.3 左上角。
-
在 Voronoi 图上,如果某个 Voronoi 点恰好有两个最近障碍物像素(就是说该 Voronoi 点的最近两个障碍物像素点距离相等(这里必须是两个,因为后面要计算夹角!)。那么这个 Voronoi 点就有可能是两个房间之间的关键点。将这些关键点存储在集合 P 中。如图 fig.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 图分割算法的原论文才有更详细的描述。 -
论文用以下启发式方法将 Voronoi 单元合并到类似房间的结构中:
-
单元面积小于阈值 (例如 12.5 平方米) ,且只有一个相邻单元,且该单元 75% 的边界不接触墙体。那么该单元就会与其相邻单元合并。
-
单元面积小于阈值 (例如 2 平方米) ,若其相邻单元有至少 20% 的边界接触墙体,该小单元合并进相邻单元。
-
合并以下区域(这个操作目的是连接同一房间内的两个部分):
合并当前单元及其相邻单元 ni。
-
相邻的单元 ni 最多只有 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).
-
-
合并共享大部分边界的区域。例如小单元和大单元相邻,其中小单元至少 20%的边界与大单元接触,这部分边界又至少占大单元边界 10% 。
-
一个单元超过 40% 的边界接触相邻单元 nm,合并该单元与相邻单元 nm。(用于合并有离散障碍物的区域)。
-
应用所有合并规则后得到分割图。如图 fig.3 右下角。
!!!注意!!!
如果步骤 2 中,Voronoi 图上的点总是有多个(3或4个)最近障碍物点,那么步骤 3 中计算关键夹角就无法进行。需要增加策略过滤掉一些关键线,才能计算夹角。
GVD 分割单元
下面画图大概表述下步骤 3 的流程:
图 fig.3.1 一个简单的示例场景地图。黑色是墙体。
图 fig.3.2 通过计算得到地图的广义 voronoi 图,用绿色标记 。这里我只是画了大概的 GVD。
图 fig.3.3 中红色点是有 2 处最近障碍物点的关键点,紫色是有 3 处最近障碍物点的 GVD 点,是要丢弃的!
图 fig.3.4 用关键点连接最近障碍物得到关键线,标记为蓝色像素。关键线与墙体围成封闭区,红线表示封闭区。
图 fig.3.5 通过关键点密度及其围成的封闭区是否嵌套来过滤掉部分关键线。黄色点是最后剩下的关键线数据点。它们与墙体围成了 voronoi 单元。
Feature-based Segmentation 特征/语义分割
-
在地图的每个可访问像素位置放置一个模拟的 360° 激光扫描仪,通过扫描一圈地图,得到相应位置的基本特征数据。如图 fig.4 左边。
-
这些基本特征数据可以计算出一组 33 个简单的几何特征,例如光线长度差或平均光线长度等。再用 AdaBoost 分类器将特征向量分类出房间标签,例如办公室或走廊。最后,合并具有相同标签的所有相邻点。为了获得良好的分区结果,需要用足够量的代表性数据来训练分类器。不同环境可能需要重新训练对应的分类器。
看起来分割效果不好我就不研究了。
Voronoi Random Fields Segmentation Voronoi 随机势场分割
ipa 源码中新增的分割算法,并不在《Room Segmentation: Survey, Implementation, and Analysis. 》论文中。源码还未实现完该算法,执行会陷入循环。
分割效果对比
-
分区回收率 recall 和精度 precision 对比
回收率定义:实际房间和分区重叠面积 / 实际房间面积。
精度定义:分区房间与实际房间的最大重叠面积 / 分区房间的面积。
第一行是不带家具测试,第二行是带家具测试。
第二列形态分割;第三列距离变换分割;第四列 Voronoi 图分割;第五列特征分割;
-
分区效果
前三行是不带家具,后三行带家具。
第一列人工分区,第二列形态分割,第三列距离变换分割,第四列 Voronoi 图分割,第五列特征分割。