SLAM闭合回环————视觉词典BOW小结
在目前實(shí)際的視覺SLAM中,閉環(huán)檢測多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag?of?words?又運(yùn)用了數(shù)據(jù)挖掘的K-means聚類算法,筆者只通過bag?of?words?模型用在圖像處理中進(jìn)行形象講解,并沒有涉及太多對(duì)SLAM的閉環(huán)檢測的應(yīng)用。
PART ONE 1.Bag-of-words模型簡介
Bag-of-words模型是信息檢索領(lǐng)域常用的文檔表示方法。在信息檢索中,BOW模型假定對(duì)于一個(gè)文檔,忽略它的單詞順序和語法、句法等要素,將其僅僅看作是若干個(gè)詞匯的集合,文檔中每個(gè)單詞的出現(xiàn)都是獨(dú)立的,不依賴于其它單詞是否出現(xiàn)。?也就是說,文檔中任意一個(gè)位置出現(xiàn)的任何單詞,都不受該文檔語意影響而獨(dú)立選擇的。舉個(gè)例子就好理解:
例如有如下兩個(gè)文檔:
1:Bob?likes?to?play?basketball,?Jim?likes?too.
2:Bob?also?likes?to?play?football?games.
基于這兩個(gè)文本文檔,構(gòu)造一個(gè)詞典:
Dictionary?=?{1:”Bob”,?2.?“l(fā)ikes”,?3.?“to”,?4.?“play”,?5.?“basketball”,?6.?“also”,?7.?“football”,?8.?“games”,?9.?“Jim”,?10.?“too”}。
這個(gè)詞典一共包含10個(gè)不同的單詞,利用詞典的索引號(hào),上面兩個(gè)文檔每一個(gè)都可以用一個(gè)10維向量表示(用整數(shù)數(shù)字0~n(n為正整數(shù))表示某個(gè)單詞在文檔中出現(xiàn)的次數(shù)):
1:[1,?2,?1,?1,?1,?0,?0,?0,?1,?1]
2:[1,?1,?1,?1?,0,?1,?1,?1,?0,?0]
向量中每個(gè)元素表示詞典中相關(guān)元素在文檔中出現(xiàn)的次數(shù)。不過,在構(gòu)造文檔向量的過程中可以看到,我們并沒有表達(dá)單詞在原來句子中出現(xiàn)的次序。
Bag-of-words模型應(yīng)用于圖像表示:
為了表示一幅圖像,我們可以將圖像看作文檔,即若干個(gè)“視覺詞匯”的集合,同樣的,視覺詞匯相互之間沒有順序。
?
視覺詞典的生成流程:
于圖像中的詞匯不像文本文檔中的那樣是現(xiàn)成的,我們需要首先從圖像中提取出相互獨(dú)立的視覺詞匯,這通常需要經(jīng)過三個(gè)步驟:(1)特征檢測,(2)特征表示,(3)單詞本的生成。??下圖是從圖像中提取出相互獨(dú)立的視覺詞匯:
?
過觀察會(huì)發(fā)現(xiàn),同一類目標(biāo)的不同實(shí)例之間雖然存在差異,但我們?nèi)匀豢梢哉业剿鼈冎g的一些共同的地方,比如說人臉,雖然說不同人的臉差別比較大,但眼睛, 嘴,鼻子等一些比較細(xì)小的部位,卻觀察不到太大差別,我們可以把這些不同實(shí)例之間共同的部位提取出來,作為識(shí)別這一類目標(biāo)的視覺詞匯。
構(gòu)建BOW碼本步驟:
利用K-Means算法構(gòu)造單詞表。用K-means對(duì)第二步中提取的N個(gè)SIFT特征進(jìn)行聚類,K-Means算法是一種基于樣本間相似性度量的間接聚類方法,此算法以K為參數(shù),把N個(gè)對(duì)象分為K個(gè)簇,以使簇內(nèi)具有較高的相似度,而簇間相似度較低。聚類中心有k個(gè)(在BOW模型中聚類中心我們稱它們?yōu)橐曈X詞),碼本的長度也就為k,計(jì)算每一幅圖像的每一個(gè)SIFT特征到這k個(gè)視覺詞的距離,并將其映射到距離最近的視覺詞中(即將該視覺詞的對(duì)應(yīng)詞頻+1)。完成這一步后,每一幅圖像就變成了一個(gè)與視覺詞序列相對(duì)應(yīng)的詞頻矢量。
假定我們將K設(shè)為4,那么單詞表的構(gòu)造過程如下圖所示:
?
第三步:
利用單詞表的中詞匯表示圖像。利用SIFT算法,可以從每幅圖像中提取很多個(gè)特征點(diǎn),這些特征點(diǎn)都可以用單詞表中的單詞近似代替,通過統(tǒng)計(jì)單詞表中每個(gè)單詞在圖像中出現(xiàn)的次數(shù),可以將圖像表示成為一個(gè)K=4維數(shù)值向量。將這些特征映射到為碼本矢量,碼本矢量歸一化,最后計(jì)算其與訓(xùn)練碼本的距離,對(duì)應(yīng)最近距離的訓(xùn)練圖像認(rèn)為與測試圖像匹配。請(qǐng)看下圖:
?
我們從人臉、自行車和吉他三個(gè)目標(biāo)類圖像中提取出的不同視覺詞匯,而構(gòu)造的詞匯表中,會(huì)把詞義相近的視覺詞匯合并為同一類,經(jīng)過合并,詞匯表中只包含了四個(gè)視覺單詞,分別按索引值標(biāo)記為1,2,3,4。通過觀察可以看到,它們分別屬于自行車、人臉、吉他、人臉類。統(tǒng)計(jì)這些詞匯在不同目標(biāo)類中出現(xiàn)的次數(shù)可以得到每幅圖像的直方圖表示:
人臉:??[3,30,3,20]
自行車:[20,3,3,2]
吉他:??[8,12,32,7]
其實(shí)這個(gè)過程非常簡單,就是針對(duì)人臉、自行車和吉他這三個(gè)文檔,抽取出相似的部分(或者詞義相近的視覺詞匯合并為同一類),構(gòu)造一個(gè)詞典,詞典中包含4個(gè)視覺單詞,即Dictionary?=?{1:”自行車”,?2.?“人臉”,?3.?“吉他”,?4.?“人臉類”},最終人臉、自行車和吉他這三個(gè)文檔皆可以用一個(gè)4維向量表示,最后根據(jù)三個(gè)文檔相應(yīng)部分出現(xiàn)的次數(shù)畫成了上面對(duì)應(yīng)的直方圖。一般情況下,K的取值在幾百到上千,在這里取K=4僅僅是為了方便說明。
總結(jié)一下步驟:
第一步:利用SIFT算法從不同類別的圖像中提取視覺詞匯向量,這些向量代表的是圖像中局部不變的特征點(diǎn);
第二步:將所有特征點(diǎn)向量集合到一塊,利用K-Means算法合并詞義相近的視覺詞匯,構(gòu)造一個(gè)包含K個(gè)詞匯的單詞表;
第三步:統(tǒng)計(jì)單詞表中每個(gè)單詞在圖像中出現(xiàn)的次數(shù),從而將圖像表示成為一個(gè)K維數(shù)值向量。
具體的,假設(shè)有5類圖像,每一類中有10幅圖像,這樣首先對(duì)每一幅圖像劃分成patch(可以是剛性分割也可以是像SIFT基于關(guān)鍵點(diǎn)檢測的),這樣,每一個(gè)圖像就由很多個(gè)patch表示,每一個(gè)patch用一個(gè)特征向量來表示,咱就假設(shè)用Sift表示的,一幅圖像可能會(huì)有成百上千個(gè)patch,每一個(gè)patch特征向量的維數(shù)128。
?
接下來就要進(jìn)行構(gòu)建Bag of words模型了,假設(shè)Dictionary詞典的Size為100,即有100個(gè)詞。那么咱們可以用K-means算法對(duì)所有的patch進(jìn)行聚類,k=100,我們知道,等k-means收斂時(shí),我們也得到了每一個(gè)cluster最后的質(zhì)心,那么這100個(gè)質(zhì)心(維數(shù)128)就是詞典里德100個(gè)詞了,詞典構(gòu)建完畢。
詞典構(gòu)建完了怎么用呢?是這樣的,先初始化一個(gè)100個(gè)bin的初始值為0的直方圖h。每一幅圖像不是有很多patch么?我們就再次計(jì)算這些patch和和每一個(gè)質(zhì)心的距離,看看每一個(gè)patch離哪一個(gè)質(zhì)心最近,那么直方圖h中相對(duì)應(yīng)的bin就加1,然后計(jì)算完這幅圖像所有的patches之后,就得到了一個(gè)bin=100的直方圖,然后進(jìn)行歸一化,用這個(gè)100維德向量來表示這幅圖像。對(duì)所有圖像計(jì)算完成之后,就可以進(jìn)行分類聚類訓(xùn)練預(yù)測之類的了。
圖像的特征用到了Dense Sift,通過Bag of Words詞袋模型進(jìn)行描述,當(dāng)然一般來說是用訓(xùn)練集的來構(gòu)建詞典,因?yàn)槲覀冞€沒有測試集呢。雖然測試集是你拿來測試的,但是實(shí)際應(yīng)用中誰知道測試的圖片是啥,所以構(gòu)建BoW詞典我這里也只用訓(xùn)練集。
用BoW描述完圖像之后,指的是將訓(xùn)練集以及測試集的圖像都用BoW模型描述了,就可以用SVM訓(xùn)練分類模型進(jìn)行分類了。
在這里除了用SVM的RBF核,還自己定義了一種核:?histogram intersection kernel,直方圖正交核。因?yàn)楹芏嗾撐恼f這個(gè)核好,并且實(shí)驗(yàn)結(jié)果很顯然。能從理論上證明一下么?通過自定義核也可以了解怎么使用自定義核來用SVM進(jìn)行分類。
?
PART ?THREE 2.詞袋模型在slam中的應(yīng)用?
DBoW3庫介紹
????????DBoW3是DBoW2的增強(qiáng)版,這是一個(gè)開源的C++庫,用于給圖像特征排序,并將圖像轉(zhuǎn)化成視覺詞袋表示。它采用層級(jí)樹狀結(jié)構(gòu)將相近的圖像特征在物理存儲(chǔ)上聚集在一起,創(chuàng)建一個(gè)視覺詞典。DBoW3還生成一個(gè)圖像數(shù)據(jù)庫,帶有順序索引和逆序索引,可以使圖像特征的檢索和對(duì)比非常快。
? ? ? ? DBoW3與DBoW2的主要差別:
????????1、DBoW3依賴項(xiàng)只有OpenCV,DBoW2依賴項(xiàng)DLIB被移除;
????????2、DBoW3可以直接使用二值和浮點(diǎn)特征描述子,不需要再為這些特征描述子重寫新類;
????????3、DBoW3可以在Linux和Windows下編譯;
????????4、為了優(yōu)化執(zhí)行速度,重寫了部分代碼(特征的操作都寫入類DescManip);DBoW3的接口也被簡化了;
????????5、可以使用二進(jìn)制視覺詞典文件;二進(jìn)制文件在加載和保存上比.yml文件快4-5倍;而且,二進(jìn)制文件還能被壓縮;
????????6、仍然和DBoW2yml文件兼容。
?
????????DBoW3有兩個(gè)主要的類:Vocabulary和Database。視覺詞典將圖像轉(zhuǎn)化成視覺詞袋向量,圖像數(shù)據(jù)庫對(duì)圖像進(jìn)行索引。
????????ORB-SLAM2中的ORBVocabulary保存在文件orbvoc.dbow3中,二進(jìn)制文件在Github上:https://github.com/raulmur/ORB_SLAM2/tree/master/Vocabulary
二、K-Means聚類的效率優(yōu)化
影響效率的一個(gè)方面是構(gòu)建詞典時(shí)的K-means聚類,我在用的時(shí)候遇到了兩個(gè)問題:
1、內(nèi)存溢出。這是由于一般的K-means函數(shù)的輸入是待聚類的完整的矩陣,在這里就是所有patches的特征向量f合成的一個(gè)大矩陣,由于這個(gè)矩陣太大,內(nèi)存不頂了。我內(nèi)存為4G。
2、效率低。因?yàn)樾枰?jì)算每一個(gè)patch和每一個(gè)質(zhì)心的歐拉距離,還有比較大小,那么要是循環(huán)下來這個(gè)效率是很低的。
為了解決這個(gè)問題,我采用一下策略,不使用整一個(gè)數(shù)據(jù)矩陣X作為輸入的k-means,而是自己寫循環(huán),每次處理一幅圖像的所有patches,對(duì)于效率的問題,因?yàn)閙atlab強(qiáng)大的矩陣處理能力,可以有效避免耗時(shí)費(fèi)力的自己編寫的循環(huán)迭代。
三、代碼
代碼下載鏈接:PG_BOW_DEMO.zip
Demo中的圖像是我自己研究中用到的一些Action的圖像,我都采集的簡單的一共6類,每一類60幅,40訓(xùn)練20測試。請(qǐng)注意圖像的版權(quán)問題,自己研究即可,不能商用。分類器用的是libsvm,最好自己mex重新編譯一下。
如果libsvm版本不合適或者沒有編譯成適合你的平臺(tái)的,會(huì)報(bào)錯(cuò),例如:
Classification using BOW rbf_svm
??? Error using ==> svmtrain at 172
Group must be a vector.
下面是默認(rèn)的demo結(jié)果:
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)
當(dāng)然結(jié)果這個(gè)樣子是因?yàn)槲乙呀?jīng)把6類圖像提前弄成一樣大了,而且每一類都截取了最關(guān)鍵的子圖,不太符合實(shí)際,但是為了demo方便,當(dāng)然圖像大小可以是任意的。
下圖就是最好結(jié)果的混淆矩陣,最好結(jié)果就是Pyramid BoW+hik-SVM:
?
圖6 分類混淆矩陣
這是在另一個(gè)數(shù)據(jù)集上的結(jié)果(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)境特征
? ? 分類:自然特征和人工特征;
??????必要性:移動(dòng)SLAM機(jī)器人必須通過實(shí)時(shí)檢測周圍環(huán)境特征來對(duì)自身進(jìn)行一個(gè)定位。
2.面臨問題:
既包括路標(biāo)位姿的估計(jì),也包括機(jī)器人位姿與軌跡的優(yōu)化。(在很多實(shí)際應(yīng)用中,環(huán)境地圖和移動(dòng)機(jī)器人的位置都是未知的,且定位和地圖構(gòu)建二者相互依賴、互為耦合,使得問題求解非常復(fù)雜。)
3.解決方案
目前主要有兩種解決方案:基于濾波器的方法和基于圖的方法。
(2) 基于圖的SLAM(Graph-basedSLAM)
?
算法致力于尋找一個(gè)最大可能的節(jié)點(diǎn)結(jié)構(gòu),得到一個(gè)最優(yōu)位姿地圖(近年來隨著高效求解方法的出現(xiàn),基于圖的SLAM?方法重新得到重視,成為當(dāng)前?SLAM研究的一個(gè)熱點(diǎn))
二、自然特征提取及視覺詞典創(chuàng)建
2.1自然路標(biāo)
優(yōu)點(diǎn):不改變工作環(huán)境,不需要額外設(shè)施和額外信息,并且在環(huán)境中大量存在;
缺點(diǎn):受環(huán)境的影響較大,易受光線、遮擋、視角及環(huán)境相似度等變化的影響
2.2視覺詞典
視覺詞典是圖像分類檢索等領(lǐng)域的圖像建模方法,該方法源于文檔分析領(lǐng)域中的詞典表示,詞典表示將文檔描述為詞典中關(guān)鍵詞出現(xiàn)頻率的向量
2.3自然特征視覺詞典創(chuàng)建框架
2.4具體實(shí)施
(1)用SURF(SpeededUp Robust Features)算子提取圖像的自然局部視覺特征向量;(優(yōu)點(diǎn):保存了圖像原有的色彩,而且改進(jìn)了SIFT?算法計(jì)算數(shù)據(jù)量大、時(shí)間復(fù)雜度高、算法耗時(shí)長等缺點(diǎn),可以用?64維向量建立特征點(diǎn)描述符,進(jìn)一步提高了快速性和準(zhǔn)確性)
(2)把相似的SURF?自然視覺特征向量劃分為相同的自然視覺單詞(采用?K-means算法對(duì)局部視覺特征集合進(jìn)行聚類,一個(gè)聚類中心即為一個(gè)視覺單詞);
(3)自然視覺詞典的每一自然視覺單詞采用GMM(GaussianMixture Model)方法進(jìn)行建模自然視覺單詞的概率模型,通過概率模型建立了更為精確的局部自然視覺特征與自然視覺單詞間的匹配
?
2.5實(shí)例
包括:室內(nèi)走廊和室外視覺詞典
三、視覺詞典的人工路標(biāo)模型創(chuàng)建
四、閉環(huán)檢測
? ? ?目前視覺 SLAM 閉環(huán)檢測領(lǐng)域大部分算法都是首先準(zhǔn)確建立基于圖像外觀的場景模型,然后基于場景外觀進(jìn)行閉環(huán)檢測
???? BoVW(Bagof visual words)算法步驟:
???? ①用SIFT或SURF算子提取圖像的局部特征,每個(gè)局部特征用相同維數(shù)的特征向量表示;
???? ②將檢測到的局部特征集合進(jìn)行聚類,每個(gè)聚類中心對(duì)應(yīng)一個(gè)視覺單詞;
???? ③構(gòu)建表征圖像的視覺詞典,動(dòng)態(tài)調(diào)整視覺單詞數(shù)量以評(píng)估視覺詞典的大小;
???? ④圖像由視覺詞典中的視覺單詞權(quán)重向量表征。
BoVW(Bag of Visual Words)算法將一副圖像類比為一篇文檔
? ??①SLAM采集圖像具有時(shí)間連續(xù)性,利用時(shí)間連續(xù)性提升檢測的準(zhǔn)確性。
???? ②圖像匹配的相似度計(jì)算方法與視覺?SLAM?的時(shí)間連續(xù)特征,利用貝葉斯濾波融合當(dāng)前觀測量(也即當(dāng)前圖像匹配的相似度)和前一時(shí)刻的檢測信息計(jì)算當(dāng)前時(shí)刻閉環(huán)檢測的概率,由此設(shè)計(jì)一種基于貝葉斯濾波的閉環(huán)檢測跟蹤算法;
?
4.1基于人工視覺詞典的閉合檢測算法:
?
4.2基于貝葉斯濾波閉環(huán)檢測算法:
相似度
圖像內(nèi)存管理
五、混合人工自然特征的單目視SLAM
5.1算法整體框架
六、發(fā)展方向
借助Wifi或者偽衛(wèi)星信號(hào);三維場景地圖實(shí)時(shí)性構(gòu)建;機(jī)器人陌生環(huán)境內(nèi)學(xué)習(xí)(模擬人類學(xué)習(xí)過程)以及高效內(nèi)存管理模式;
設(shè)定室內(nèi)路標(biāo)的規(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
個(gè)人學(xué)習(xí)使用,如有疑問,請(qǐng)聯(lián)系博主驚醒修正
總結(jié)
以上是生活随笔為你收集整理的SLAM闭合回环————视觉词典BOW小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄山风景区门票多少钱
- 下一篇: 送礼给女士,请买过香水的美女给我个建议好