【乾貨】機器學習實戰——LBP特徵提取
作者:張旭
編輯:欒志勇
零全篇概述:LBP(Local Binary Pattern)演算法
是一種描述影象特徵畫素點與各個畫素點之間的灰度關係的區域性特徵的非引數演算法,同時也是一張高效的紋理描述演算法。
紋理是物體表面的自然特性,它描述影象畫素點與影象領域之間的灰度空間的分佈關係,不會因為光照強弱而改變影象的視覺變化。
LBP演算法首次提出於1994年,主要是使用8鄰域位置的區域性關係,具有灰度不變性;隨後在2002年提出了其改進版《Multiresolution gray-scale and rotation invariant texture classification with local binary patterns》Timo Ojala, Matti PietikaÈ inen,2002,主要引入了圓形模式、旋轉不變性、和等價模式。
所以在下面我們將按照如下順序介紹LBP特徵:灰度不變性的基本LBP,灰度不變性的圓形LBP,旋轉不變性的LBP,等價LBP,最後再繼續進行我們上一次的實驗,用LBP特徵提取+KNN演算法實現手寫數字識別問題。
一灰度不變性基本LBP演算法:
分析:
基本的LBP演算法一般被定義為一個3*3的紋理單元,如圖1,其中間的畫素點灰度值為Pc,其他相鄰的8個畫素點灰度值分別為P0,P1,P2,P3,P4,P5,P6,P7,以該紋理單位的中心畫素點的灰度值為閾值,若其餘相鄰的8個畫素點的灰度值大於中心畫素點灰度值的閾值,則該畫素點的編碼值為1,小於閾值的時候取編碼值為0.
計算:
對於一個3*3的紋理單元,LBP的計算過程為:
為了得到各個畫素點的編碼值,則為每個S(Pi-Pc)分配權值2^i,然後將編碼值連線成一個二進位制值然後再轉化成一個十進位制的值,然後用現在的十進位制值代替原來中心點的閾值,再對這個十進位制進行計算,計算出的結果就是LBP演算法的值,計算公式為:
例子:
下圖為一個LBP演算法的計算例子:
該紋理單元的中心灰度值(閾值)為85,其餘8個相鄰的灰度值分別為:90、74、63、134、91、83、99、103、90。根據這個閾值計算的定理進行計算,通過閾值計算後,根據圖中箭頭所指的方向可以得到一個區域性二進位制的模式,即:LBP模式=1101001,且LBP=217,。通過以上LBP演算法的計算例子可以看出LBP值僅由中心畫素點灰度值和相鄰八個畫素點的灰度值決定,LBP特徵即表示了其中心畫素點的特徵,其值的計算還需要和周圍的畫素點計算完成,所以,LBP特徵與周圍有很大的關係,它包含了影象點,又包含了邊緣和區域性的特徵分佈資訊。
二
灰度不變性的圓形LBP演算法:
從上面的計算我們可以看出,基本的LBP演算法的計算僅包含其相鄰的八個畫素點,半徑小,覆蓋範圍很小,這種方式的表達能力相對較小.
所以,Ojala等人提出一種改進的方法,將原來的3*3的方形九個畫素點的計算模式,改成了任一點即半徑的圓形模式,這樣表達方式就不受限制了,而且原始的正方形領域的畫素點空間被圓形領域所代替。這種圓形領域的演算法的半徑R可以任意的改變,且半徑R的畫素點個數也不固定。
改進後的LBP演算法通常用符號LBP(p,b)表達,R為圓形半徑,P代表在該圓形範疇內的P個不同畫素點。
下圖為幾種常見的不同半徑和不同畫素點的LBP演算法的示意圖:
為了對LBP運算元進行表示,用函式E表示為中心畫素和相鄰畫素點的聯合分佈函式:
其中,gr表示影象中某個中心畫素點的灰度值,g0~gk-1表示與中心畫素點相鄰的周圍的 畫素點,其中K=0,1,2~k-1。每個E函式其中心畫素點和相鄰畫素點所圍成的圓的半徑可以不同,其相鄰畫素點的數量也可以不同。一箇中心畫素點周圍的其它畫素點gk的座標可以表示成如式1所示:
其中主要注意的是,gr的座標計算出來之後,可能不是整數,此時一般的解決方法是採用雙線性內插值求得該畫素點的灰度gr。
假設周圍每一點和中心點的差值與中心點是相互獨立的,如下式所示:
假設中心畫素點的獨立性可能有時會造成資訊的丟失,但是,其對後續的結果影響很小。而且,在影響結果很小的前提下,以丟失少量資訊的代價得到對區域性紋理描述的平移不變性,結果時可以接受的、而且這種相對差值表示的紋理特徵與表示亮度的中心畫素點關係不是很大,所以可以忽略,如式3所示,聯合分佈表示式為:
由於最終想要得到的是其二值特徵,即知道差值的結果符號即可以,這樣結果就不受到到光照的影響,則可以表示成公式4,
通過計算得到的二值,需要給每個S賦一個權值,再對其進行求和,即可得到此中心畫素點的區域性紋理特徵值,即LBPk,r
通過上述的計算過程可知,圓形LBP演算法與基本LBP演算法基本原理相同,但是它的表達方式更靈活,有很好的魯棒性,表示範圍與表達能力更強。
三旋轉不變性的LBP演算法:
通過上面的介紹,我們不難發現1和2兩種LBP演算法是具有灰度不變性的,在2002年的論文的,除了灰度不變性,作者又為LBP引入了旋轉不變性與等價模式,它是怎麼實現的呢?
對於一個選定的P,LBP演算法將產生2^P個不同的輸出值,比如P=8時,值就有256個,這256個模式中每拿出一個都圍繞中心點轉動,那麼在多次轉動的過程中,會產生多種不同的結果,而這些結果中值最小的那個模式就是選擇不變的二值模式了。比如:
在上面的圖中說明的是,圖中的這8種模式,都有相同的旋轉不變模式,就是十進位制為15的那個值,即00001111。那麼對256種模式都做這種旋轉,得到最小的數作為這種模式的旋轉不變模式,旋轉不變模式一共有36種,如下圖所示:
那麼為什麼最後又36種呢?我們寫一段暴力列舉的程式碼試一試就好了:
程式碼:
其中0-255的數字每一個轉成二進位制後分別轉8次,求出最小的十進位制數,作為雜湊表的索引,最後雜湊表中1的個數就是旋轉不變的模式種類。
四等價LBP演算法:
所謂等價模式是通過記錄跳變方式來進一步降低LBP特徵維數,“等價模式”定義為:當某個LBP所對應的迴圈二進位制數從0到1或從1到0最多有兩次跳變時,該型別保留;跳變次數超過2次時,直接不要。等價模式就做了這件事,把P=8時的256種灰度不變性模式壓縮為58種,把把P=8時的36種旋轉不變性模式壓縮為9種。下面我們看一下58和9是怎麼來的:
首先256壓縮為58:
當P=8時,P(P-1)+2=58。其中P(P-1)為跳變2次的情況,而2位跳變為0次的情況,並沒有一種情況是發生了一次跳變。
其次36壓縮為9:
直接貼一下論文的原話吧:
注意上面那張36種模式圖,其中00000000與11111111是跳變為0的情況,除了這兩個,圖中第一列的其他7個都是跳變為2,最後剩下的27個跳變都超過了2,直接丟棄,所以2+7=9。
五LBP +KNN實現手寫數字識別:
在上一次HOG特徵的文章中,我們設計了一個小實驗,現在我們還是用上次準備的資料,根據LBP特徵提取演算法+KNN分類器實現一個手寫數字識別的問題,在這之前需要說明一點的是,上面的內容中我們一直在闡述各種LBP演算法,那麼LBP的特徵到底如何構建呢?
在圖中構建不重疊cell單元,並在每一個cell中構建灰度直方圖特徵,最後把每個cell的灰度直方圖特徵做串接組合,構建出整張圖的特徵,在這裡就可以解釋為什麼等價模式可以降維了,我們還是拿P=8舉例,假設一張圖構建了160個cell,那麼各個LBP演算法的特徵維數為:
灰度不變LBP: 256*160
旋轉不變LBP: 36*160
等價灰度不變LBP: 58*160
等價旋轉不變LBP: 9*160
最後我們選擇等價旋轉不變模式(Num_cell=25)跑個實驗,並貼出上次實驗的結果:
在上面的實驗中,由於資料圖只有20*20,單元尺寸為4時,單元個數只有25個,所以在等價旋轉不變LBP演算法中,特徵維度只有9*25,等價模式本來為了降維而生,但是本身就不高的維度降維後,丟失了很多特徵資訊,這可能是LBP(9)只有86.7%的準確率的重要原因。總結一下,上面的實驗結果只是一個很簡單的驗證,並不能說明LBP(9)演算法不好,因為分類結果是特徵、分類器、資料特點等等因素共同決定的,講道理,沒有不好的演算法,只有合適與不合適!
PS:
1. 資料準備和KNN的部分在上一篇HOG特徵中已提及,為節省篇幅不再重複
2. 整個程式碼有大概500行左右,為了節省篇幅,不貼程式碼啦,如果感興趣可以到一下地址檢視:https://github.com/chaipangpang/LBP-KNN
關於本文LBP特徵提取的相關知識和其他問題
歡迎大家加群在群中探討
歡迎留言或讚賞。
推
薦
閱
讀
掃描燕哥微訊號,
拉你進機器學習大牛群。
福利滿滿,名額已不多…
群裡目前包括:
清華張長水教授,
清華顧險峰教授,
北大黃鐵軍教授,
西安電子科技大學焦李成教授,
新加坡南洋理工大學黃廣斌教授,
北交李清勇教授
And so on……