CV筆記10:人臉檢測之Haar-like特徵


一、背景介紹

我們會經常聽到人臉檢測和人臉識別這兩個名詞,但是你真的分清了他兩者的含義了嗎?簡單地講,人臉檢測的目標就是將圖像中的人臉位置進行標記,通常使人臉位置以矩形框(bounding box)的形式給出,也就是說人臉識別就是找出圖像中的人臉。在人臉識別中,其目標是判斷圖像中的人臉到底是哪一個人的,通常人臉識別包含了人臉檢測步驟,也就是我先找出來圖像中的人臉,再判斷這個人臉是誰。
下面簡單說明一下人臉檢測的大體流程和思路,該流程思路其實爲傳統目標檢測的具體化應用,也可以移植應用在其他的目標檢測場景中,唯一不同的就是檢測的具體目標不一樣而已。例如,我可以將檢測的目標換成小貓、小狗等。

1.1 人臉檢測分類器訓練流程

  • 構建人臉數據庫,其中包含人臉的正負樣本:
    <1> 正樣本:包含我們想要檢測的人臉樣本
    <2> 負樣本:不含有人臉的樣本,如衣服、牆壁等的圖片
  • 使用正負樣本進行訓練,得到二分類器
  • 分類器接受固定大小的輸入圖像,並判斷輸入的圖像是否爲人臉

1.2 人臉檢測測試樣例檢測流程

經過上面的訓練,我們已經得到了一個人臉的分類預訓練模型,能夠檢測圖片是否含有人臉,這裏強調一點,預訓練模型中使用的訓練圖像一般和需要檢測的圖像存在較大的差異:訓練集一般就是一張圖像含有一張人臉,如下面的灰度圖中人臉數據集;待檢測圖像就可能裏面含有很多個人臉,如下面的THE9圖片。
在這裏插入圖片描述
那麼對於一張預訓練模型未曾見過的待檢測圖像,又是如何進行檢測的呢?如上面的THE9圖片中,由於人臉可能出現在圖像的任何位置,在檢測時我們可以使用滑動窗口算法,用大小固定的窗口對圖像從上都下、從左到右進行掃描,判斷每一個掃描框中的子圖是否爲人臉。同時,爲了實現檢測不同大小的人臉,可以縮放掃描窗口或縮放圖像、構造圖像特徵金字塔等,對縮放後的圖像使用滑動窗口進行掃描。

1.3 人臉檢測使用的特徵

通過上面的講解,已經大致瞭解的人臉檢測的流程,但在使用上面的流程進行人臉檢測時,我們往往會對圖像進行特徵提取,而並不是直接使用原始的訓練圖像或測試時每一個掃描框中的子圖進行人臉檢測。因此我們也能夠得到下面的人臉檢測流程:
在這裏插入圖片描述
在人臉檢測中,我們能夠提取多種不同的特徵用於檢測,像LBP特徵、Hog特徵等,但是在本文我們主要講解Haar-Like特徵。

二、Haar-Like特徵

在2001年,Viola和Jones提出使用積分圖計算Haar-Like特徵,使用級聯的AdaBoost分類器構造檢測器,並進行人臉檢測的方法,該方法和之前的方法在檢測速度和精度上都得到了提高,其流程如下:

  • 計算積分圖
  • 根據積分圖,計算Haar-Like特徵值
  • 使用AdaBoost訓練強分類器
  • 講多個強分類器級聯,得到級聯分類器,進行人臉檢測

2.1 Haar特徵介紹

Haar-Like具有以下的簡要特徵:

  • 特徵模板內有白色和黑色兩種矩形
  • 模板的特徵值 == 白色區域內像素值的和 - 黑色區域內像素值的和 (一般公式)
  • Haar-Like特徵值反映了圖像的灰度變化情況

Haar(哈爾)特徵分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。下圖展示了基本的Haar特徵。
在這裏插入圖片描述
對於圖中的A, B和D這類特徵,特徵數值計算公式爲:v=ΣΣv=Σ_白-Σ_黑,而對於C來說,計算公式如下:v=Σ2×Σv=Σ_白-2×Σ_黑;之所以將黑色區域像素和乘以2,是爲了使兩種矩形區域中像素數目一致。如下圖,ΣΣ_白爲所有青色區域內像素值的和,ΣΣ_黑爲所有紫色區域內像素值的和。
在這裏插入圖片描述
Haar-Like思想是臉部的一些特徵能由矩形特徵簡單的描述,如:眼睛要比臉頰顏色要深,鼻樑兩側比鼻樑顏色要深。同樣對於其他目標,如眼睛等,也可以用一些矩形特徵來表示。我們希望當把矩形放到人臉區域計算出來的特徵值和放到非人臉區域計算出來的特徵值差別越大越好,這樣就可以用來區分人臉和非人臉。並且使用特徵比單純地使用像素點具有很大的優越性,並且速度更快。
在這裏插入圖片描述
R.Lienhart和J.Maydt對Haar特徵進行擴展,如下圖,從而實現了更多特徵提取的可能。但是,這種矩形特徵只能對一些簡單的圖形結構,像邊緣、線段比較敏感。
在這裏插入圖片描述
在實際的應用中,通過改變特徵模板的大小和位置,可在圖像子窗口中窮舉出大量的特徵。上圖的特徵模板稱爲“特徵原型”;特徵原型在圖像子窗口中擴展(平移伸縮)得到的特徵稱爲“矩形特徵”;矩形特徵的值稱爲“特徵值”。矩形特徵可位於圖像任意位置,大小也可以任意改變,所以矩形特徵值是矩形模版類別、矩形位置和矩形大小這三個因素的函數。故類別、大小和位置的變化,使得很小的檢測窗口含有非常多的矩形特徵,如:在24*24像素大小的檢測窗口內矩形特徵數量可以達到16萬個。所以直接使用模板計算,會產生很大的計算量。

2.2 haar特徵計算之積分圖

爲了能夠快速的計算Haar特徵,積分圖就展示了其強大。積分圖就是隻遍歷一次圖像就可以求出圖像中任一矩形區域像素和的快速算法,大大的提高了圖像特徵值計算的效率。如下圖所示,積分圖上的點(x,y)(x,y)的值等於圖像左上角到點(x,y)(x,y)構成的矩形區域內所有點的像素值之和。
在這裏插入圖片描述
我們使用ii(i,j)ii(i,j)表示積分圖上(i,j)(i,j)處的值,用f(k,l)f(k,l)表示原圖像在點(k,l)(k,l)的像素值,則可以得到積分圖的公式:
ii(i,j)=kiljf(k,l)ii(i,j)=∑_{\begin{matrix}k≤i \\ l≤j \end{matrix}}f(k,l)因此可以得到如下的積分圖計算方法:

  • 使用ii(i,j)ii(i,j)表示積分圖在點(i,j)(i,j)的值,初始化ii(1,j)=0ii(-1,j)=0
  • 使用s(i,j)s(i,j)表示圖像第ii行、第0至jj列像素的累加和,初始化s(i,1)=0s(i,−1)=0
  • 逐行掃描圖像,遞歸計算每個點(i,j)(i,j)的累加和s(i,j)s(i,j)和積分圖像ii(i,j)ii(i,j)的值:s(i,j)=s(i,j1)+f(i,j)s(i,j)=s(i,j-1)+f(i,j) ii(i,j)=ii(i1,j)+s(i,j)ii(i,j)=ii(i-1,j)+s(i,j)
  • 從左上角到右下角,按從左到右,從上到下的順序掃描一遍圖像,便計算完了圖像對應的積分圖

當得到積分圖之後,對與圖像中任何矩陣區域像素累加和都可以通過簡單運算得到,如圖所示:
在這裏插入圖片描述
其中,A、B、C、D表示4個矩形區域,1、2、3、4表示D區域的4個頂點,那麼D區域像素值的累加和爲:Dsum=ii(1)+ii(4)ii(2)ii(3)D_{sum}=ii(1)+ii(4)-ii(2)-ii(3)我們以下圖爲例,體會計算過程:
在這裏插入圖片描述
圖中,A、B、C、D表示4個矩形區域,1、2、3、4表示D區域的4個頂點,有:ii(1)=49ii(2)=96ii(3)=88ii(4)=157ii(1)=49\qquad ii(2)=96 \qquad ii(3)=88 \qquad ii(4)=157D區域的像素值累加和爲:Dsum=ii(1)+ii(4)ii(2)ii(3)=49+1579688=22D_{sum}=ii(1)+ii(4)-ii(2)-ii(3)=49+157-96-88=22所以,對於Haar特徵的計算過程如下,以邊緣特徵爲例:
在這裏插入圖片描述
D(white)=8+621433=23D(white)=8+62-14-33=23D(black)=8+621433=25D(black)=8+62-14-33=25Haar特徵值爲:D(white)D(black)=2325=2D(white)-D(black)=23-25=-2所以,矩形特徵的特徵值,只與特徵矩形的端點的積分圖有關,而與圖像的座標無關。通過計算特徵矩形的端點的積分圖,再進行簡單的加減運算,就可以得到特徵值,正因爲如此,特徵的計算速度大大提高,也提高了目標的檢測速度。

2.3 Haar特徵的含義及歸一化處理

Haar特徵含義:
瞭解了特徵值的計算之後,我們來看看不同的特徵值的含義是什麼。我們選取MIT人臉庫中2706個大小爲20×2020×20的人臉正樣本圖像,計算如下圖所示的Haar特徵:
在這裏插入圖片描述
其中,左邊的特徵對應人眼區域,右邊特徵沒有具體意義。
在這裏插入圖片描述
可以看到,圖中2個不同Haar特徵在同一組樣本中具有不同的特徵值分佈,左邊特徵計算出的特徵值基本都大於0(對樣本的區分度大),而右邊特徵的特徵值基本均勻分佈於0兩側(對樣本的區分度小)。所以,正是由於樣本中Haar特徵值分佈不均勻,導致了不同Haar特徵分類效果不同。顯而易見,對正負樣本區分度越大的特徵分類效果越好,即紅色曲線對應圖中的的左邊Haar特徵分類效果好於右邊Haar特徵。
那麼看到這裏,應該理解了下面2個問題:
(1)在檢測窗口通過平移+縮放可以產生一系列Haar特徵,這些特徵由於位置和大小不同,分類效果也不同;
(2)通過計算Haar特徵的特徵值,可以有將圖像矩陣映射爲1維特徵值,有效實現了降維。
Haar特徵歸一化:
從上圖我們可以發現,僅僅一個12×812×8大小的Haar特徵計算出的特徵值變化範圍從-2000~+6000,跨度非常大。這種跨度大的特性不利於量化評定特徵值,所以需要進行“歸一化”,壓縮特徵值範圍。假設當前檢測窗口中的圖像像素爲i(x,y)i(x,y),當前檢測窗口爲w×hw×h大小(例如上圖中爲20×2020×20大小),OpenCV採用如下方式“歸一化”:
1、計算檢測窗口中圖像的灰度值和灰度值平方和:
sum=i(x,y)sum=\sum i(x,y)sqsum=i2(x,y)sq_{sum}=\sum i^2(x,y) 2、計算平均值:mean=sumwhmean = \frac{sum}{w*h}sqmean=sqsumwh sq_{mean}=\frac{sq_{sum}}{w*h}3、計算歸一化因子:varNormFactor=sqmeanmean2varNormFactor=\sqrt{sq_{mean}-mean^2} 4、歸一化特徵值:normValue=featureValuevarNormFactornormValue=\frac{featureValue}{varNormFactor}之後使用歸一化的特徵值𝑛𝑜𝑟𝑚𝑉𝑎𝑙𝑢𝑒與閾值對比。

三、後續

在第二節我們講了可以使用級聯分類器進行人臉檢測,對於什麼是級聯分類器,本文只做簡單的介紹:
在這裏插入圖片描述
如上圖,每一個數字圓圈代表一個強分類器,並以此連接起來。在人臉檢測的過程中,只有當檢測窗口被所有的強分類器都判定爲人臉時,才認爲這個檢測窗口真的是人臉,若在檢測過程中,有一個強分類器判定當前的檢測窗口不是人臉,都會將該檢測窗口判定爲nonface,不再傳遞給下一個強分類器。這個過程也加快了檢測速度,同時提高了檢測正確率。對於級聯分類器更詳細的說明可以參照《第九節、人臉檢測之Haar分類器》中的第五小節。當然級聯分類器不止能使用在人臉檢測中,依然能夠實現場景的移植使用。

參考

目標檢測算法-特徵提取之(一)Haar特徵
第九節、人臉檢測之Haar分類器

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