搞了一年人臉識(shí)別,尋思著記錄點(diǎn)什么,于是想寫這么個(gè)系列,介紹人臉識(shí)別的四大塊:Face detection, alignment, verification and identification(recognization),本別代表從一張圖中識(shí)別出人臉位置,把人臉上的特征點(diǎn)定位,人臉校驗(yàn)和人臉識(shí)別。(后兩者的區(qū)別在于,人臉校驗(yàn)是要給你兩張臉問你是不是同一個(gè)人,人臉識(shí)別是給你一張臉和一個(gè)庫(kù)問你這張臉是庫(kù)里的誰(shuí)。
今天先介紹第一部分和第二部分。 主要說(shuō)三篇頂會(huì)文章。
人臉檢測(cè)(detection)在opencv中早就有直接能拿來(lái)用的haar分類器,基于Viola-Jones算法。但是畢竟是老掉牙的技術(shù),Precision/Recall曲線渣到不行,在實(shí)際工程中根本沒法給boss看,作為MSRA腦殘粉,這里介紹一種MSRA在14年的最新技術(shù):Joint Cascade Face Detection and Alignment(ECCV14)。這篇文章直接在30ms的時(shí)間里把detection和alignment都給做了,PR曲線彪到很高,時(shí)效性高,內(nèi)存占用卻非常低,在一些庫(kù)上虐了Face++和Google Picasa,正好契合這篇想講的東西。可以作為本節(jié)的主線。
人臉校準(zhǔn)(alignment)是給你一張臉,你給我找出我需要的特征點(diǎn)的位置,比如鼻子左側(cè),鼻孔下側(cè),瞳孔位置,上嘴唇下側(cè)等等點(diǎn)的位置。如果覺得還是不明白,看下圖:
圖中紅色框框就是在做detection,白色點(diǎn)點(diǎn)就是在做alignment。
如果知道了點(diǎn)的位置做一下位置驅(qū)動(dòng)的變形,臉就成正的了,如何驅(qū)動(dòng)變形不是本節(jié)的重點(diǎn),在此省略。
首先介紹一下下面正文要寫的東西,由于干貨非常多所以可能會(huì)看著看著就亂了,所以給出框架圖:
?
=================================
作者建立了一個(gè)叫post classifier的分類器,方法如下:
1.樣本準(zhǔn)備:首先作者調(diào)用opencv的Viola-Jones分類器,將recal閥值設(shè)到99%,這樣能夠盡可能地檢測(cè)出所有的臉,但是同時(shí)也會(huì)有非常多的不是臉的東東被檢測(cè)出來(lái)。于是,檢測(cè)出來(lái)的框框們被分成了兩類:是臉和不是臉。這些圖片被resize到96*96。
2.特征提取:接下來(lái)是特征提取,怎么提取呢?作者采用了三種方法:
第一種:把window劃分成6*6個(gè)小windows,分別提取SIFT特征,然后連接著36個(gè)sift特征向量成為圖像的特征。
第二種:先求出一個(gè)固定的臉的平均shape(27個(gè)特征點(diǎn)的位置,比如眼睛左邊,嘴唇右邊等等),然后以這27個(gè)特征點(diǎn)為中心提取sift特征,然后連接后作為特征。
第三種:用他們組去年的另一個(gè)成果Face Alignment at 3000 FPS via Regressing Local Binary Features (CVPR14) ,也就是圖中的3000FPS方法,回歸出每張臉的shape,然后再以每張臉自己的27個(gè)shape points為中心做sift,然后連接得到特征。
3.分類:將上述的三種特征分別扔到線性SVM中做分類,訓(xùn)練出一個(gè)能分辨一張圖是不是臉的SVM模型。
緊接著作者將以上三種方法做出的分類器和初始分類器進(jìn)行比對(duì),畫了一個(gè)樣本分布的圖:
?
這個(gè)圖從左到右依次是原始級(jí)聯(lián)分類器得到的樣本分類分布和第一種到第三種方法提取的特征得到的樣本分類分布??梢娮鲆幌聅hape alignment可以得到一個(gè)更好的分類效果。但是問題來(lái)了:如果把所有的windows都做一下alignment,即使是3000 faces per second的速度一張圖可能也要處理上1秒,這無(wú)法滿足一般一秒30幀的實(shí)時(shí)需求。作者也說(shuō),用opencv分類器,參數(shù)設(shè)成99%的recall率將會(huì)帶來(lái)很嚴(yán)重的效率災(zāi)難——一張圖能找出來(lái)3000個(gè)框,處理一張圖都要好幾秒。
這么渣的效率可咋辦呢?以上內(nèi)容已經(jīng)證明了alignment確實(shí)對(duì)detection的preciseness有幫助,這就夠啦,對(duì)下面的工作也是個(gè)啟發(fā)——能不能在做detection的同時(shí)把a(bǔ)lignment做了呢?alignment的中間結(jié)果是否能給detection帶來(lái)一些幫助呢?后面慢慢講。先說(shuō)兩個(gè)通用的面部檢測(cè)和矯正的模型:
1.級(jí)聯(lián)檢測(cè)分類器(bagging):不失一般性,一個(gè)簡(jiǎn)單的級(jí)聯(lián)分類器是這樣的:
圖中的Ci代表的是第i個(gè)弱分類器。x代表的是特征向量,f代表分類得分。每個(gè)Ci會(huì)根據(jù)自己的分類方法對(duì)x輸出一個(gè)分類結(jié)果,比如是一張臉或者不是一張臉,而fn(n=1~N)都會(huì)對(duì)應(yīng)一個(gè)thresholdΘi,讓任意一個(gè)fn小于對(duì)應(yīng)的Θi的時(shí)候,樣本就會(huì)被拒絕。通常不是一張臉的圖片在經(jīng)過前幾個(gè)弱分類器的判斷后就會(huì)被拒絕,根本不用做后面的判斷,所以速度很快。
2.級(jí)聯(lián)回歸校準(zhǔn):這里介紹的是另一個(gè)人在10年發(fā)的文章:Cascaded Pose Regression (CVPR10),給圖像一個(gè)初始shape(通常采用平均shape),然后通過一次一次的回歸把shape回歸到正確的地方。算法結(jié)構(gòu)很簡(jiǎn)單,但是效果確實(shí)非常好:
?
回歸過程如下:首先提取特征,原作者采用的是Pose-Indexed point features,然后根據(jù)特征訓(xùn)練回歸函數(shù)(可以用線性回歸,CART,隨機(jī)森林等等),原作者采用了一個(gè)叫Random Fern Regressor的東西,這里翻譯成隨機(jī)蕨好了(這名字…),回歸出這一階段的偏移量,然后shape加上這個(gè)偏移量,反復(fù)這一過程,直到迭代上限或者shape錯(cuò)誤率不再下降。隨機(jī)蕨的算法過程和隨機(jī)森林類似,他是一個(gè)半樸素貝葉斯模型。首先選取M組每組K個(gè)特征建立M個(gè)蕨(弱分類器),然后假設(shè)蕨內(nèi)特征是相關(guān)的,蕨間特征是獨(dú)立的,這樣從統(tǒng)計(jì)學(xué)上隨機(jī)蕨是一個(gè)完整的把樸素貝葉斯分類器,讓計(jì)算變得簡(jiǎn)單:
式中C代表分類,ci代表第I類,M代表蕨數(shù)量。
綜上,這樣回歸的過程可以總結(jié)成如下形式:
S代表shape,St代表在回歸第t階段的shape,他等于上一階段的shape加上一個(gè)偏置,這個(gè)偏置就是上述回歸方法之一搞定的。比如隨機(jī)森林或者隨機(jī)蕨,或者線性回歸。
現(xiàn)在再說(shuō)說(shuō)怎么訓(xùn)練得到這個(gè)回歸Rt。
有兩種思路:一種是像剛才隨機(jī)蕨那樣,每個(gè)每個(gè)蕨的葉子節(jié)點(diǎn)存儲(chǔ)一個(gè)偏移量,計(jì)算訓(xùn)練的時(shí)候落入這個(gè)葉子節(jié)點(diǎn)的樣本偏移之平均,然后作為最終的葉子節(jié)點(diǎn)偏移量。其實(shí)就是在優(yōu)化一個(gè)如下目標(biāo)函數(shù):
然而MSRA組在3000fps中采用的是另一種方法,形狀的偏移量ΔδS為:
目標(biāo)函數(shù)是:
其實(shí)也是同樣的思路,Φ代表特征提取函數(shù),論文中稱Φ的輸出為局部二值特征(LBF),W為線性回歸參數(shù)矩陣,其實(shí)就是把提取出來(lái)的特征映射到一個(gè)二維的偏移量上,是一個(gè)2*lenth(特征空間維數(shù))的變換矩陣。
首先講Φ是怎么訓(xùn)練的:Φ其實(shí)就是一個(gè)隨機(jī)森林。輸入像素差特征(pixel-difference features),輸出一個(gè)offest。訓(xùn)練的時(shí)候隨機(jī)給每個(gè)根節(jié)點(diǎn)像素差特征中的一部分。非葉節(jié)點(diǎn)的分裂依據(jù)是從輸入的pixel-difference features中找出能夠做到最大的方差衰減的feature。在最后的葉子節(jié)點(diǎn)上寫上落在葉子節(jié)點(diǎn)上的樣本偏移量,這個(gè)偏移量在之前說(shuō)到的fern里有用,但是在這里沒啥用,因?yàn)樽髡咦詈蟛皇怯眠@個(gè)做回歸的而是用LBF,詳細(xì)的得往下看。如果有多個(gè)樣本都落在這里,則求平均。這樣訓(xùn)練出來(lái)的東西就是下面這個(gè)公式所表達(dá)的東西:
可能有讀者看到這就會(huì)不懂了,不用管這個(gè)公式,等下面的看完了就會(huì)懂了。
但是我只想要其中的Φ,于是這里給出了LBF(local binary feature)的定義,直接簡(jiǎn)單粗暴地統(tǒng)計(jì)所有樹葉節(jié)點(diǎn)是否被該樣本落入,如果落入了就記為1否則記為0,然后把所有的01串連起來(lái)就是LBF了。還是看圖說(shuō)話:
?
先看b,隨機(jī)森林的三棵樹,樣本經(jīng)過三棵樹后分別落在了第1,2,3個(gè)葉子節(jié)點(diǎn)上,于是三棵樹的LBF就是1000,0100,0010.連接起來(lái)就是100001000010.然后看a,把27個(gè)特征點(diǎn)的lbf都連接起來(lái)形成總的LBF就是Φ了。
接下來(lái)是訓(xùn)練w:之前已經(jīng)得到了wΦ(I,S)以及Φ(I,S),現(xiàn)在想求w,這還不容易嗎,直接算呀。不過作者又調(diào)皮了,他說(shuō)他不想求w,而是想求一個(gè)總的大W=[w1,w2,w3,…,w27].怎么求呢?得做二次回歸。至于為什么要這么做下面會(huì)介紹。目標(biāo)函數(shù):
后面加了個(gè)L2項(xiàng),因?yàn)閃是炒雞sparse的,防止過擬合。做線性回歸即可得到W。
現(xiàn)在解釋一下為啥不直接用w1w2w3…而是要再回歸出來(lái)一個(gè)W:原因有兩個(gè):
1. 再次回歸W可以去除原先小wi葉子節(jié)點(diǎn)上的噪聲,因?yàn)殡S機(jī)森林里的決策樹都是弱分類器嘛噪聲多多滴;
2.大W是全局回歸(之前的一個(gè)一個(gè)小w也就是一個(gè)一個(gè)特征點(diǎn)單獨(dú)的回歸是local回歸),全局回歸可以有效地實(shí)施一個(gè)全局形狀約束以減少局部誤差以及模糊不清的局部表現(xiàn)。
這樣一來(lái),測(cè)試的時(shí)候每輸入一張圖片I,先用隨機(jī)森林Φ求出它的LBF,然后在用W乘一下就得到了下一個(gè)stage的shape,然后迭代幾次就得到了最終的shape。所以效率十分的快。
好了,兜了一大圈該回來(lái)了,剛才講的是兩個(gè)uniform的model來(lái)做detection和shape regression的。接下來(lái)該講作者是怎么邊detection邊regression shape的了!
作者建立了一個(gè)分類回歸樹,就叫CRT好了。這個(gè)CRT在距離根節(jié)點(diǎn)比較近的幾層偏重于分類,在接近葉子節(jié)點(diǎn)的幾層偏重于回歸,具體實(shí)現(xiàn)上,每個(gè)節(jié)點(diǎn)究竟用于回歸還是分類呢?用一個(gè)概率p表示用于分類的概率,自然回歸就是1-p了。而這個(gè)p隨著深數(shù)的深度減小,作者采用了一個(gè)經(jīng)驗(yàn)公式:
知道了CRT怎么建立,那就直接就看算法細(xì)節(jié)吧!邊測(cè)試是不是臉邊做特征點(diǎn)回歸的算法如下:
?
這個(gè)模型的訓(xùn)練方法如下:
?
這樣就算完了嗎?不,既然要實(shí)現(xiàn),就要細(xì)看一下以上用到的各類算法細(xì)節(jié):
部分摘自其他博客,詳見參考文獻(xiàn)。
評(píng)論