Face detector

Robust Real-Time Face Detection;Paul viola 和 Michael J Jones;

  • 速度提升方面:利用積分圖像來提取圖像特徵值,所以非常快。同時,利用adaboost分類器的特徵篩選特性,保留最有用特徵,這也減少了檢測時的運算複雜度。
  • 準確率提升方面:將adaboost分類器進行改造,變成級聯adaboost分類器,提高了人臉檢測的準確率(降低漏檢率和誤檢率)。

檢測率:存在人臉並且被檢測出的圖像在所有存在人臉圖像中的比例。

漏檢率:存在人臉但是沒有檢測出的圖像在所有存在人臉圖像中的比例。

誤檢率:不存在人臉但是檢測出存在人臉的圖像在所有不存在人臉圖像中的比例。

FPR:false positive rate,假陽性率,即FP/(FP+TN),即所有不存在人臉圖像被錯分那一部分的比例,也就是誤檢率。

TPR:true positive rate,真陽性率,即TP/(TP+FN),即所有存在人臉圖像被正確分類的那一部分的比例,也就是檢測率。

整個步驟如下:

1.特徵提取

論文中一共設計了四種特徵,叫做haar-like feature分別是下面圖1中的四種,後來的學者又設計了更豐富的類似特徵,如圖2。

圖1 圖2

這些特徵都很簡單,就是分別將白色和黑色區域中的所有像素相加,然後做差。例如圖1中的A特徵,首先計算兩個區域像素和Sum(white),Sum(black).然後計算feature=Sum(white)-Sum(black)。但是考慮到多尺度問題,即利用不同大小的掃描窗口去檢測不同大小的人臉,這個特徵feature應該需要歸一化。即最終特徵:feature`=feature/pixel_numpixel_num是黑色/白色區域的像素點個數。這樣一來,即使掃描窗口的大小不一樣,得到的人臉對應位置的特徵值也能基本一致。另外,說一下爲啥這個叫haar-like。因爲在haar-wavelet中,haar基函數是下面這樣一個東西。

圖3

想象一下,如果把這個一維函數,擴展成二維的,那上面的A特徵不就是用一個二維的haar基函數與圖像每個像素點相乘得到的嗎?其他的特徵,也可是看做haar基函數不同尺度的二維擴展。

接下來介紹積分圖像(Integral Image),首先假設有一幅圖像img,它的積分圖像iimg的每個點(x,y)的值等於(0,0,x,y)所表示的矩形中img所有像素點的和。即:

formula1而積分圖像iimg的計算很簡單,時間複雜度爲m,n分別是圖像的長寬。計算完成iimg之後,如果我想要求任意矩形區域的像素和,就不再需要重複計算像素累計值,利用iimg即可,例如:計算(a,b,c,d)區域的sum值,用如下公式即可

 

這樣一來,上面所說的haar-like特徵中需要計算的黑白區域的像素和只需要三次加減運算即可完成。因此,任何一維特徵的提取只需要常數次運算。所以利用Integral Image可以很容易的計算上面所描述的特徵。

最後,說說如何在一幀圖像中提取這種特徵。首先選定檢測窗口的大小(這個可以是多尺度的,比如24*24,36*36等等),就拿24*24來說,利用這個窗口對整個圖像進行滑動,每滑動到一個位置,就在窗口中提取一堆haar-like特徵,至於在哪個位置提取什麼尺寸的特徵,論文中沒有說明,這個挺符合微軟研究院的風格的,他們很少給出完整的framework,不過後來也有很多學者對於這個問題進行了研究,所以這點不太重要。總而言之,按照論文裏面說的,一個24*24的窗口,大概可以提取160000維特徵。

同時,論文中也說了,上述的haar-like特徵,雖然在表達能力上很弱,但是由於維數比較大,是overcomplete的,這也算是對其表達能力進行了補充。另外,爲了檢測不同尺寸的人臉,之前的檢測系統通常是把輸入圖像做成圖像金字塔(圖像按照尺寸從大到小的一組),然後檢測窗口大小不變。Viola-jones則相反,他們保持輸入圖像尺寸不變,讓檢測窗口的尺寸不斷調整。因爲窗口的調整比起圖像的調整要方便的多,這也節省了大量的時間。

 

 

2. Adaboost分類器介紹

 

由於160000維特徵也是個大數目,因此論文中假設,這些特徵中只有一小部分是有用的,主要的問題就轉化成了如何尋找這一小部分有用的特徵。Adaboost分類器當然是一個非常合適的選擇,因爲這種分類器具有特徵選擇能力。Adaboost的原理就是構造一個由多個弱分類器並聯成的強分類器,每個弱分類器都根據自己的準確率將自己的分類結果乘以權值,最後的輸出是所有若分類器輸出的加和。每個弱分類器的分類準確率可以很低,但是整個強分類器的準確率卻會很高。有關adaboost分類器的具體公式和推導,可以參看我最後附的word文檔,在此不作更詳細的說明。

 

3. 級聯Adaboost(cascade of classifiers

然而,如果僅僅使用傳統的adaboost分類器,還是太耗時了,假如我們僅保存前200維最有效的特徵。那麼對於檢測窗口滑動到的每個位置,都需要提取200維特徵,並且計算這200維特徵輸入到adaboost分類器中計算出的結果,這大概需要200次乘法和200次加法。考慮到檢測窗口可以滑動到的位置以及不同尺度,檢測算法的整體計算量還是比較大的。因此,論文對於adaboost分類器進行了創造性的改造,作者將若干個小的adaboost分類器級聯起來,並且讓每一級的分類器,都具有非常高的檢測率(99.9%,接近100%),同時誤檢率也保持相當高(大概50%,即fpr)。那麼,如果我們級聯20個這樣的小adaboost分類器,人臉的漏檢率僅僅有:

 

誤檢率僅僅有:

可見,這是一個準確率非常高的人臉檢測器,同時,一旦在某一級分類器中,檢測出不是人臉,人臉檢測立刻終止。因爲圖片中有人臉的部分只佔很小的比例,所以檢測窗口在大部分位置和尺度上都可以很快就停止檢測。這種人臉檢測策略的速度比起上面所說的200個特徵的原始adaboost分類器要快得多。(注意,每個小adaboost分類只有幾維或幾十維特徵)

 

4. 如何訓練cascade of classifiers

 

論文中給出了一種很簡單但是很有效的方法。

1.用戶選定每一層的最大可接受誤檢率f(maximum acceptable rate of fpr和每一層的最小可接受的檢測率d(minimum accpetable detection rate)

2.用戶選擇整體的

3.初始化:總體,D指的是檢測率,循環計數器i=0

4.循環:如果當前大於,繼續添加一層adaboost分類器。

5.在訓練當前層分類器時,如果目前該層的特徵性能沒有達到該層的標準,則繼續添加新的特徵。添加新特徵時,持續降低該特徵的閾值,直到該層分類器的檢測率,然後更新

6.需要注意的是,每一級分類器使用的訓練集中的負樣本,都是上一級被錯分的,即false positive,假陽性。這使得下一級分類器更加關注那些更難的(容易被錯分的)樣本。最後,如果檢測到多個重疊的人臉位置,則將檢測矩形框合併。

 

參考文獻:

Robust Real-Time Face Detection,Paul Viola,Micheal J. Jones

AdaBoost



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章