1. 程式人生 > >【泡泡機器人原創專欄】DBoW3 視覺詞袋模型 視覺字典和影象資料庫分析

【泡泡機器人原創專欄】DBoW3 視覺詞袋模型 視覺字典和影象資料庫分析

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

前言

        影象資料庫、視覺字典和視覺詞袋向量是SLAM、計算機視覺、3D物體識別和卷積神經網路影象處理的重要基礎工具。所謂“萬丈高樓平地起”,在深刻理解這些基本工具的基礎之上,根據開源專案構建自己的工程就可以做到遊刃有餘了。在工程實踐中,開原始碼往往不能滿足業務需求,而對計算機視覺的應用直接上來裁剪程式碼是一件非常困難的事情。本文的初衷是用最淺顯易懂的語言,幫助大家理解並不那麼普及的技術,更重要是能夠根據這些原理快速構建程式碼和應用。

        無奈,本文作者碼力有限,若要對演算法上手即來,直接形成程式碼還是一件非常困難的事情。程式碼的實踐性非常強,大量的工程實踐是光明大道。紙上得來終覺淺,絕知此事要躬行。


DBoW3庫介紹

        DBoW3是DBoW2的增強版,這是一個開源的C++庫,用於給影象特徵排序,並將影象轉化成視覺詞袋錶示。它採用層級樹狀結構將相近的影象特徵在物理儲存上聚集在一起,建立一個視覺詞典。DBoW3還生成一個影象資料庫,帶有順序索引和逆序索引,可以使影象特徵的檢索和對比非常快。


         DBoW3與DBoW2的主要差別:

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

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

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

        4、為了優化執行速度,重寫了部分程式碼(特徵的操作都寫入類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


        逆序指標指向一個數據對<影象It, 視覺詞袋向量vti>,可以快速獲取影象上的視覺單詞的權重。當新的影象It加入到影象資料庫中的時候,逆序指標就會更新,也方便在資料庫中查詢影象。逆序索引用於提取與給定影象相似的影象。這個結構用於儲存視覺單詞,視覺單片語成視覺字典,視覺字典形成影象。檢索影象、做比較操作時,就不會對比影象中相同的視覺單詞,這對檢索影象資料庫非常有用。順序索引有效地獲取影象間的雲點匹配,加快影象確認中的幾何特徵檢驗。順序指標可以方便地儲存每幅影象的特徵。視覺字典中的節點是分層儲存的,假如樹一共有L層,從葉子開始為0層,即L=0,到根結束,l=Lw。對於每幅影象It,將l層的節點儲存在順序指標中,而l層的這些節點是影象It的視覺單詞的父節點,區域性特徵ftj列表與每個節點關聯。用順序指標和詞袋模型樹估算BRIEF向量描述子空間中的最鄰近的節點。對於那些特徵屬於相同的單詞或具有第l層相同父節點的單詞,計算特徵的對應關係時,這些順序指標可以加快幾何驗證過程。當獲取一個將要匹配的候選特徵時,幾何驗證非常必要,新影象加進資料庫,順序指標就會更新。


權重計算Weighting

        單詞在視覺字典和詞袋向量中都有權重。

        視覺單詞有4種權重計算方法:

        1. 詞頻Term Frequency (tf)其中,是單詞 在影象d中出現的次數;是影象d中單詞的數量;

        2. 逆向檔案頻率Inverse documentfrequency (idf):N是影象數量;Ni是影象包含單詞的數量;

        3. 詞頻-逆向檔案頻率Term frequency -inverse document frequency (tf-idf):

        4. 二值:
        注意:視覺詞典建立之後,DBoW根據影象的數量計算N 和 Ni 。他們的值不會隨影象資料庫中的影象特徵入口數量的變化而變化。


相似度度量 Scoring

        如果是要對觀測到的樣品資料進行判別分類的問題,可以應用統計學中判別分析方法進行處理。判別分析方法主要有距離判別、貝葉斯判別和典型判別等幾種常用方法。通常我們所說的距離是歐式距離,即歐式空間中兩點之間的距離。但在統計學多元分析中,有時歐式距離不太合適。比如,某個資料點在兩個正態分佈中的距離。這樣就會用到馬哈拉諾比斯Mahalanobis距離,即馬氏距離。

        在分類中的相似度度量有兩種方法---距離和相似係數,距離用來度量樣品之間的相似性,相似係數用來度量變數之間的相似性。樣品之間的距離和相似係數的定義不同,而這些定義與變數的型別有非常密切的關係。變數按照測量尺度的不同可以分為三類:

        1 間隔尺度變數:變數是連續的量。如長度、速度、重量、溫度等。

        2 有序尺度變數:不明確的數量表示變數,而是用等級表示。如某產品分為一等品、二等品、三等品等有序關係。

        3) 名義尺度變數:變數用一些類表示,無等級或數量關係。如性別、職業等。



        可以通過詞典Vocabulary或查詢影象資料庫Database計算兩個向量的相似度。有好幾種方法可以計算相似度。相似度的值的含義在於我們使用什麼樣的度量方式。然而,有些度量方法可以標準化到區間[0..1]中,0表示沒有匹配,1表示完美匹配。如果需要修改計算相似度的程式碼,也要注意詞典Vocabulary和影象資料庫Database的執行速度。

        計算兩個向量v 和w的相似度有幾種度量方法(這裡v* 和w* 表示經過L1範數標準化後的向量):

       1、點積Dot product:

       2、L1範數L1-norm:

       3、L2範數L2-norm:

       4、巴式係數Bhattacharyyacoefficient: 。巴式距離測量兩個離散或連續概率分佈的相似性。它與衡量兩個統計樣品或種群之間的重疊量的Bhattacharyya係數密切相關。

       5、卡方距離 χ² distance:

       6、KL散度 / 相對熵KL-divergence: 

        有些方法在使用前,要對向量進行標準化處理。向量通常都是稀疏的、包含了一些0值,卡方距離和KL散度並不能處理所有向量。因此,需要避免數值處理上的問題。在KL散度的計算中,ε 是計算機給出的epsilon 值(最小的浮點負數)。當計算計分的時候,可以使用一個標誌位來指示這些值線上性範圍[0..1]中, 其中1是最大值,0是最小之。用L1-範數,L2-範數和卡方距離時,啟用這個標誌位。巴式係數Bhattacharyyacoefficient 總是在[0..1]內,並不依賴於變換標誌位。

        注意:為了計算效率,計算卡方距離的時候假定權重從來都不會為負數(使用tf, idf, tf-idf 和 binary 向量的時候,總是這樣)。建立字典的時候,預設使用tf-idf 和L1-正規化。


DBoW3程式碼解讀

        DBoW3庫主要類:


        DBoW3視覺字典構建過程:


        視覺字典樹生成過程 

        DBoW3庫中各類說明:







核心演算法K-Means++聚類

        聚類是機器學習、計算幾何的經典問題。在最流行的k-means方法中,給定整數k和上的一組n個數據點。目標是選擇k個聚類中心點,求每個資料點到最近的聚類中心距離平方和的最小值。

        k-means演算法原理簡單、容易實現,計算時間短、速度快,但精度不夠高。


定義k-means問題:

        1、給定一個整數k表示聚類簇的數量和n個數據點

        2、選擇k個聚類中心點C,求函式的最小值:


k-means聚類過程示意圖: 


k-means聚類演算法原理:

        1. 隨機選取k個初始中心資料點,即k個簇的各自中心,記作

        2. 對於每個簇時聚類簇中的所有資料點χ到
的距離比它們到的距離更近;

        3. 對於每個簇,設定為這群資料點的中心: 
        4. 重複第2步和第3步,直到聚類簇C不再變化,資料點不會再被重新劃分。

        初始的中心資料是從χ中隨機選擇k個聚類中心。但初始聚類中心並不是最優化的,為了得到優化的聚類中心,k-means演算法迭代地進行兩步操作。對於上述第2步,只要方法是一致的,對比關係可以任意變換。第2步和第3步用於降低∅值,演算法區域性改進,自由聚類,直到它不能再迴圈計算為止。實際上是第3步降低了∅值,使用的是線性代數中的結果。


k-means聚類演算法步驟:



        有序屬性的相似度可以採用閔可夫斯基距離直接計算距離,對無序屬性可以採用VDM(Value Difference Metric)。

        k-means演算法以歐幾里得距離作為距離或相似度測算,求對應的初始聚類中心資料的最優分類,使得評價結果最小。演算法採用誤差平方和準則函式作為聚類準則函式。


相關定義

        k-means聚類過程中的數學模型分析:

                                          


其中,c為聚類簇χ的均值。


        給定k聚類完成後,求一個類中所有樣本點到該聚類中心距離的平方和,即:;所有的聚類簇加起來,記為:,聚類演算法就是要使Sum最小。係數r用於指示第n個數據點被聚類到第k個聚類簇的對應關係,如果歸類成功,就記為1;否則為0。

        直接根據Sum確定r和c來使Sum最小化並不容易,但可以採用迭代方法:先給一個初始c資料點,選擇最優的一群r,可以直觀看出只要將這n個數據點歸類到離它最近的中心就能保證Sum最小。

        然後,再固定r值,求最優的簇類中心點c。可以將Sum對c求導,導數為零時,Sum應為最小。

    
        當資料點歸類到聚類簇中時,r=1,c就是第k個聚類簇中所有資料點的平均值。每一次迭代都是取Sum的最小值,k-means最終會得到一個極小值。但不能保證能得到一個全域性最優解。


k-means++聚類演算法流程:

        1. 從輸入的資料點集合中隨機選擇一個點作為第一個聚類中心

        2. 對於資料集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離D(x)

        3. 選擇一個新的資料點作為新的聚類中心,選擇的原則是:D(x)較大的點,被選取作為聚類中心的概率較大

        4. 重複2和3直到k個聚類中心被選出來

        5. 利用這k個初始的聚類中心來執行標準的k-means演算法


DBoW3庫核心演算法k-means++程式碼

        這裡重點程式碼是k-means++

        備註:為了顯示程式的關鍵字,採用截圖形式貼出原始碼,如果圖片不清晰,請閱讀 :

        https://github.com/rmsalinas/DBow3/blob/master/src/Vocabulary.cpp 222至482行

      










參考文獻

1. 《機器學習》周志華

2. 《應用多元分析》王學民

3. Bags of Binary Words for Fast Place Recognition in ImageSequences

4. Video Google: A Text Retrieval Approach to Object Matchingin Videos

5. Scalable Recognition with a Vocabulary Tree

6. Interactive learning of visual topological navigation

7. Fast and incremental method for loop-closure detection usingbags of visual words

8. Bag of visual wordmodel based on binary hashing and space pyramid


【版權宣告】泡泡機器人SLAM的所有文章全部由泡泡機器人的成員花費大量心血製作而成的原創內容,希望大家珍惜我們的勞動成果,轉載請務必註明出自【泡泡機器人SLAM】微信公眾號,否則侵權必究!同時,我們也歡迎各位轉載到自己的朋友圈,讓更多的人能進入到SLAM這個領域中,讓我們共同為推進中國的SLAM事業而努力!

 

【注】商業轉載請聯絡劉富強([email protected])進行授權。普通個人轉載,請保留版權宣告,並且在文章下方放上“泡泡機器人SLAM”微信公眾賬號的二維碼即可。  

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述