對於人臉識別這種型別的應用來說,通常都會分為幾個步驟:
人臉檢測(face detection)。檢測到人臉所在的區域。並進行一系列的矯正。
人臉校準(face alignment)。人臉校準指的是在中尋找到鼻子、眼睛、嘴巴之類的位置。
如圖中,紅色的框是在進行檢測,白色的點是在進行校準。
資訊識別(info recognition)。進行性別、年齡等資訊的分析和識別。
這三個問題可以說每乙個都是乙個非常廣泛的研究領域,有很多值得做的工作。本文只做一些簡單的介紹。
傳統的人臉檢測演算法是viola-jones演算法。在opencv中的人臉檢測功能也是使用的這種演算法。它有三個核心步驟:haar-like特徵、adaboost分類器和cascade級聯分類器。
所謂haar-like特徵其實很好理解。haar-like特徵類似於下圖:
而所謂的haar-like的特徵值就是圖中白色的畫素值求和,求和之後與黑色的畫素值做差得到的。即
feature=sum(white)-sum(black)
但是在一幅圖中這樣的特徵是非常多的。根據viola-jones的**,一幅24*24的圖中這樣的haar-like特徵就會達到18萬種之多(具體的計算方式我們以後再說)。所以我們可以引入積分圖(integral image)技術。積分圖是一張與原影象大小完全相同的,不同之處在於其每一點的畫素值是其左上角所有畫素值的和。如圖
在這樣一幅圖中,我們記某一點的畫素值為ii(x),則當我們想要計算d區域中所有畫素和時,使用ii(4)-ii(2)-ii(3)+ii(1)即可。這就可以大大減少計算時間,提公升效率。
有了特徵,想要得到區分函式是非常容易的。常見的svm方法和knn方法都是可以做到的。但儘管本身的計算並不複雜,但haar特徵還是太多了。尤其現在解析度動輒成千上萬。從這些特徵中選取合適的特徵就非常重要。從工程中得到的實踐結果是,我們可以通過結合很多個弱分類器從而組合成乙個強分類器。這就是adaboost方法。用數學的方式就可以表示為:
f(x) =σαf(x)
其中f為強分類器,f為弱分類器。x是特徵向量,α為權重。adaboost是一種序列化的方式,需要經過很多步。舉個例子來看。
在上圖中,每個資料點都有乙個類別的標籤,不妨設紅色為1,綠色為-1。每個資料點也有乙個權重wt。初始權重均為1。
我們不妨先隨意分一下看看。
看上去錯誤的還挺多的。我們可以經過幾次平移選乙個相對比較好的。雖然看上去就和亂分差不多。
這是只有乙個線性劃分函式的情況下比較好的結果了,但是仍然有很多錯誤的結果,我們不妨把它們的權重加大。
這個時候就發現了乙個新的問題,類似地,我們把現在的權重情況下的資料點進行分類。
之後再加大劃分錯誤的點的權重,並再次進行劃分。
反覆數次後就可以在數個線性分類器(或者說弱分類器)的基礎上,構造乙個非線性的分類器(強分類器)。而且這個分類器還比較好地完成了分類的任務。
渣渣我還做了個gif展示效果。
adaboost
在vj方法中的第三個亮點就是使用了級聯分類器。簡單來說,就是先將幾個通過adaboost方法得到的強分類器進行排序,排序原則是簡單的放在前邊。因為通常來說人臉只佔一小部分,所以可以很放心地在前幾層分類器就拒絕掉大部分非人臉區域。只要前一級拒絕了,就不在進入下一級分類器,這可以大大提高速度。其本質是一顆退化決策樹。
cascade classifier
在viola和jones的**中,共建立了38層分類器來檢測正面的人臉。使用了4916張人工標記的人臉,並調整到了24*24的解析度。測試結果如下:
results
results-2
opencv之分類級聯器 人臉檢測
分類器逐級篩選最終選定人臉,可以通過haar積分 lbp檢測方法實現,opencv已經實現現成的分類其我們可以拿來直接使用。分類器存放在 linux環境下 opencv原始碼編譯路徑下的share opencvx haarcascades路徑下的.xml檔案 haarcascade eye.xml ...
基於OpenCV級聯分類器的人臉檢測
使用級聯分類器訓練人臉模型 作為乙個大四狗,在畢業之前想做點有意思的東西,加上人工智慧這兩年很火,也就從網上找資源,進行了乙個學習的過程,使用的平台是qt5.12 opencv3.40。目的就是為了訓練乙個可以進行人臉檢測的模型。跟著賈志剛老師的課程學了一段時間以後,自己也就找專案去練手去了。不過在...
使用 Haar 級聯人臉檢測
haar 級聯概念 在進行影象分類和跟蹤過程中,提取影象的細節很有用,這些細節也被稱為特徵,對於給定的影象,特徵可能會因區域的大小而有所不同,區域大小也可被稱為視窗大小。即使視窗大小不同,僅在尺度上大小不同的影象也應該有相似的特徵。這種特徵集合被稱為級聯。haar 級聯具有尺度不變性。opencv ...