Viola-Jones人脸检测详解
在人臉檢測中,Viola-Jones算法是一種非常經(jīng)典的算法,該算法在2001年的CVPR上提出,因其高效快速的檢測而被廣泛使用。
這個算法用來檢測正面的人臉圖像,對于側(cè)臉圖像的檢測不是很穩(wěn)健。
算法可以被分為以下幾個部分:
- 利用Haar特征描述人臉特征
- 建立積分圖像,利用該圖像快速獲取幾種不同的矩形特征
- 利用Adaboost算法進(jìn)行訓(xùn)練
- 建立層級分類器
- 非極大值抑制
1?利用Haar特征描述人臉特征
人臉有一些特征,一張正臉圖像中,人眼睛區(qū)域會比臉頰區(qū)域暗,嘴唇區(qū)域也會比四周的區(qū)域暗,但鼻子區(qū)域會比兩邊臉頰要亮。
基于這些特征,VJ使用了四種矩形特征,如下圖所示
其中A,B為邊界特征,C為細(xì)線特征,D為對角線特征
那么,Haar特征是如何作用于正臉圖像的呢?
如上圖所示,Haar特征分別對白色區(qū)域和黑色區(qū)域的像素求和,然后求這兩種和的差;
這可以通過圖像卷積實(shí)現(xiàn)。
?
2 積分圖像
對于積分圖像中的任何一點(diǎn),該點(diǎn)的積分圖像值等于位于該點(diǎn)左上角所有像素之和
表達(dá)式如下:
積分圖像滿足如下公式:
積分圖像同時還滿足:
上圖為一張?jiān)紙D像,其標(biāo)示了四個區(qū)域:A, B , C ,D
1 處像素點(diǎn)對應(yīng)的在積分圖像中的值為:sum(A);
2 處像素點(diǎn)對應(yīng)的在積分圖像中的值為:sum(A+B);
3 處像素點(diǎn)對應(yīng)的在積分圖像中的值為:sum(A+C);
4 處像素點(diǎn)對應(yīng)的在積分圖像中的值為:sum(A+B+C+D);
則:
區(qū)域D所有的像素點(diǎn)灰度值之和為:
sum(A+B+C+D) - sum(A+C) -?sum(A+B) +?sum(A)
?
3 獲取圖像特征
VJ在論文中提到,24*24大小的圖像可以產(chǎn)生約160000個矩形特征,那么160000是怎么得到的呢?
VJ使用的矩形特征可以歸為三類:
二鄰接矩形,橫豎兩種情況,如矩形特征A,B,最少需要2個像素點(diǎn)表示
三鄰接矩形,如矩形特征C,最少需要3個像素點(diǎn)表示,也有橫豎兩種情況
四鄰接矩形,如矩形特征D,最少需要4個像素點(diǎn)表示,只有一種情況
對于24*24大小的圖像,每種鄰接矩形可能的大小為:
二鄰接矩形(最小1*2):長度每次加2,寬度加1
1*2,1*4,1*6,...1*24
2*2,2*4,2*6,...,2*24
...
24*24
三鄰接矩形(最小1*3):長度加3,寬度加1
1*3,1*6,1*9,...1*24
2*3,2*6,2*9,...,2*24
...
24*24
四鄰接矩形(最小2*2):長度加2,寬度加2
2*2,2*4,2*6,...1*24
4*2,4*4,4*6,...4*24
...
24*24
根據(jù)圖像卷積,一個W*H的圖像與m*n的filter卷積,得到的圖像大小為:(W-m+1)*(H-n+1)(默認(rèn)stride為1)
新圖像的每一個像素點(diǎn)的值就是原圖一個m*n的local patch 與m*n的filter的乘積和。
新圖像有多少個像素點(diǎn),原圖就有多少個m*n的矩形。
這么多矩形,可以通過編程算出,借用未雨綢繆的代碼。
這段代碼中,橫豎矩形窗口的數(shù)量是一樣的,代碼里只計(jì)算一種,然后乘以2就行了。
import numpy as npa = np.zeros((3, 2), dtype=int) Count = np.zeros(3, dtype=int) a[0, :] = [1, 2] a[1, :] = [1, 3] a[2, :] = [2, 2] Img_size = 24for ii in range(3):rec_h = a[ii, 0]rec_w = a[ii, 1]for xx in range(rec_h, Img_size+1, rec_h):for yy in range(rec_w, Img_size+1, rec_w):Count[ii] = Count[ii]+(Img_size-xx+1)*(Img_size-yy+1)print Count[ii]Total = Count[0]*2+Count[1]*2+Count[2] print ("Total: ", Total)最后可以得到:
二鄰接矩形:43200
三鄰接矩形:27600
四鄰接矩形:20736
最終總的矩形特征為:43200×2+27600×2+20736=162336
所以一個24*24的圖像最終可以產(chǎn)生162336個矩形特征。
并不是所有特征都是有用的,那么如何提取出有用的特征呢?
AdaBoost特征分類器具有特征選擇的能力。
?
4?利用AdaBoost算法進(jìn)行訓(xùn)練
4.1 AdaBoost分類器
AdaBoost 將一系列的弱分類器通過線性組合,構(gòu)成一個強(qiáng)分類器,如下所示:
是一個強(qiáng)分類器,是一個弱分類器,其為一個簡單的閾值函數(shù):
為閾值,,為系數(shù)。
4.2 訓(xùn)練弱分類器
計(jì)算所有訓(xùn)練樣本的特征值,并將其從小到大排序,隨機(jī)選取一個特征值作為閾值,
把所有元素分為兩部分,小于閾值的一部分分類為人臉,大于閾值的一部分分類為非人臉。
如下圖所示,紅色表示人臉,藍(lán)色表示非人臉。
假如有5個樣本,前兩個為人臉,后三個為非人臉,用11000表示。
如果閾值在第一個之前,通過弱分類器判定為:00000,有兩個誤差,
如果閾值在第一個和第二個之間,通過弱分類器判定為:10000,有1個誤差,
如果閾值在第二個和第三個之間,通過弱分類器判定為:11000,有0個誤差,
依次類推,這樣共有6個誤差,然后從中找到一個誤差最小的當(dāng)成閾值,
這樣就訓(xùn)練好了一個最優(yōu)的弱分類器。
4.3?訓(xùn)練強(qiáng)分類器
假設(shè)有N個訓(xùn)練樣本,其中有個正樣本,個負(fù)樣本,如果是人臉圖像,
則, 否則
其步驟如下:
每一級分類器使用的訓(xùn)練集中的負(fù)樣本,都是上一級被錯分的,即false?positive,誤檢率或假陽性。
這使得下一級分類器更加關(guān)注那些更難的(容易被錯分的)樣本。
?
5 級聯(lián)分類器(cascade of classifiers)
在正常的圖像中,人臉區(qū)域只是占了很小的一部分,如果使用所有的特征進(jìn)行訓(xùn)練的話,運(yùn)算量非常大。
級為了簡化任務(wù),把若干個adaboost 分類器級聯(lián)起來,一開始使用少量的特征將大部分的非人臉區(qū)域剔除掉,后面再利用更復(fù)雜的特征將更復(fù)雜的非人臉區(qū)域剔除掉。
如果級聯(lián)分類器的識別率(true positive rate)為D,誤識率(false positive rate)為F,?
第? 層的分類器的識別率為, 誤識率為,
則:
其中: K 為分類器的個數(shù)
假如每一級的分類器,都具有非常高的檢測率(99.9%),
同時誤檢率也保持相當(dāng)高(50%)。
那么,如果級聯(lián)20個這樣的小adaboost分類器,
人臉的識別率有:
但是誤檢率有:
5.1 級聯(lián)分類器的訓(xùn)練
論文中給出了一種很有效的方法
- 設(shè)定每一層最大的可接受誤檢率?f, 和每一層最小的檢測率 d.
- 設(shè)定級聯(lián)分類器的總體誤檢率
- 初始化總體誤檢率為,識別率,循環(huán)計(jì)數(shù)器 i=0
- 循環(huán),如果當(dāng)前 F 大于??時,繼續(xù)增加一層adaboost分類器
- 在訓(xùn)練每一層分類器時,如果目前該層的特征沒有達(dá)到該層的??標(biāo)準(zhǔn),繼續(xù)添加新的特征。添加新特征時,持續(xù)降低該特征的閾值(一般而言,高閾值的分類器的檢測率和誤檢率都會比較低),直到該層分類器的檢測率,然后更新
在論文中,VJ分類器一共有38層,含有6060個特征,前7層的特征數(shù)為:2->10->25->25->50->50->50
?
6 非極大值抑制(NMS)
在人臉識別中,一張臉會出現(xiàn)非常多的窗口,如下圖所示:
假設(shè)有N個窗口,根據(jù)分類器的分類概率從小到大排序,概率最大的框記為Z
非極大值抑制的工作步驟如下:
- 從最大概率矩形框Z開始,分別判斷其它框與X框的重疊度是否大于設(shè)定的閾值
- 假設(shè)其中的B,C框超過了閾值,就扔掉B,C,并保留Z框
- 從剩下的矩形框中,選擇概率最大的(假設(shè)為Y),然后判斷其它框與X框的重疊度是否大于設(shè)定的閾值,大于扔掉,并保留框Y
- 一直重復(fù)這個過程,直到最后一個框
論文中有些地方不夠詳細(xì),可能比較符合微軟研究院的風(fēng)格吧。
相關(guān)鏈接
論文傳送門:Viola-Jones人臉檢測
AdaBoost算法:集成算法-AdaBoost
?
本文參考了論文原文和網(wǎng)上的資料,是筆者自己對Viola-Jones算法的理解,可能會有些偏差,請讀者指正。
總結(jié)
以上是生活随笔為你收集整理的Viola-Jones人脸检测详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: resnet系列+mobilenet v
- 下一篇: seaborn的一些画图