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.mzph.cn/web/10942.shtml

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

相关文章

NOR FLASH介绍

参考 http://t.csdnimg.cn/gHcrG 一、NOR FLASH简介 XIP技术:https://blog.csdn.net/ffdia/article/details/87437872?fromshareblogdetail NOR Flash 和 NAND Flash 的特点和应用举例: NOR Flash: 特点: 支持随机访问,可以直接…

QT作业4

1、思维导图 2、使用定时器完成闹钟 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QTextEdit> #include <QDebug> #include <…

Py深度学习基础|关于Batch Normalization

1. 为什么需要Batch Normalization 通常我们会在输入层进行数据的标准化处理&#xff0c;这是为了让模型学习到更好的特征。同样&#xff0c;在模型的中间层我们也可以进行normalize。在神经网络中, 数据分布对训练会产生影响。 比如我们使用tanh作为激活函数&#xff0c;当输入…

Baidu Comate智能编码助手:AI编程时代提升效率的好帮手

目录 写在前面一、如何安装二、如何使用场景需求体验步骤 三、AI 编程实战指令功能插件功能知识库功能 四、问题建议五、体验总结&#x1f680;写在最后 写在前面 Baidu Comate 是基于文心大模型的 AI编程工具&#xff0c;它结合百度积累多年的编程现场大数据和外部优秀开源数据…

在xAnyLabeling中加载自己训练的yolov8s-obb模型进行半自动化标注

任务思路&#xff1a; 先使用xAnyLabeling标注一部分样本&#xff0c;训练出v1版本的yolov8-obb模型&#xff0c;然后加载yolov8-obb模型到xAnyLabeling中对其余样本进行半自动化标注。节省工作量。 任务流程&#xff1a; 1.准备xAnyLabeling标注工具 下载代码&#xff0c;…

Redis系列-3 Redis缓存问题

1.缓存的作用 数据库(如Mysql)的持久化特点带来了较低的性能&#xff0c;高并发的场景下&#xff0c;连接池很快被耗尽而出现宕机或DOS&#xff0c;无法继续对外提供服务。相对于数据库的硬盘IO&#xff0c;缓存中间件基于内存进行读写&#xff0c;从而具备较大的吞吐量和高并…

数据结构(四)——二叉树和堆(下)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、二叉树链式结构的实现总结 前言 这篇博客我们将来了解普通二叉树的实现和应用&#xff0c;对大家之前分治和递归的理解有所挑战。 一、二叉树链式结构的实现 1.前置说明 在学习二叉…

Java入门——继承和多态(上)

包 包是组织类的一种方式. 使用包的主要目的是保证类的唯一性. 例如, 你在代码中写了一个 Test 类. 然后你的舍友也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致 代码不能编译通过. 导入包中的类 Java 中已经提供了很多现成的类供我们使用. 例如 public cla…

服装店会员管理系统结合小程序商城帮你挖掘出潜在客户

在现代社会&#xff0c;随着科技的不断进步和人们消费习惯的变化&#xff0c;传统的服装店已经不再能够满足消费者的需求。为了更好地服务客户&#xff0c;提升销售业绩&#xff0c;许多服装店开始引入会员管理系统&#xff0c;并结合小程序商城&#xff0c;实现线上线下的无缝…

LeetCode-2079. 给植物浇水【数组 模拟】

LeetCode-2079. 给植物浇水【数组 模拟】 题目描述&#xff1a;解题思路一&#xff1a;简单的模拟题&#xff0c;初始化为0&#xff0c;考虑先不浇灌每一个植物解题思路二&#xff1a;初始化为n&#xff0c;考虑每一个植物需要浇灌解题思路三&#xff1a;0 题目描述&#xff1a…

C++11:常用语法汇总

目录 &#x1f341;统一的列表初始化 { }initializer_list &#x1f341;decltype 推导表达式类型&#x1f341;可变参数模板解析可变参数包方法一方法二 &#x1f341;lambda 表达式捕捉列表的使用运用场景举例lambda表达式 与 函数对象 &#x1f341;统一的列表初始化 { } 在…

STM32F407-驱动SHT41采集温湿度

STM32F407-驱动SHT41采集温湿度 SHT41 SHT41通过I2C方式进行驱动 从机地址&#xff1a; 0x44 获取数据方式 1&#xff09;先发送I2C写&#xff0c;写入特定指令 2&#xff09;延时一段时间&#xff0c;等待SHT41处理 3&#xff09;再进行I2C读&#xff0c;读数据即可 一些…

Ansible(二)

一、Playbook基础 1.1 Playbook定义 Playbook其实是Ansible服务的一个配置文件&#xff0c;Ansible使用Playbook的YAML语言配置编写成操作需求&#xff0c;实现对远端主机或策略部署&#xff0c;实现对远端主机的控制与管理。 1.2 Playbook组成 Tasks&#xff1a;任务&…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章编号&#x…

渗透测试-信息收集

网络安全信息收集是网络安全领域中至关重要的一环&#xff0c;它涉及到对目标系统、网络或应用进行全面而细致的信息搜集和分析。这一过程不仅有助于理解目标网络的结构、配置和潜在的安全风险&#xff0c;还能为后续的渗透测试、风险评估和安全加固提供有力的支持。 在网络安…

安卓开发--新建工程,新建虚拟手机,按键事件响应(含:Android中使用switch-case遇到case R.id.xxx报错)

安卓开发--新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应 1.前言2.运行一个工程2.1布局一个Button2.2 button一般点击事件2.2 button属性点击事件2.2 button推荐点击事件&#xff08;含&#xff1a;Android中使用switch-case遇到case R.id.xxx报错&#xff09; 本…

MATLAB 多项式

MATLAB 多项式 MATLAB将多项式表示为行向量&#xff0c;其中包含按幂次降序排列的系数。例如&#xff0c;方程P(x) X 4 7 3 - 5 9可以表示为 p [1 7 0 -5 9]; 求值多项式 polyval函数用于求一个特定值的多项式。例如&#xff0c;在 x 4 时&#xff0c;计算我们之前的多项式…

命令重装Linux系统,无需登录控制面板

命令重装Linux系统&#xff0c;无需登录控制面板 部分无法登录控制面板使用这个脚本 自动安装安装脚本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安装命令参考 # 自动安装 Debian 10 buster …

基于YOLOV8复杂场景下船舶目标检测系统

1. 背景 海洋作为地球上70%的表面积&#xff0c;承载着人类生活、经济发展和生态系统的重要功能。船舶作为海洋活动的主要载体之一&#xff0c;在海上运输、资源开发、环境监测等方面发挥着重要作用。复杂海洋环境下的船舶目标检测成为了海事管理、海洋资源开发和环境保护等领…

人工智能轨道交通行业周刊-第79期(2024.4.22-5.12)

本期关键词&#xff1a;无人机巡检、车机联控、减速顶、Agent、GraphRAG、RAGFlow 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…