日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

SLAM闭合回环————视觉词典BOW小结

發(fā)布時間:2023/11/27 生活经验 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SLAM闭合回环————视觉词典BOW小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在目前實際的視覺SLAM中,閉環(huán)檢測多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag?of?words?又運用了數據挖掘的K-means聚類算法,筆者只通過bag?of?words?模型用在圖像處理中進行形象講解,并沒有涉及太多對SLAM的閉環(huán)檢測的應用。

PART ONE 1.Bag-of-words模型簡介

Bag-of-words模型是信息檢索領域常用的文檔表示方法。在信息檢索中,BOW模型假定對于一個文檔,忽略它的單詞順序和語法、句法等要素,將其僅僅看作是若干個詞匯的集合,文檔中每個單詞的出現都是獨立的,不依賴于其它單詞是否出現。?也就是說,文檔中任意一個位置出現的任何單詞,都不受該文檔語意影響而獨立選擇的。舉個例子就好理解:

例如有如下兩個文檔:

1:Bob?likes?to?play?basketball,?Jim?likes?too.

2:Bob?also?likes?to?play?football?games.

基于這兩個文本文檔,構造一個詞典:

Dictionary?=?{1:”Bob”,?2.?“l(fā)ikes”,?3.?“to”,?4.?“play”,?5.?“basketball”,?6.?“also”,?7.?“football”,?8.?“games”,?9.?“Jim”,?10.?“too”}。

這個詞典一共包含10個不同的單詞,利用詞典的索引號,上面兩個文檔每一個都可以用一個10維向量表示(用整數數字0~n(n為正整數)表示某個單詞在文檔中出現的次數):

1:[1,?2,?1,?1,?1,?0,?0,?0,?1,?1]

2:[1,?1,?1,?1?,0,?1,?1,?1,?0,?0]

向量中每個元素表示詞典中相關元素在文檔中出現的次數。不過,在構造文檔向量的過程中可以看到,我們并沒有表達單詞在原來句子中出現的次序。

Bag-of-words模型應用于圖像表示:

為了表示一幅圖像,我們可以將圖像看作文檔,即若干個“視覺詞匯”的集合,同樣的,視覺詞匯相互之間沒有順序。

?

視覺詞典的生成流程:

于圖像中的詞匯不像文本文檔中的那樣是現成的,我們需要首先從圖像中提取出相互獨立的視覺詞匯,這通常需要經過三個步驟:(1)特征檢測,(2)特征表示,(3)單詞本的生成。??下圖是從圖像中提取出相互獨立的視覺詞匯:

?

過觀察會發(fā)現,同一類目標的不同實例之間雖然存在差異,但我們仍然可以找到它們之間的一些共同的地方,比如說人臉,雖然說不同人的臉差別比較大,但眼睛, 嘴,鼻子等一些比較細小的部位,卻觀察不到太大差別,我們可以把這些不同實例之間共同的部位提取出來,作為識別這一類目標的視覺詞匯。

構建BOW碼本步驟:

利用K-Means算法構造單詞表。用K-means對第二步中提取的N個SIFT特征進行聚類,K-Means算法是一種基于樣本間相似性度量的間接聚類方法,此算法以K為參數,把N個對象分為K個簇,以使簇內具有較高的相似度,而簇間相似度較低。聚類中心有k個(在BOW模型中聚類中心我們稱它們?yōu)橐曈X詞),碼本的長度也就為k,計算每一幅圖像的每一個SIFT特征到這k個視覺詞的距離,并將其映射到距離最近的視覺詞中(即將該視覺詞的對應詞頻+1)。完成這一步后,每一幅圖像就變成了一個與視覺詞序列相對應的詞頻矢量。

假定我們將K設為4,那么單詞表的構造過程如下圖所示:

?

第三步:

利用單詞表的中詞匯表示圖像。利用SIFT算法,可以從每幅圖像中提取很多個特征點,這些特征點都可以用單詞表中的單詞近似代替,通過統(tǒng)計單詞表中每個單詞在圖像中出現的次數,可以將圖像表示成為一個K=4維數值向量。將這些特征映射到為碼本矢量,碼本矢量歸一化,最后計算其與訓練碼本的距離,對應最近距離的訓練圖像認為與測試圖像匹配。請看下圖:

?

我們從人臉、自行車和吉他三個目標類圖像中提取出的不同視覺詞匯,而構造的詞匯表中,會把詞義相近的視覺詞匯合并為同一類,經過合并,詞匯表中只包含了四個視覺單詞,分別按索引值標記為1,2,3,4。通過觀察可以看到,它們分別屬于自行車、人臉、吉他、人臉類。統(tǒng)計這些詞匯在不同目標類中出現的次數可以得到每幅圖像的直方圖表示:

人臉:??[3,30,3,20]
自行車:[20,3,3,2]
吉他:??[8,12,32,7]

其實這個過程非常簡單,就是針對人臉、自行車和吉他這三個文檔,抽取出相似的部分(或者詞義相近的視覺詞匯合并為同一類),構造一個詞典,詞典中包含4個視覺單詞,即Dictionary?=?{1:”自行車”,?2.?“人臉”,?3.?“吉他”,?4.?“人臉類”},最終人臉、自行車和吉他這三個文檔皆可以用一個4維向量表示,最后根據三個文檔相應部分出現的次數畫成了上面對應的直方圖。一般情況下,K的取值在幾百到上千,在這里取K=4僅僅是為了方便說明。

總結一下步驟:

第一步:利用SIFT算法從不同類別的圖像中提取視覺詞匯向量,這些向量代表的是圖像中局部不變的特征點;

第二步:將所有特征點向量集合到一塊,利用K-Means算法合并詞義相近的視覺詞匯,構造一個包含K個詞匯的單詞表;

第三步:統(tǒng)計單詞表中每個單詞在圖像中出現的次數,從而將圖像表示成為一個K維數值向量。

具體的,假設有5類圖像,每一類中有10幅圖像,這樣首先對每一幅圖像劃分成patch(可以是剛性分割也可以是像SIFT基于關鍵點檢測的),這樣,每一個圖像就由很多個patch表示,每一個patch用一個特征向量來表示,咱就假設用Sift表示的,一幅圖像可能會有成百上千個patch,每一個patch特征向量的維數128。

?

接下來就要進行構建Bag of words模型了,假設Dictionary詞典的Size為100,即有100個詞。那么咱們可以用K-means算法對所有的patch進行聚類,k=100,我們知道,等k-means收斂時,我們也得到了每一個cluster最后的質心,那么這100個質心(維數128)就是詞典里德100個詞了,詞典構建完畢。

詞典構建完了怎么用呢?是這樣的,先初始化一個100個bin的初始值為0的直方圖h。每一幅圖像不是有很多patch么?我們就再次計算這些patch和和每一個質心的距離,看看每一個patch離哪一個質心最近,那么直方圖h中相對應的bin就加1,然后計算完這幅圖像所有的patches之后,就得到了一個bin=100的直方圖,然后進行歸一化,用這個100維德向量來表示這幅圖像。對所有圖像計算完成之后,就可以進行分類聚類訓練預測之類的了。

圖像的特征用到了Dense Sift,通過Bag of Words詞袋模型進行描述,當然一般來說是用訓練集的來構建詞典,因為我們還沒有測試集呢。雖然測試集是你拿來測試的,但是實際應用中誰知道測試的圖片是啥,所以構建BoW詞典我這里也只用訓練集。

用BoW描述完圖像之后,指的是將訓練集以及測試集的圖像都用BoW模型描述了,就可以用SVM訓練分類模型進行分類了。

在這里除了用SVM的RBF核,還自己定義了一種核:?histogram intersection kernel,直方圖正交核。因為很多論文說這個核好,并且實驗結果很顯然。能從理論上證明一下么?通過自定義核也可以了解怎么使用自定義核來用SVM進行分類。

?

PART ?THREE 2.詞袋模型在slam中的應用?

DBoW3庫介紹

????????DBoW3是DBoW2的增強版,這是一個開源的C++庫,用于給圖像特征排序,并將圖像轉化成視覺詞袋表示。它采用層級樹狀結構將相近的圖像特征在物理存儲上聚集在一起,創(chuàng)建一個視覺詞典。DBoW3還生成一個圖像數據庫,帶有順序索引和逆序索引,可以使圖像特征的檢索和對比非常快。

? ? ? ? DBoW3與DBoW2的主要差別:

????????1、DBoW3依賴項只有OpenCV,DBoW2依賴項DLIB被移除;

????????2、DBoW3可以直接使用二值和浮點特征描述子,不需要再為這些特征描述子重寫新類;

????????3、DBoW3可以在Linux和Windows下編譯;

????????4、為了優(yōu)化執(zhí)行速度,重寫了部分代碼(特征的操作都寫入類DescManip);DBoW3的接口也被簡化了;

????????5、可以使用二進制視覺詞典文件;二進制文件在加載和保存上比.yml文件快4-5倍;而且,二進制文件還能被壓縮;

????????6、仍然和DBoW2yml文件兼容。

?

????????DBoW3有兩個主要的類:Vocabulary和Database。視覺詞典將圖像轉化成視覺詞袋向量,圖像數據庫對圖像進行索引。

????????ORB-SLAM2中的ORBVocabulary保存在文件orbvoc.dbow3中,二進制文件在Github上:https://github.com/raulmur/ORB_SLAM2/tree/master/Vocabulary

二、K-Means聚類的效率優(yōu)化

影響效率的一個方面是構建詞典時的K-means聚類,我在用的時候遇到了兩個問題:

1、內存溢出。這是由于一般的K-means函數的輸入是待聚類的完整的矩陣,在這里就是所有patches的特征向量f合成的一個大矩陣,由于這個矩陣太大,內存不頂了。我內存為4G。

2、效率低。因為需要計算每一個patch和每一個質心的歐拉距離,還有比較大小,那么要是循環(huán)下來這個效率是很低的。

為了解決這個問題,我采用一下策略,不使用整一個數據矩陣X作為輸入的k-means,而是自己寫循環(huán),每次處理一幅圖像的所有patches,對于效率的問題,因為matlab強大的矩陣處理能力,可以有效避免耗時費力的自己編寫的循環(huán)迭代。

三、代碼

代碼下載鏈接:PG_BOW_DEMO.zip

Demo中的圖像是我自己研究中用到的一些Action的圖像,我都采集的簡單的一共6類,每一類60幅,40訓練20測試。請注意圖像的版權問題,自己研究即可,不能商用。分類器用的是libsvm,最好自己mex重新編譯一下。

如果libsvm版本不合適或者沒有編譯成適合你的平臺的,會報錯,例如:

Classification using BOW rbf_svm
??? Error using ==> svmtrain at 172
Group must be a vector.

下面是默認的demo結果:

Classification using BOW rbf_svm
Accuracy = 75.8333% (91/120) (classification)

Classification using histogram intersection kernel svm
Accuracy = 82.5% (99/120) (classification)

Classification using Pyramid BOW rbf_svm
Accuracy = 82.5% (99/120) (classification)

Classification using Pyramid BOW histogram intersection kernel svm
Accuracy = 90% (108/120) (classification)

當然結果這個樣子是因為我已經把6類圖像提前弄成一樣大了,而且每一類都截取了最關鍵的子圖,不太符合實際,但是為了demo方便,當然圖像大小可以是任意的。

下圖就是最好結果的混淆矩陣,最好結果就是Pyramid BoW+hik-SVM:

?

圖6 分類混淆矩陣

這是在另一個數據集上的結果(7類分類問題):

Classification using BOW rbf_svm
Accuracy = 34.5714% (242/700) (classification)

Classification using histogram intersection kernel svm
Accuracy = 36% (252/700) (classification)

Classification using Pyramid BOW rbf_svm
Accuracy = 43.7143% (306/700) (classification)

Classification using Pyramid BOW histogram intersection kernel svm
Accuracy = 55.8571% (391/700) (classification)

PART TWO ? ?一、單目視覺SLAM

1.環(huán)境特征

? ? 分類:自然特征和人工特征;

??????必要性:移動SLAM機器人必須通過實時檢測周圍環(huán)境特征來對自身進行一個定位。

2.面臨問題:

既包括路標位姿的估計,也包括機器人位姿與軌跡的優(yōu)化。(在很多實際應用中,環(huán)境地圖和移動機器人的位置都是未知的,且定位和地圖構建二者相互依賴、互為耦合,使得問題求解非常復雜。)

3.解決方案

目前主要有兩種解決方案:基于濾波器的方法和基于圖的方法。

(2) 基于圖的SLAM(Graph-basedSLAM)

?

算法致力于尋找一個最大可能的節(jié)點結構,得到一個最優(yōu)位姿地圖(近年來隨著高效求解方法的出現,基于圖的SLAM?方法重新得到重視,成為當前?SLAM研究的一個熱點)

二、自然特征提取及視覺詞典創(chuàng)建

2.1自然路標

優(yōu)點:不改變工作環(huán)境,不需要額外設施和額外信息,并且在環(huán)境中大量存在;

缺點:受環(huán)境的影響較大,易受光線、遮擋、視角及環(huán)境相似度等變化的影響

2.2視覺詞典

視覺詞典是圖像分類檢索等領域的圖像建模方法,該方法源于文檔分析領域中的詞典表示,詞典表示將文檔描述為詞典中關鍵詞出現頻率的向量

2.3自然特征視覺詞典創(chuàng)建框架

2.4具體實施

(1)用SURF(SpeededUp Robust Features)算子提取圖像的自然局部視覺特征向量;(優(yōu)點:保存了圖像原有的色彩,而且改進了SIFT?算法計算數據量大、時間復雜度高、算法耗時長等缺點,可以用?64維向量建立特征點描述符,進一步提高了快速性和準確性)

(2)把相似的SURF?自然視覺特征向量劃分為相同的自然視覺單詞(采用?K-means算法對局部視覺特征集合進行聚類,一個聚類中心即為一個視覺單詞);

(3)自然視覺詞典的每一自然視覺單詞采用GMM(GaussianMixture Model)方法進行建模自然視覺單詞的概率模型,通過概率模型建立了更為精確的局部自然視覺特征與自然視覺單詞間的匹配

?

2.5實例

包括:室內走廊和室外視覺詞典

三、視覺詞典的人工路標模型創(chuàng)建


四、閉環(huán)檢測

? ? ?目前視覺 SLAM 閉環(huán)檢測領域大部分算法都是首先準確建立基于圖像外觀的場景模型,然后基于場景外觀進行閉環(huán)檢測

???? BoVW(Bagof visual words)算法步驟:

???? ①用SIFT或SURF算子提取圖像的局部特征,每個局部特征用相同維數的特征向量表示;

???? ②將檢測到的局部特征集合進行聚類,每個聚類中心對應一個視覺單詞;

???? ③構建表征圖像的視覺詞典,動態(tài)調整視覺單詞數量以評估視覺詞典的大小;

???? ④圖像由視覺詞典中的視覺單詞權重向量表征。

BoVW(Bag of Visual Words)算法將一副圖像類比為一篇文檔

? ??①SLAM采集圖像具有時間連續(xù)性,利用時間連續(xù)性提升檢測的準確性。

???? ②圖像匹配的相似度計算方法與視覺?SLAM?的時間連續(xù)特征,利用貝葉斯濾波融合當前觀測量(也即當前圖像匹配的相似度)和前一時刻的檢測信息計算當前時刻閉環(huán)檢測的概率,由此設計一種基于貝葉斯濾波的閉環(huán)檢測跟蹤算法;

?

4.1基于人工視覺詞典的閉合檢測算法:

?

4.2基于貝葉斯濾波閉環(huán)檢測算法:

相似度

圖像內存管理

五、混合人工自然特征的單目視SLAM

5.1算法整體框架

六、發(fā)展方向

借助Wifi或者偽衛(wèi)星信號;三維場景地圖實時性構建;機器人陌生環(huán)境內學習(模擬人類學習過程)以及高效內存管理模式;

設定室內路標的規(guī)范;POS系統(tǒng)微型化;

?

引用博客來自:

[1]https://blog.csdn.net/u011326478/article/details/52463556?locationNum=4&fps=1

[2]http://www.cnblogs.com/zjiaxing/p/5548265.html

[3]https://blog.csdn.net/chapmancp/article/details/80179765

個人學習使用,如有疑問,請聯系博主驚醒修正

總結

以上是生活随笔為你收集整理的SLAM闭合回环————视觉词典BOW小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。