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 功能包分区算法,覆盖算法调试,本地运行测试

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 分割效果对比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/691964.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

体验GM CHM Reader Pro,享受高效阅读

还在为CHM文档的阅读而烦恼吗?试试GM CHM Reader Pro for Mac吧!它拥有强大的功能和出色的性能,能够让你轻松打开和阅读CHM文件,享受高效、舒适的阅读体验。无论是学习、工作还是娱乐,GM CHM Reader Pro都能成为你的得…

Lab4: traps

RISC-V assembly Which registers contain arguments to functions? For example, which register holds 13 in mains call to printf? 根据RISC-V函数调用规范,函数的前8个参数使用a0-a7寄存器传递。 当main函数调用printf函数时,a2寄存器保存13 …

力扣:48. 旋转图像(Java)

目录 题目描述:输入:输出:代码实现: 题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使…

在Excel中转置行和列的几种方法,总有一种适合你

序言 如果你开始以垂直排列(列)的方式输入数据,然后决定以水平排列(行)的方式更好,Excel将为你提供帮助。我们将研究在Excel中转换数据的三种方法。 静态方法 在这种方法中,你可以快速轻松地将数据从列转换到行(反之亦然),但它有一个关键的缺点:它不是动态的。例…

iZotope RX 11 for Mac 激活版:让您的音频焕发生机!

在追求音频完美的道路上,iZotope RX 11 for Mac是您的得力助手。它凭借先进的音频修复技术和丰富的音频增强工具,让您的音频作品焕发出前所未有的生机与活力。无论您是专业的音频工程师,还是业余的音乐爱好者,都能在这款工具中找到…

Python从0到POC编写-魔法方法

name __name__ 是系统定义的内部函数, 它的作用是识别模块。 通常我们看到这样一句话: if __name__ __main____name__ 的值有两种情况,那么挨个来说下。 如果模块是被直接执行的 ,那么 __name__ 的值 为 __main__ 例如&…

247 基于matlab的梁的振型仿真

基于matlab的梁的振型仿真。利用有限元理论,求二维梁的固有频率和振型。短边固定,给定长度、横截面积,弹性模量及材料密度已知。并对比理论计算结果进行分析。各参数自己设定。程序已调通,可直接运行。 247 梁的振型仿真 固有频率…

【初级数据结构】队列

目录 前言队列的概念及结构队列的实现队列的结构队列的初始化队列的销毁入队出队取队头元素取队尾元素判断队列是否为空取出队列中元素个数代码测试 完整代码Queue.hQueue.ctest.c 前言 前面我们已经学习了栈,栈是一种后进先出的结构,即LIFO,…

GPT 大型语言模型可视化教程

网址: LLM Visualization 简介 欢迎来到 GPT 大型语言模型演练!在这里,我们将探索只有 85,000 个参数的 nano-gpt 模型。 它的目标很简单:取一个由六个字母组成的序列: C B A B B C 并按字母顺序排列,即…

【Qt-CMake】QT中cmak编译出现CMake Error: The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的,编写代码时发现无论怎样修改代码,运行后都没有任何变化,以为是qtbug,重构重启都没用,最后…

报表控件Stimulsoft指南:在 JavaScript 报告工具中使用节点计划

我们最近发布了一篇关于使用Quartz.NET 库自动执行报告任务的文章。继续这个主题,今天我们将深入探讨我们的报告如何与 Node Schedule 作业调度程序集成。 Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.5讲 GPIO中断实验-通用中断驱动编写

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…