01- 基於機器學習的物體檢測方法
物體檢測就是對數字影象中一類特定的物體的位置進行自動檢測。基本的檢測框架有兩種:
一種是以滑動視窗為單位對影象進行掃描,對掃描所得的每個子影象提取特徵,並用學習到的分類器來分類該特徵並且判斷該子影象是否為所檢測的特定物體。物件檢測的一個問題是,物件在圖片中的位置和尺度是未知的。演算法被要求能夠檢測各種不同位置、不同大小的物件,這樣的特性被稱為位置無關性和尺度無關性。為了達到這樣的特性,常見的方法是使用多尺度框架,即:通過縮放原始影象,產生一組大小不同的影象序列,然後在序列的每幅影象中都使用固定尺寸 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.