OpenCV人臉檢測原理 - AdaBoost分類

效果圖

閑扯:公司鼓勵創(chuàng)新,做了個皮膚檢測器,本來的想法是用手機(jī)外接wifi攝像頭,用攝像頭來拍攝皮膚圖像的,后來找了幾個wifi攝像頭的廠家,因價格沒談攏,就不用wifi攝像頭了,只用手機(jī)自帶的相機(jī)來獲取圖像。

下面我寫了個 demo 測試,如下圖

me

目前實(shí)現(xiàn)了皺紋,油份,水份的檢測算法,以后還想實(shí)現(xiàn)更多功能,比如痘痘數(shù)量,色斑檢測,年齡預(yù)測等等。


人臉檢測原理

人臉檢測就是要判斷一張圖像是不是人臉,以及人臉的位置。
一張大圖像由他的一張很小的子圖像窗口,以一定的倍數(shù)擴(kuò)大(比如每次擴(kuò)大 1.2 倍)暴力搜索,最終能確定位置。

判斷一張圖像是不是人臉,先提取圖像的 haar-like 特征值,交給 adaboost 算法,它能判斷是不是人臉。

提取圖片的 haar 特征

  • 為什么要提取 haar 特征?
    因?yàn)橐?adaboost 做分類,整張圖塞進(jìn)去計(jì)算量太大,提取一些主要的特征,能區(qū)分人臉非人臉就行。

  • 怎么提取 haar 特征?
    有大牛已經(jīng)給出方法了,看下面的模板,把模板放在圖像上,用 白色區(qū)域的灰度和 減去 黑色區(qū)域的灰度和,得到的數(shù)值就是其中一個 haar 特征,把模板在圖像上滑動,能計(jì)算出一組數(shù)值,例如(123, 234, -134, ...),這就是圖像的 haar 特征了。

  • 拓展:
    圖像區(qū)域快速求和,用積分圖,對原圖像進(jìn)行一次積分,就能在O(1)時間算出區(qū)域像素和,大概寫一下。

假設(shè)積分圖是 F(x, y),求 Rect(x, y, w, h) 區(qū)域和。
sum = F(x+w, y+h) - F(x+w, y) - F(x, y+h) + F(x, y)

// F(x, y) 表示 Rect(0, 0, x, y) 的區(qū)域和,f(x, y) 表示 (x, y) 灰度級
// 后面加上 + F(x, y) 是因?yàn)榘l(fā)現(xiàn) - F(x+w, y) - F(x, y+h) 減多了重疊的區(qū)域,所以就加回來。
// 生成積分圖的狀態(tài)轉(zhuǎn)移方程:
F(x, y) = f(x, y) + F(x-1, y) + F(x, y-1) - F(x-1, y-1)


AdaBoost 算法

先來一個感性的認(rèn)識。

每來一張圖片,提取其特征值 X,用 AdaBoost 算法能判斷出 X 是不是人臉。
AdaBoost 里面有很多個分類器對特征值 X 進(jìn)行打分,分?jǐn)?shù)有正有負(fù),每個分類器還有個權(quán)值,最終把多個分類器給出的分?jǐn)?shù)乘上他們自身的權(quán)值,全部累加起來,得到一個數(shù)值,如果是正數(shù),表示屬于 1 類,負(fù)數(shù)表示屬于 -1 類。

假設(shè) 1 類是人臉類,-1 類是非人臉類,就能分出一張圖是不是人臉了。

分類器可以理解為一個函數(shù) G(x),輸入特征值 x,返回?cái)?shù)值 G(x)

AdaBoost 里面有多個弱分類器 (假設(shè)3個),組合成一個強(qiáng)分類器,像這樣

每個弱分類器有權(quán)重

再來個sign(n)函數(shù),sign 返回 n 前面的正負(fù)號,0和正數(shù)返回 1,負(fù)數(shù)返回 -1

拓展到 n,最終的判斷公式為

輸入一個圖像的特征值 x,看看返回是 1 還是 -1,就可以判斷出是人臉還是非人臉。

其他:w1, w2, w3 一開始不知道是多少,需要訓(xùn)練數(shù)據(jù)進(jìn)行多輪的迭代后算出,訓(xùn)練過程就是調(diào)整權(quán)值的過程。訓(xùn)練完了后,就用這些權(quán)值組成的模型,對未知的圖像進(jìn)行分類。


具體的例子

有8組包含各種情況的特征值,作為訓(xùn)練數(shù)據(jù)。

特征值 x 1 2 3 4 5 6 7 8
類別 1 1 -1 -1 -1 1 1 1

1.初始化 n 組訓(xùn)練數(shù)據(jù)的權(quán)值為 D(i) = 1 / n
所以 1 到 8 的權(quán)值為 1 / 8 = 0.125
D = (0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125)

2.多輪迭代
看訓(xùn)練數(shù)據(jù)
1, 2 屬于 1 類
3, 4, 5 屬于 -1 類
6, 7, 8 屬于 1 類

2 到 3 的時候,由 1 變?yōu)?-1,是一個變化的地方,設(shè)定 x = 2.5,意思是在 2.5 的地方切一刀。
5 到 6 由 -1 變?yōu)?1,又是一個變化點(diǎn),設(shè)定 x = 5.5

下面對 2.5,5.5 進(jìn)行迭代

規(guī)則:有一個常數(shù) c,先認(rèn)為 x <= c 的元素為 1 類,x > c 的為 -1 類,然后計(jì)算有多少個數(shù)據(jù)被分錯的。
誤差率 e = 分錯的元素的權(quán)值和
如果誤差率 e > 0.5,則反過來,認(rèn)為 x <= c 的為 -1,x > c 的為 1。

誤差率寫成公式有點(diǎn)晦澀了,用文字描述比較直觀,就是把被分類器分錯的元素的和權(quán)值全部加起來,就是誤差率了。


  • 第一輪迭代

x = 2.5 時,先認(rèn)為 x <= 2.5 為 1 類,x > 2.5 的為 -1 類
那么 6, 7, 8 三個元素被分錯了,每個元素的權(quán)值為 0.125。
誤差率為 6, 7, 8 的權(quán)值和:0.125 + 0,125 + 0.125 = 0.375

x = 5.5 時,先認(rèn)為 x <= 5.5 為 1,x > 5.5 為 -1
那么 3, 4, 5, 6, 7, 8 六個元素被分錯。
誤差率為 6 乘 0.125 = 0.75 大于 0.5 了。
那么反過來 x <= 5.5 為 -1,x > 5.5 為 1,此時只有 1, 2 被分錯。
誤差率為 1, 2 的權(quán)值和:0.125 + 0.125 = 0.25

選個誤差小的 0.25,得出第一個分類器 G1


計(jì)算 G1 權(quán)重公式:(e 是誤差率)

該函數(shù)圖像:

由圖像可知誤差率 e 越小,w 權(quán)值越大。

G1 的誤差率 e1 = 2 / 8 = 0.25
G1 權(quán)重 w1 = 1 / 2 * log (0.75 / 0.25) = 0.23856

w1 就描述了 G1 的重要程度,或者說對一個特征值被分成哪一類的話語權(quán)的大小。

接下來要更新以下元素權(quán)重:
第一輪:D = (0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125)
假設(shè)第一輪的 D = (d1, d2, d3, ..., dn),是已知的
下一輪的 D = (k1, k2, k3, ..., kn),是要計(jì)算的

權(quán)重更新公式:

其中常數(shù) Z 是

ki 本輪要計(jì)算的元素的權(quán)重
di 上一輪已經(jīng)計(jì)算出的權(quán)重
w 上一輪分類器的權(quán)重
G(xi) 上一輪分類器對第 i 個特征的分類結(jié)果
yi 第 i 個元素的類別,1 或者 -1
e 自然常數(shù),約 2.71828
Z 歸一化用的常數(shù)

按照上面方式,算出新的權(quán)重為

D = (0.174721, 0.174721, 0.108426, 0.108426, 0.108426, 0.108426, 0.108426, 0.108426)

可以看出 1, 2 被分錯后,它的權(quán)值增大了,那么如果后面的分類器再把 1, 2 分錯,產(chǎn)生的誤差率會更大,因?yàn)檎`差率根據(jù)權(quán)值和算出的,所以權(quán)值大的,會被重點(diǎn)考慮。

  • 第二輪迭代

x = 2.5 時,誤差率為 6, 7, 8 權(quán)值和:0.325278
x = 5.5 時,誤差率為 1, 2 的權(quán)值和:0.349442

選個誤差率小的,即 0.325278,x = 2.5 的,得出第二個分類器 G2

G2 的誤差率 e2 = 0.325278
G2 權(quán)重 w2 = 0.15844

此時,已經(jīng)得到兩個弱分類器,代入 adaboost 算法的公式中

得到模型:


  • 測試該模型
特征值 x 1 2 3 4 5 6 7 8
類別 1 1 -1 -1 -1 1 1 1
G(x) -1 -1 -1 -1 -1 1 1 1

分析 G(x) 得出的結(jié)果,發(fā)現(xiàn) 1,2 被分錯了,還是有誤差,說明本例子迭代兩次是不夠的,還需要更多輪的迭代,減小誤差,直到模型 G(x) 在訓(xùn)練數(shù)據(jù)上的誤差為0,再繼續(xù)迭代下去誤差會收斂于一個常數(shù)。(詳見最后的參考文獻(xiàn))

訓(xùn)練好了一個誤差很小的模型 G(x),就可以用該模型去對未知的圖像進(jìn)行分類,分為人臉類和非人臉類,即可檢測出一張圖像是不是人臉。


推薦一個在線公式編輯在線函數(shù)繪圖

參考文獻(xiàn):July 的《Adaboost 算法的原理與推導(dǎo)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容