物體檢測就是對數字圖像中一類特定的物體的位置進行自動檢測。基本的檢測框架有兩種:
一種是以滑動窗口為單位對圖像進行掃描,對掃描所得的每個子圖像提取特征,並用學習到的分類器來分類該特征並且判斷該子圖像是否為所檢測的特定物體。對象檢測的一個問題是,對象在圖片中的位置和尺度是未知的。算法被要求能夠檢測各種不同位置、不同大小的對象,這樣的特性被稱為位置無關性和尺度無關性。為了達到這樣的特性,常見的方法是使用多尺度框架,即:通過縮放原始圖像,產生一組大小不同的圖像序列,然后在序列的每幅圖像中都使用固定尺寸 W×H 的滑動窗口,檢測算法將判斷每次滑動窗口所截取的圖像子窗口是否存在目標對象。滑動窗口解決了位置無關性;而圖像序列中存在至少一幅圖像,其包含的目標對象的尺度符合滑動窗口的尺度,這樣一個圖像金字塔序列解決了尺度無關性。
另一種則是在整幅圖像上首先提取興趣點,然后僅對提取出來的興趣點分類。
因此我們把物體檢測方法分為基於滑動窗口的物體檢測和基於興趣點的物體檢測兩類。
無論是哪種做法,整個過程都可以分為特征提取和特征分類這兩個主要階段。也就是說,物體檢測的主要問題是使用什么樣的特征和使用什么樣的分類器。
物體檢測的難點在於如何用有限的訓練集來學習到魯棒的、可以適用到各種情況下的分類器。這里所說的各種情況包括有:圖像中物體的大小不同;光照條件的差異所引起的圖像明暗的不同;物體在圖像中可能存在的旋轉和透視情況;同類物體間自身存在的差異。
本文以定位二維碼為例,簡述基於機器學習實現物體檢測的大致算法流程。
一、 算法流程
我們先把輸入圖像分成 25×25 的圖像子塊。把圖像子塊作為特征提取和特征分類這兩個模塊的基本處理對象,即對圖像子塊進行紋理特征提取,特征分類時判定當前處理的圖像子塊是否屬於二維條形碼的一部分,如圖 3-2 所示。
在特征提取模塊中,我們使用紋理特征提取算法從原始輸入圖像中提取出多分辨率直方圖特征、局部二值模式特征和邊緣方向直方圖特征,這三種紋理特征的表達形式均為一維數組。我們將這 3 個數組連接為 1 個一維數組,作為后續分類模塊的輸入。
在特征分類時,我們希望保留所有屬於二維條形碼的圖像子塊,同時去除所有屬於背景的圖像子塊。在該模塊中,我們使用了自適應 Spatialboost 算法。圖 3-3 為經過這步處理后的理想輸出結果,圖中被標記的小方塊表示他們屬於二維條形碼的一部分。
后處理模塊使用自適應聚類算法對特征分類后的結果做進一步的處理,最后把期定位的圖像子塊合並,得到最終的二維條碼定位結果。
二、 特征提取
圖像的紋理特征可以描述物體特有的屬性,用以區別其他物體。紋理特征總體可分為空域和頻域兩大類。在本文算法中,我們采用的紋理特征均屬於空域的紋理特征,也是局部特征,它們分別是多分辨率直方圖特征、局部二值模式特征和邊緣方向直方圖特征。
多分辨率直方圖特征具備旋轉無關的特點。這種紋理特征保留了灰度直方圖特征計算簡單和保存方便的特點。同時它又可以描述紋理的局部信息,彌補了傳統的灰度直方圖特征的缺點。
局部二值模式特征是一種計算復雜度較低的局部特征,它具有明暗無關和旋轉無關的特點。 邊緣方向直方圖特征與全局的光照變化是無關的,它可以提取出二維條形碼紋理的幾何特點。
三、 特征分類
本文算法所使用的分類器為自適應 Spatialboost 算法,這是對 Spatialboost 算法的一個改進。使用這個分類器是由二維條形碼的特點以及我們算法框架的特點所決定的。由於我們把原始輸入圖像分為若干大小固定的圖像子塊,屬於二維條形碼的圖像子塊在空間上有很強的關聯性,或者說這些屬於二維條形碼的圖像子塊都是緊密相鄰的。同時由於圖像子塊的尺寸不大,它所包含的信息量相對較少,有的時候就很難把屬於二維條形碼的圖像子塊和屬於背景的圖像子塊區分開(它們在特征空間上可能重疊)。如果我們可以利用子塊在空間上的聯系,把空間信息加入到分類器中,將有利於提高分類器的准確率。
適應 Spatialboost 算法可以同時利用紋理特征以及子塊在空間上的聯系,在訓練過程中,將紋理特征和空間信息自適應的結合起來訓練分類器。這樣,當前處理的子塊的分類結果不僅依賴於它自己的紋理特征,還和它周圍子塊的分類結果密切相關。當屬於背景的圖像子塊的紋理特征很接近於屬於二維條形碼的圖像子塊時,我們還是可以依靠和它相鄰的背景子塊來對它做出正確的分類。
四、后處理
經過特征提取和特征分類兩個模塊后,我們得到了對圖像子塊的分類結果,但最后我們期望得到的是對二維條形碼的包圍盒。在我們的設置下,自適應Spatialboost 分類器對背景子塊的分類相當嚴格,此時對屬於二維條形碼的圖像子塊會有部分漏檢發生,如圖 3-4。
因此在后處理模塊中,我們先使用一種自適應聚類算法,對分類后的結果進一步改進,來精確的覆蓋整個二維條形碼。特征分類后定位到的子塊的大小為 25×25,我們把這些子塊再划分為 10×10 的小方塊。接着以得到的 10×10 的子塊為種子,用子塊灰度值的方差為衡量標准往外聚類,聚類時的閾值設定為:
其中 M 是聚類開始時作為種子的子塊的個數,k 為調整系數,在本文算法中 k設置為 0.5,Var 和 Mean 分別表示子塊灰度值的均值和方差。由公式(3-1)可知,每幅圖像的聚類閾值是自適應的計算得來的。聚類開始時首先從種子子塊出發,計算它們周圍的子塊的灰度值方差,如果大於聚類閾值就把它標識為屬於二維條形碼,重復這個過程直到周圍再沒有子塊符合聚類條件。圖 3-5 是聚類算法的部分結果,第一行的圖像是特征分類后的結果,准確的定位到了一部分二維條形碼,但是沒有完全的覆蓋整個二維條形碼,不利於我們輸出最后的定位包圍盒。第二行為聚類后的結果,可以看到小塊幾乎完全覆蓋了整個二維條形碼,此時再把這些小塊合並為一個平行四邊形就很方便了。
聚類后定位出來的小塊基本上覆蓋了整個二維條形碼,最后我們只需要把定位出的小包圍盒合並為大包圍盒,並輸出最后的定位結果。整個后處理流程見圖 3-6。
參考文獻:郝雲峰. 復雜背景下二維標記圖像的檢測[D]. 上海交通大學, 2008.