基于深度卷積網(wǎng)絡(luò)級(jí)聯(lián)的面部點(diǎn)檢測(cè)
最近在學(xué)習(xí)如何制作一個(gè)實(shí)時(shí)的人臉檢測(cè)系統(tǒng)。
思路很簡(jiǎn)單,先以單人為例,如果要檢測(cè)兩個(gè)圖片是不是同一個(gè)人,首先要在檢測(cè)出兩個(gè)人的面部區(qū)域,然后畫一個(gè)固定像素大小的框,再把框摳下來,這樣就得到了兩個(gè)待匹配的區(qū)域。
把兩個(gè)待匹配區(qū)域輸入一個(gè)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò),輸出兩個(gè)高維特征,通過計(jì)算它們之間的距離(例如余弦距離),距離大于閾值,則說明兩個(gè)照片是同一個(gè)人。
這是一個(gè)簡(jiǎn)化的思路,具體每一步的實(shí)現(xiàn)都還需要在改進(jìn)。
我們先來聊聊第一步,讀取照片或者讀取視頻的工作,我們可以通過opencv來實(shí)現(xiàn),通過opencv得到每一幀的圖像,還可以通過opencv的內(nèi)置函數(shù)cascadeclassifier得到幀圖像中的人臉。但是這樣得到的人臉數(shù)據(jù)是比較粗糙的,對(duì)后期的匹配精度影響很大,所以我們需要進(jìn)行預(yù)處理一下。
下面就要開始介紹今天的主角了。
Deep Convolutional Network Cascade for Facial Point Detection
文章是介紹如何卷積神經(jīng)網(wǎng)絡(luò)對(duì)一個(gè)人臉圖像進(jìn)行五個(gè)面部點(diǎn)檢測(cè),他們分別是:左眼中心,右眼中心,鼻子尖端,左嘴中心,右嘴中心,大致效果如下圖:

得到的5個(gè)點(diǎn)用于重塑我們的人臉圖像,作為最后特征提取網(wǎng)絡(luò)的輸入。
現(xiàn)有的面部點(diǎn)檢測(cè)技術(shù),可以分為兩大類:
(1)一種是訓(xùn)練一個(gè)分類器,把圖像切分成一個(gè)個(gè)小區(qū)域,用分類器進(jìn)行分類,找出關(guān)鍵點(diǎn)所在區(qū)域。分類器可以使用經(jīng)典的分類算法,例如Adaboost,SVM,Randomforest等等。這種做法比較容易受到噪聲的干擾,有可能會(huì)得到多個(gè)輸出,或者是沒有輸出。
(2)另一種這是訓(xùn)練一個(gè)回歸器,通過多次迭代,直接預(yù)測(cè)關(guān)鍵的位置,這個(gè)方法顯然是比上一個(gè)方法要好的。對(duì)于回歸器來說,只要算法能夠收斂,必然是有輸出的,并且這么做不需要掃描圖片(我們把使用分類器去分類一個(gè)個(gè)小區(qū)域的做法成為掃描)。這種做法的缺點(diǎn)也明顯,由于神經(jīng)網(wǎng)絡(luò)是基于梯度下降來優(yōu)化目標(biāo)函數(shù)的,所以模型容易陷入局部最小值。因此,這個(gè)做法需要選取一個(gè)合適的初值。
而文章是使用的第二種做法。通過多個(gè)卷積神經(jīng)網(wǎng)絡(luò)的級(jí)聯(lián)來實(shí)現(xiàn)對(duì)關(guān)鍵點(diǎn)的預(yù)測(cè)。
我們先來看一段論文中提出的創(chuàng)新點(diǎn)。
我們提出了一種用于面部檢測(cè)三層卷積網(wǎng)絡(luò),它基于一個(gè)級(jí)聯(lián)的回歸方法。和現(xiàn)有的方法不同的是,現(xiàn)有的方法只能近似的估計(jì)出面部點(diǎn)的初始位置,而我們的卷積網(wǎng)絡(luò)能夠在第一層精確地做出預(yù)測(cè),即使是在圖一中的非常有挑戰(zhàn)性的環(huán)境下。這有效的避免了其他方法中的局部最小值問題。我們的卷積網(wǎng)絡(luò)使用了全臉做為輸入,最大程度的利用了上下文的紋理特征信息,并且輸出全局的高位特征在深度結(jié)構(gòu)中的更高的曾,這有效地預(yù)測(cè)關(guān)鍵點(diǎn),即使當(dāng)局部區(qū)域中的低維特征是挑戰(zhàn)性的模糊的或者是損壞的圖像樣本。我們的卷積網(wǎng)絡(luò)被同時(shí)訓(xùn)練用于預(yù)測(cè)所有的關(guān)鍵點(diǎn),并且關(guān)鍵點(diǎn)之間的約束被隱式的編碼。
剩下的兩個(gè)卷積網(wǎng)絡(luò),優(yōu)化了關(guān)鍵點(diǎn)的初始預(yù)估值。和現(xiàn)有的方法不同,現(xiàn)有的方法是用了相同的回歸器在不同的級(jí)聯(lián)步驟中,我們則設(shè)計(jì)了不同的卷積網(wǎng)絡(luò)。這兩層中的網(wǎng)絡(luò)結(jié)構(gòu)是比較淺的,因?yàn)樗麄兊娜蝿?wù)是在低等級(jí)的,并且他們的輸出被限制在初始位置周圍的很小的局部范圍內(nèi)。
一句話概括,就是論文中的模型一共由三個(gè)神經(jīng)網(wǎng)絡(luò)組成。第一個(gè)模型深,后兩個(gè)模型淺。第一個(gè)模型用整個(gè)面部的信息作為輸入,同時(shí)預(yù)測(cè)所以的關(guān)鍵點(diǎn)。后兩個(gè)模型則是基于第一個(gè)模型預(yù)測(cè)的關(guān)鍵點(diǎn),把以關(guān)鍵點(diǎn)為中心的小范圍區(qū)域作為輸入,最后輸出的預(yù)測(cè)的關(guān)鍵點(diǎn)。
接下來我們來看一下模型的結(jié)構(gòu)圖。

解釋一下,綠色的框代表的是面部檢測(cè)器(來自opencv,sk-image之類的)檢測(cè)到的區(qū)域。黃色區(qū)域代表的是輸入的像素區(qū)域。紅色點(diǎn)代表每層網(wǎng)絡(luò)最終的預(yù)測(cè)結(jié)果。第一個(gè)層神經(jīng)網(wǎng)絡(luò)由三個(gè)并行的子網(wǎng)絡(luò)組成。他們名字分別為F1,EN1,NM1,作用分別是:F1——預(yù)測(cè)所有的五個(gè)關(guān)鍵點(diǎn),EN1——預(yù)測(cè)上三個(gè)關(guān)鍵點(diǎn),NM1——預(yù)測(cè)下三個(gè)關(guān)鍵點(diǎn)。當(dāng)然他們的輸入也是不一樣的,F(xiàn)1是綠框的區(qū)域,EN1是F1上移一點(diǎn),NM1下移一點(diǎn)。第一層三個(gè)子網(wǎng)絡(luò)得到的點(diǎn),取平均,作為第二層的輸入。對(duì)于第二和第三層中的子網(wǎng)絡(luò),它們的作用僅僅是對(duì)一個(gè)關(guān)鍵點(diǎn)的預(yù)測(cè)。但是每個(gè)關(guān)鍵點(diǎn),都會(huì)構(gòu)造兩個(gè)網(wǎng)絡(luò)來預(yù)測(cè),結(jié)果是之前的輸入作為絕對(duì)量,在加上后兩層大網(wǎng)絡(luò)的預(yù)測(cè)值的均值作為偏移量。公式表達(dá)為:

具體的網(wǎng)絡(luò)結(jié)構(gòu),還有對(duì)輸入范圍設(shè)置可以在文章中找到,這里就不多提了。
下一章節(jié)我們將研究如何用得到的五個(gè)關(guān)鍵點(diǎn)來實(shí)現(xiàn)人臉圖像的重構(gòu)。