機(jī)器學(xué)習(xí)-Adaboost實(shí)現(xiàn)人臉檢測(cè),Viola-Jones目標(biāo)檢測(cè)

Adaboost

Boosting 指的是通過結(jié)合一些精度較低的弱學(xué)習(xí)器來獲得較高精度的方法,弱學(xué)習(xí)器指的是表現(xiàn)比隨即猜測(cè)稍微好一些的學(xué)習(xí)器。

AdaBoost是Adaptive Boosting的縮寫领追。主要思想是維持訓(xùn)練集上的權(quán)重分布。最初馅而,所有訓(xùn)練樣本的權(quán)重均等設(shè)置,但每輪之后會(huì)增加未被正確分類的示例權(quán)重包吝,以使弱學(xué)習(xí)器不得不將注意力集中在訓(xùn)練困難的樣本上。最終的輸出結(jié)果為所有弱分類器的加權(quán)和源葫。

Adaboost的算法的偽代碼如下:
輸入: 樣本(x_1,y_1), \cdots ,(x_m,y_m)诗越, Y=\{-1,+1 \}\
初始化樣本權(quán)重分布D_1(i) = 1/m

For t=1, \cdots,T:

  • 用一個(gè)弱分類器在當(dāng)前權(quán)重分布的樣本上訓(xùn)練
  • 計(jì)算錯(cuò)誤率err_t = Pr_{i \sim D_t}[h_t(x_i) \neq y_i]h_t(x_i)是弱分類器的預(yù)測(cè)結(jié)果
  • 計(jì)算分類器權(quán)重 \alpha_t = \frac{1}{2} ln(\frac{1-err_{t}}{err_t})
  • 更新樣本權(quán)重:D_{t+1}(i) = \frac{D_t(i) exp(-\alpha_t y_i h_t(x_i))}{Z_t}息堂,這里的Z_t是一個(gè)歸一化因子

輸出:H(x) = sign(\sum_{t=1}^T \alpha_t h_t(x))

Viola-Jones目標(biāo)檢測(cè)算法

Viola-Jones目標(biāo)檢測(cè)是第一個(gè)可以實(shí)時(shí)處理并有著很好檢測(cè)率的目標(biāo)檢測(cè)算法嚷狞,主要用于圖像中的人臉檢測(cè)。
這個(gè)算法使用正面的面部圖像荣堰,整個(gè)面部必須正對(duì)相機(jī)床未,算法是基于眼睛,鼻子的位置來估計(jì)人臉圖像振坚。

這個(gè)算法主要分為四個(gè)階段:

  • 選擇haar-like的特征
  • 創(chuàng)建積分圖
  • 使用AdaBoost進(jìn)行訓(xùn)練
  • 創(chuàng)建分類器級(jí)聯(lián)

Haar-like的特征是什么東西薇搁?

Haar feature

人臉上的五官都是有固定位置,額頭下面是眉毛和眼睛渡八,鼻子下面是嘴啃洋,長(zhǎng)成這樣的可能不是人,但是人一定是這么長(zhǎng)的屎鳍。

在上面的灰度圖中宏娄,白色框里的額頭部分的亮度總體上來說要比黑色框里的亮度更高,因?yàn)楹谏蚶锇ǖ拿济脱壑轭伾罡缤АR虼松习紫潞诘倪@樣一個(gè)特征绝编,就可以用于檢測(cè)當(dāng)前區(qū)域是否是額頭和眼睛。當(dāng)然一張圖片里會(huì)有許多類似的區(qū)域貌踏,因此不僅需要檢測(cè)額頭與眼睛十饥,還要它們位于鼻子和嘴的上面,在這些特征的相對(duì)位置都是正確的時(shí)候祖乳,才能判斷出是否找到了人臉逗堵。

針對(duì)不同的區(qū)域,有不同的Haar 特征:

Basic Haar-like rectangle features

特征值可以被計(jì)算為一個(gè)數(shù)值眷昆,只需要計(jì)算白色矩形內(nèi)的像素值和減去黑色矩形的像素之和蜒秤。這個(gè)值越大,說明特征越有可能提供有用的信息亚斋。

根據(jù)上面的描述應(yīng)該可以想到作媚,如果想要在圖片中找到額頭下面是眼睛,眼睛下面是鼻子嘴帅刊,需要在很多小的區(qū)域內(nèi)計(jì)算特征纸泡,計(jì)算量會(huì)變得很大。為此需要用到一個(gè)叫積分圖的數(shù)據(jù)結(jié)構(gòu)赖瞒,可以在常數(shù)時(shí)間內(nèi)計(jì)算得到矩陣的特征女揭。

積分圖

積分圖是一種快速有效的計(jì)算圖像內(nèi)一部分的像素總和的方法蚤假。
灰度圖可以看作是一個(gè)二維的矩陣。在積分圖中吧兔, 每個(gè)點(diǎn)儲(chǔ)存的都是該點(diǎn)左上方所有像素的總和磷仰。


計(jì)算當(dāng)前位置以及左上角的像素和

積分圖可以一次性提前算好,當(dāng)需要求某個(gè)子矩陣的和時(shí)境蔼,只需要查詢4個(gè)數(shù)字灶平,就得以得到子矩陣的和。例如下圖中欧穴,想要計(jì)算矩陣ABCD內(nèi)像素的和民逼,在積分圖內(nèi)找到A,B,C,D四個(gè)位置對(duì)應(yīng)的值,根據(jù)公式D-B-C+A就可以得到涮帘。

計(jì)算區(qū)域內(nèi)像素值的和

Adaboost

利用積分圖可以很快得到某個(gè)特征的值拼苍,并判斷是否包含人臉。弱學(xué)習(xí)器將判斷一個(gè)子區(qū)域內(nèi)是否包含人臉的特征调缨,每個(gè)弱學(xué)習(xí)器只判斷一個(gè)特征疮鲫。
Adaboost里,多個(gè)弱分類器組合最后會(huì)得到的一個(gè)強(qiáng)分類器弦叶,但當(dāng)分類器的數(shù)量過多時(shí)俊犯,也會(huì)得到使得計(jì)算量巨大遵馆,為此Viola和Jones又提出了分類器級(jí)聯(lián)啼辣。

分類器級(jí)聯(lián)

分類器級(jí)聯(lián)可以理解為將一串弱分類器穿起來,第一個(gè)分類器負(fù)責(zé)檢測(cè)一個(gè)人臉特征孵构,如果檢測(cè)到了立莉,說明它可能包含一個(gè)人臉绢彤,將進(jìn)入下一級(jí)的分類器繼續(xù)檢測(cè)下一個(gè)特征;如果沒有蜓耻,就可以直接判斷當(dāng)前不包括人臉了茫舶。下一級(jí)的分類器會(huì)更加復(fù)雜一些。級(jí)聯(lián)序列中的分類器只有當(dāng)樣本經(jīng)過了前面所有的分類器之和才會(huì)被訓(xùn)練到刹淌。級(jí)聯(lián)結(jié)構(gòu)本質(zhì)上是一個(gè)退化型的決策樹饶氏。

在第一級(jí)選擇眼睛和鼻子的特征,可以達(dá)到不到1%的FNR(false negtive rate)和40%的FPR(false positive rate)有勾。因此可以減少超過一半的不必要的最終檢測(cè)疹启。

分類器級(jí)聯(lián)

OpenCV實(shí)現(xiàn)

在安裝OpenCV的目錄下,會(huì)有一個(gè)叫 haarcascades的文件蔼卡,我們只需要haarcascade_frontalface_alt.xml 這個(gè)文件皮仁。

import cv2

# 原始圖片
img = cv2.imread("path/he.png")

# 轉(zhuǎn)為灰度圖
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 加載分類器 
face_cascade = cv2.CascadeClassifier("path/haarcascade_frontalface_alt.xml")

# 在圖像上檢測(cè),multiscale表示多個(gè)比例查看圖像子區(qū)域,以檢測(cè)不同大小
detected_faces = face_cascade.detectMultiScale(gray_img)

# 在原圖上加上框
for (column, row, width, height) in detected_faces:
    cv2.rectangle(
        img,
        (column, row),
        (column + width, row + height),
        (0, 255, 0),
        2
    )

# 顯示圖片贷祈,按0關(guān)閉窗口
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
人臉都被檢測(cè)到了

Viola-Jones已經(jīng)是20年前的算法,現(xiàn)在深度學(xué)習(xí)應(yīng)用在目標(biāo)檢測(cè)上已經(jīng)取得了非常好的成績(jī)喝峦,但不可否認(rèn)的是二十年前的思想奠定了現(xiàn)在的基礎(chǔ)势誊,特征選擇,特征組合谣蠢,分類級(jí)聯(lián)等都與現(xiàn)在的各種神經(jīng)網(wǎng)絡(luò)有異曲同工之妙粟耻。

參考:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眉踱,隨后出現(xiàn)的幾起案子挤忙,更是在濱河造成了極大的恐慌,老刑警劉巖谈喳,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件册烈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡婿禽,警方通過查閱死者的電腦和手機(jī)赏僧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扭倾,“玉大人淀零,你說我怎么就攤上這事√乓迹” “怎么了驾中?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)模聋。 經(jīng)常有香客問我肩民,道長(zhǎng),這世上最難降的妖魔是什么撬槽? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任此改,我火速辦了婚禮,結(jié)果婚禮上侄柔,老公的妹妹穿的比我還像新娘共啃。我一直安慰自己,他們只是感情好暂题,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布移剪。 她就那樣靜靜地躺著,像睡著了一般薪者。 火紅的嫁衣襯著肌膚如雪纵苛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音攻人,去河邊找鬼取试。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怀吻,可吹牛的內(nèi)容都是我干的瞬浓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蓬坡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼猿棉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屑咳,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤萨赁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后兆龙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杖爽,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年详瑞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掂林。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坝橡,死狀恐怖泻帮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情计寇,我是刑警寧澤锣杂,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站番宁,受9級(jí)特大地震影響元莫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝶押,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一踱蠢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棋电,春花似錦茎截、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至于未,卻和暖如春撕攒,著一層夾襖步出監(jiān)牢的瞬間陡鹃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工抖坪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萍鲸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓擦俐,卻偏偏與公主長(zhǎng)得像猿推,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捌肴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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