LATCH: Learned Arrangements of Three Patch Codes

簡介

該算法是二值化特徵描述方法的一個優化變種,通常的二值化特徵描述主要經過計算特徵點窗口內n個點對的比較值造成一個bit串,做爲該特徵點的特徵描述子,這樣的bit串特徵描述子在圖像匹配計算時能夠經過同或計算漢明碼,大大提升計算速度,可是點對的比較會有一個明顯的缺點,就是受噪聲影響較大,雖而後續的一些算法經過高斯模糊進行濾波,可是濾波後圖像信息會有必定減小,創建在此基礎上,做者提出了一種經過計算窗口內像素塊的比較值造成bit串,同時做者也提出瞭如何定位像素塊的方法。html

該特徵的特色web

  1. 此爲特徵的binary描述子,其特徵模式須要學習(可能受限於訓練場景,與fast有類似的問題);
  2. 特徵描述時能接受特徵檢測子的方向信息而進行相應旋轉,故描述子具旋轉不變性;
  3. 耗時介於binary特徵和非binary特徵之間,判別性也介於binary特徵和非binary特徵之間;

像素塊比較

假設特徵點窗口內有3個塊 P1 , P2 , P3 ,每一個塊包含 m×m 個像素,每一個塊能夠用一個 m×m 矩陣表示,塊之間的比較爲Frobenious norm,即兩塊中各個像素對應位置處像素差的平方和,所以該特徵點處該像素塊對應的特徵能夠表示爲:
算法

g(W,st)={1ifPt,aPt,12F>Pt,aPt,22F0otherwise

若須要256 bits長的特徵描述子,則須要選擇256個3像素塊,每一個3像素塊獲得一個bit結果。svg

像素塊模式

在像素塊比較中須要計算像素塊內各個像素點的值,所以計算前提是定位像素快,一個很小的特徵窗口可以產生很是多的像素塊的組合,有些像素塊對圖像匹配不重要,有些很是重要,本節主要介紹如何選擇像素塊的組合方式使得匹配結果最優。本文中像素塊位置的肯定是經過有監督學習的方法進行。wordpress

數據集

首先構造一個訓練數據集,該數據集來自Learning Local Image Descriptors Data,如下用LLIDD表明該數據集,LLIDD數據集主要對三個場景(Literty, Ntore Dame , Halp Dome)的3D場景構造圖像中處理而來,首先經過Noah Snavely’s Photo Tourism算法計算3D構造圖初始特徵點,再經過立體深度地圖匹配不一樣圖像只可以對應的特徵點,而數據集則是特徵點領域內64x64的圖像塊。同時創建標籤文件,記錄各個圖像塊是不是來自同一目標。本文做者在LLIDD數據集的基礎上建立了一個50k的數據樣本對,每對數據樣本包括兩個圖像塊,同時有一個標籤表示兩個圖像塊是否相同,最終數據集包括一半匹配一半不匹配的圖像塊。 性能

訓練

隨機產生56k個3像素快,即
學習

S={St}t=1...T={[Pt,1,Pt,1,Pt,3]}t=1...T      T=56000

再用每一個3像素塊去對每一個數據對進行匹配,若匹配結果與標籤結果相同則賦予一個值爲1的bit,若不相同則賦予一個值爲0的bit,這樣對數據集中全部數據對匹配後將產生一個長度爲50k的bit串,將bit串中每位值相加即爲該像素快的匹配能力。對全部像素塊都進行該運算後再對匹配能力進行排序,同時刪除與前面3像素快相關度大於0.2的3像素快(下降最終triplets之間的相關性)。另外在程序計算描述子的時候3像素塊的選取採用增量各點選取的方法(0, 6, 12,…)。這樣選取最大的n個做爲3像素快候選集。

性能

耗時方面

特徵描述計算耗時高於其餘binary特徵,低於非binary特徵,如下是計算一個特徵點時的耗時。
這裏寫圖片描述優化

精度方面

匹配精度高於其餘binary特徵,低於非binary特徵。ui

代碼

描述子計算僞代碼:this

PatchSize = 7 * 7   // 圖像塊大小
BytesLength = 32    // 每一個特徵描述子的長度 單位:Byte
descriptors = Mat(Keypoints.length, BytesLength, Byte) // 描述子初始化 爲一個類型類Byte的
grayScale = convertToGray(img)
foreach keyPoint in Keypoints:
    for i = 1 to BytesLength:
    descriptors[k][i] = 0
        for j = 0 to 7
            get one tripet Pathes P1 P2 P3 their position
            rotate the pixel in P1 P2 P3 to the direction of the Keypoint
            compute the bit result: b = (P1-P2) > (P3-P2) ? 1 : 0
            descriptors[k][i] += (Byte)b<<j