1. 程式人生 > >10年後再看Robust Real-Time Face Detection(二) 之學習分類函式

10年後再看Robust Real-Time Face Detection(二) 之學習分類函式

給定我們一個特徵集合, 一個訓練樣本集(也就是一幅幅樣本影象。 影象可能是有人臉的影象(稱為positive images), 影象也可能不含人臉的影象(negative images))。 那麼我們的任務就是採用機器學習的演算法學習一個分類函式。一旦學習到了這個函式, 我們就可以利用這個函式對一幅未知的影象進行分類了。 在機器學習領域中稱為監督學習。

然而, 問題是, 對於每一個影象子視窗(each image sub-window), 我們都能夠計算出與之相關的160,000個矩形特徵,數目遠遠超過了視窗內畫素的個數。 也就是這個視窗對應的特徵向量的維數是相當大的。 儘管我們利用積分圖能夠很快地計算出矩形特徵, 然而要計算如此大數目的矩形特徵顯然代價也是很昂貴的, 同時也是沒必要的, 吃力不討好。

這裡, 我們利用實驗上的一個假設, 就是我們可以從160,000個特徵中只選擇其中少量數目的特徵, 用這些少量的, 高效的特徵組建很有效的分類器。 這個主意很不錯, 然而接下來, 我們就面對一個主要的挑戰, 那就是如何從這麼多的特徵中, 選擇出這些少量的, 具有點石成金作用的特徵呢??

這並沒有難倒大牛Viola Jones。 他解決這個問題的辦法就是採用了Adaboost演算法的一個變體(variant), 具體原理如下:

Adaboost學習演算法的主要思想就是採用一組弱分類器組合成一個強的分類器, 從而提高分類的效能。 弱分類器的優點就是簡單, 容易實現。 缺點就是“弱”, 也就是說弱分類器無法對我們的訓練資料做出準確的分類(例如, 一個弱分類器可能在51%的時間內能夠對一個訓練樣本做出準確的分類, 剩下的時間內可能對這個樣本誤分)。當第一個弱分類器實現對所有的訓練樣本分類後, 我們從這一級類器產生誤分的樣本選擇出來, 然後增大這些誤分樣本的權重(或者說提高其被下一級弱分類器選中的概率), 重點關照。 然後重新分類。依次進行下去,。。, 最終, 我們將所有的弱分類器組合起來, 加權平均, 設定一個閾值, 作為新的強分類器的Perceptron,  這樣我們就得到了一個強的分類器。

傳統的Adaboost 如何能夠幫助我們從如此大數量的矩形特徵中選擇出最佳特徵呢? 不難類比得到, 其實Adaboost很容易被我們看成是貪婪的選擇最佳特徵的過程(a greedy feature selection process)。試想, 傳統的Adaboost 其實就是通過採用一種貪婪的機制給好的分類函式更大的權重, 差的分類函式更小的權重, 然後組合起來, 最終我們得到了一個好的分流函式。在選擇最佳的特徵時候, 原理也是這樣的。 我們所需要做的就是將我們的弱分類器的分類函式限制為為只依賴於一個特徵的單變數函式。為了實現這個目標, 我們的弱學習演算法只選擇一個能夠最佳的分類出我們訓練樣本的矩形特徵(the single rectangle feature)。 對於每一個矩形特徵,  找到一個閾值, 從而使得我們的弱分類器能夠對我們的樣本實現最小的誤分率。 分類Perceptron函式如下:


其中, x 是影象的24 x 24畫素子視窗(或者是檢測子)。f是我們選擇的一個的矩形特徵,θ是我們找到的最佳閾值, p 代表記性(polarity), 表面不等式的方向。

事實上, 單單採用一個矩形特徵對這個子視窗分類的誤差是很大的。 能夠達到0.1 ——0.3.。 當然這是第一輪的情況。 第二輪的時候, 誤差達到了0.4——0.5。該演算法的虛擬碼如下: