在確定了選擇窗口的策略,設計好了提取特征的方式,并學習了一個針對人臉和非人臉窗口的分類器之后,我們就獲得了構建一個人臉檢測系統所需要的全部關鍵要素——還有一些小的環節相比之下沒有那么重要,這里暫且略去。
由于采用滑動窗口的方式需要在不同大小的圖像上的每一個位置進行人臉和非人臉窗口的判別,而對于一張大小僅為480*320的輸入圖像,窗口總數就已經高達數十萬,面對如此龐大的輸入規模,如果對單個窗口進行特征提取和分類的速度不夠快,就很容易使得整個檢測過程產生巨大的時間開銷,也確實就因為如此,早期所設計的人臉檢測器處理速度都非常慢,一張圖像甚至需要耗費數秒才能處理完成——視頻的播放速度通常為每秒25幀圖像,這給人臉檢測投入現實應用帶來了嚴重的障礙。
人臉檢測技術的突破:VJ人臉檢測器及其發展
人臉檢測技術的突破發生在2001年,兩位杰出的科研工作者Paul Viola和Michael Jones設計了出了一個快速而準確的人臉檢測器:在獲得相同甚至更好準確度的同時,速度提升了幾十上百倍——在當時的硬件條件下達到了每秒處理15張圖像的速度,已經接近實時速度25fps(即25幀每秒)。這不僅是人臉檢測技術發展的一個里程碑,也標志著計算機視覺領域的研究成果開始具備投入實際應用的能力。為了紀念這一工作,人們將這個人臉檢測器用兩位科研工作者的名字命名,稱之為Viola-Jones人臉檢測器,或者簡稱為VJ人臉檢測器。
VJ人臉檢測之所以器能夠獲得成功,極大地提高人臉檢測速度,其中有三個關鍵要素:特征的快速計算方法——積分圖,有效的分類器學習方法——AdaBoost,以及高效的分類策略——級聯結構的設計。VJ人臉檢測器采用Haar特征來描述每個窗口,所謂Haar特征,其實就是在窗口的某個位置取一個矩形的小塊,然后將這個矩形小塊劃分為黑色和白色兩部分,并分別對兩部分所覆蓋的像素點(圖像上的每個點稱為一個像素)的灰度值求和,最后用白色部分像素點灰度值的和減去黑色部分像素點灰度值的和,得到一個Haar特征的值。

Haar特征反映了局部區域之間的相對明暗關系,能夠為人臉和非人臉的區分提供有效的信息,例如眼睛區域比周圍的皮膚區域要暗,通過Haar特征就可以將這一特點表示出來。但是由于提取Haar特征時每次都需要計算局部區域內多個像素點灰度值之和,因此在速度上其并不快,為此VJ人臉檢測器引入了積分圖來加速Haar特征的提取。
積分圖是一張和輸入圖像一樣大的圖,但其每個點上不再是存放這個點的灰度值,而是存放從圖像左上角到該點所確定的矩形區域內全部點的灰度值之和。

積分圖所帶來的好處是兩方面的,一方面它使得每次計算局部區域像素點的灰度值之和僅需要做4次加減法,與局部區域的大小無關;另一方面它避免了在相同像素點上重復求和,只在最開始計算一次——相鄰的窗口有很大的重疊部分,對應的Haar特征也會重疊,如果每次都重新計算像素點的灰度值之和,則重疊部分的計算是重復的。積分圖極大地加速了Haar特征的提取,向快速的檢測器邁出了第一步。
除了特征提取,分類過程的速度對于檢測的速度也至關重要。分類的速度取決于分類器的復雜程度,也即從特征向量變換到類別標簽的計算過程的復雜程度。復雜的分類器往往具有更強的分類能力,能夠獲得更好的分類準確度,但是分類時的計算代價比較高,而簡單的分類器雖然計算代價小,但是分類準確度也較低。那么有沒有兼顧計算代價和分類準確度兩方面的辦法呢?當然有,這就是AdaBoost方法。希望計算代價小,所以只用簡單的分類器,但是又希望分類準確度高,于是把多個簡單的分類器組合起來——聚弱為強,將多個弱分類器組合成一個強分類器,這就是AdaBoost方法的核心理念。通過AdaBoost方法來學習分類器,達到了以更小的計算代價換取同樣的分類準確度的目的。