本篇介紹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) = v_1 \oplus v_2\)。
算法流程
Bag of Words字典建立方法(最終得到的就是每一層的不同類的median,每一個葉節點對應的就是一個詞匯):
建樹流程
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,意思是詞匯在訓練過程中出現的頻率越高,區分度越低,因此權重越低。
每一個節點包括(只列出了部分信息)
struct Node
{
//在所有節點中的標號
NodeId id;
//該節點的權重,該權重為
//訓練的過程中設置的,在得到了樹之后,將所有的描述子
//過一遍樹,得到每個單詞出現的次數,除以總的描述子數目
WordValue weight;
//描述符,為每一類的均值(對於brief描述子,則要對均值進行二值化)
TDescriptor descriptor;
//如果是葉節點,則有詞匯的id
WordId word_id;
}
[說明]:上面的方法是分層聚類的,每一次聚類得到的多個節點,都有median \(v\)表
示該類,可以用來判斷新的詞匯是否屬於該類。最終建立的樹包括W個葉節點,也就是W個視覺詞匯,詞匯也用median表示。