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.pswp.cn/web/10942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10942.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

函數原型(Function Prototype)、函數定義(Function Definition)和函數聲明(Function Declaration)

函數原型(Function Prototype)、函數定義(Function Definition)和函數聲明(Function Declaration)在C和C等編程語言中扮演著不同的角色,但它們有時在概念上可能會有些重疊。下面是它們之間的主要…

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 <…

收集郵票C++題目【概率期望DP+數學推導】

題意 Description 有 n n n 種不同的郵票&#xff0c;皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那里購買&#xff0c;每次只能買一張&#xff0c;并且 買到的郵票究竟是 n n n 種郵票中的哪一種是等概率的&#xff0c;概率均為 1 n \frac{1}{n} n1?。但是由…

【elasticsearch】慢查詢替代查詢審計的嘗試

【elasticsearch】慢查詢替代查詢審計的嘗試 使用了es有兩年了&#xff0c;突然發現一個&#xff0c;es沒有查詢審計日志&#xff0c;某個用戶查詢了某個索引的審計。 找了官方文檔和社區的回復都是說使用slow log替代慢查詢。 嘗試一下。 參考鏈接1&#xff1a;https://discus…

Py深度學習基礎|關于Batch Normalization

1. 為什么需要Batch Normalization 通常我們會在輸入層進行數據的標準化處理&#xff0c;這是為了讓模型學習到更好的特征。同樣&#xff0c;在模型的中間層我們也可以進行normalize。在神經網絡中, 數據分布對訓練會產生影響。 比如我們使用tanh作為激活函數&#xff0c;當輸入…

Baidu Comate智能編碼助手:AI編程時代提升效率的好幫手

目錄 寫在前面一、如何安裝二、如何使用場景需求體驗步驟 三、AI 編程實戰指令功能插件功能知識庫功能 四、問題建議五、體驗總結&#x1f680;寫在最后 寫在前面 Baidu Comate 是基于文心大模型的 AI編程工具&#xff0c;它結合百度積累多年的編程現場大數據和外部優秀開源數據…

MySQL中的多表查詢

數據庫設計范式(范例) 好的數據庫設計&#xff0c;事倍功半&#xff0c;不會有歧義 第一范式&#xff1a;列保證原子性&#xff08;列不可再分解&#xff09; 聯系方式&#xff1a;電話&#xff0c;微信&#xff0c;QQ&#xff0c;郵箱 這些都不可分解 第二范式&#xff1a;要…

annaconda詳細解讀換源文件

annaconda換源詳細解讀文件 annaconda換源詳細解讀文件 annaconda換源詳細解讀文件 #踩坑/annaconda換源詳細解讀通道問題 如何準確使用國內源高效安裝GPU版本的Pytorch - 知乎 文件中的custom通道&#xff0c;需要自己手動添加到默認通道里面&#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;從而具備較大的吞吐量和高并…

SpringBoot:注解詳解

RequestMapping 注解在類上:表示該類中所有響應請求的方法都以此地址為父路徑 value&#xff08;path&#xff09; 指定請求的實際訪問地址&#xff0c;默認RequestMapping(“url”)的值url即為value的值。指定的地址可以是 URI Template 模式。 method 指定請求的method類型…

數據結構(四)——二叉樹和堆(下)

制作不易&#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…

在ubuntu安裝Docker容器

1、進入root用戶模式 sudo -i 回車后&#xff0c;輸入root的密碼即可進入root模式2、在ubuntu上安裝docker &#xff08;1&#xff09;直接使用 apt 安裝&#xff0c;一般這樣也自動啟動好了 apt install docker.io3、驗證安裝成功&#xff0c;以及啟動與校驗 &#xff08;…

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;任務&…