DBoW2算法原理介紹


本篇介紹DBoW2算法原理介紹,下篇介紹DBoW2的應用。

DBow2算法

DBow2是一種高效的回環檢測算法,DBOW2算法的全稱為Bags of binary words for fast place recognition in image sequence,使用的特征檢測算法為Fast,描述子使用的是brief描述子,(TODO:和DBow的區別在哪里?)是一種離線的方法。

二進制特征(ORB特征):Fast特征點+Brief描述子
(Hamming distance) 256bits的二進制描述符
Brief描述子:\(b=[b_1, b_2, \cdots, b_{256}]\)總共256bits,每一個bit都是0,1的數
Surf描述子:64位的浮點數,\(d=[d_1, d_2, \cdots, d_{64}]\)

基本的數學知識

Brief使用的距離描述算子為Hamming距離,定義如下:

\[d(v_1, v_2) =\vert v_{11} - v_{21} \vert + \vert v_{12} - v_{22} \vert + \cdots + \vert v_{1n} - v_{2n} \vert \]

對於二進制字符串可以通過簡單的按位異或實現\(d(v_1,v_2) = v_1 \oplus v_2\)

算法流程

Bag of Words字典建立方法(最終得到的就是每一層的不同類的median,每一個葉節點對應的就是一個詞匯):
DBoW2整體流程

建樹流程

kmeans++建樹流程
kmeans++方法
輸入:(a)聚類數目;(2)初始化中心點(這里使用kmeans++的方法)
算法流程:
迭代:
(1)每個點分類到最近的中心點;
(2)用每一類點的中心點更新中心點。

中心點初始化方法:
-(1)從輸入的點集合中隨機選擇一個點作為第一個聚類中心;
-(2)對於數據集中的每一個點,計算它與已選擇的最近的聚類中心的距離D(x);
-(3)選擇一個新的數據點作為新的聚類中心,選擇的原則是:D(x)較大的點,被選為聚類中心的概率較大;
-(4)重復2和3的步驟直到k個聚類中心被選出來;
D(x)到概率上的反應:

  • 先從數據庫隨機挑個隨機點當“種子點”
  • 對於每個點,計算其和最近的一個“種子點”的距離D(x)並保存在一個數組里,然后把這些距離加起來得到Sum(D(x))。
  • 然后,再取一個隨機值,用權重的方式來取計算下一個“種子點”。這個算法的實現是,先取一個能落在Sum(D(x))中的隨機值Random,然后用Random -= D(x),直到其<=0,此時的點就是下一個“種子點”。

k-median方法在聚類方法的第二步使用每一個類的中值作為新的中心;

創建words:把建樹中所有的節點遍歷一遍,找出葉節點。

DBoW2創建節點代碼:

\\把所有的節點遍歷一遍
for(++nit; nit != m_nodes.end(); ++nit)
{
	  \\只有節點是字符
      if(nit->isLeaf())
      {
        nit->word_id = m_words.size();
        m_words.push_back( &(*nit) );
      }
}

權重設置

權重設置用的是idf,意思是詞匯在訓練過程中出現的頻率越高,區分度越低,因此權重越低。

\[idf=\log\frac{N}{n_i} \]

每一個節點包括(只列出了部分信息)

struct Node 
{
	//在所有節點中的標號
	NodeId id;
	//該節點的權重,該權重為
	//訓練的過程中設置的,在得到了樹之后,將所有的描述子
	//過一遍樹,得到每個單詞出現的次數,除以總的描述子數目
	WordValue weight;
	//描述符,為每一類的均值(對於brief描述子,則要對均值進行二值化)
	TDescriptor descriptor;
	//如果是葉節點,則有詞匯的id
	WordId word_id;
}

[說明]:上面的方法是分層聚類的,每一次聚類得到的多個節點,都有median \(v\)
示該類,可以用來判斷新的詞匯是否屬於該類。最終建立的樹包括W個葉節點,也就是W個視覺詞匯,詞匯也用median表示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM