Keras框架:人脸检测-mtcnn思想及代码
人臉檢測-mtcnn
概念:
MTCNN,英文全稱是Multi-task convolutional neural network,中文全稱是多任務(wù)卷積神經(jīng)網(wǎng)絡(luò), 該神經(jīng)網(wǎng)絡(luò)將人臉區(qū)域檢測與人臉關(guān)鍵點(diǎn)檢測放在了一起。
從工程實(shí)踐上,MTCNN是一種檢測速度和準(zhǔn)確率都很不錯(cuò)的算法,算法的推斷流程有一定的啟發(fā)性。
總體可分為P-Net、R-Net、和O-Net三層網(wǎng)絡(luò)結(jié)構(gòu)。
流程:
1.由原始圖片和PNet生成預(yù)測的bounding boxes。
2.輸入原始圖片和PNet生成的bounding box,通過RNet,生成校正后的bounding box。
3.輸入原始圖片和RNet生成的bounding box,通過ONet,生成校正后的bounding box和人臉面部輪 廓關(guān)鍵點(diǎn)。
MTCNN主要包括三層網(wǎng)絡(luò):
a. 是否有人臉:2個(gè)輸出;
b. 回歸:回歸得到的框的起始點(diǎn)的xy坐標(biāo)和框的長寬,4個(gè)輸出;
c. 人臉特征點(diǎn)定位:5個(gè)人臉特征點(diǎn)的xy坐標(biāo),10個(gè)輸出。
注:三段網(wǎng)絡(luò)都有NMS,但是所設(shè)閾值不同。
1、構(gòu)建圖像金字塔
首先對(duì)圖片進(jìn)行Resize操作,將原始圖像縮放成不同的尺度,生成圖像金字塔。然后將不同尺度的圖 像送入到這三個(gè)子網(wǎng)絡(luò)中進(jìn)行訓(xùn)練,目的是為了可以檢測到不同大小的人臉,從而實(shí)現(xiàn)多尺度目標(biāo)檢測。
構(gòu)建方式是通過不同的縮放系數(shù)factor分別對(duì)圖片的h和w進(jìn)行縮放,每次縮小為原來的factor大小。
注意:縮小后的長寬最小不可以小于12。
為什么需要對(duì)圖片做“金字塔”變換?
圖片中的人臉的尺度有大有小,讓識(shí)別算法不被目標(biāo)尺度影響一直是個(gè)挑戰(zhàn)。
MTCNN使用了圖像金字塔來解決目標(biāo)多尺度問題,即把原圖按照一定的比例(如0.709),多次等比 縮放得到多尺度的圖片,很像個(gè)金字塔。
P-NET的模型是用單尺度(1212)的圖片訓(xùn)練出來的。推理的時(shí)候,縮小后的長寬最小不可以小于12。
對(duì)多個(gè)尺度的輸入圖像做訓(xùn)練,訓(xùn)練是非常耗時(shí)的。因此通常只在推理階段使用圖像金字塔,提高算法的精度。
設(shè)置合適的最小人臉尺寸和縮放因子為什么可以優(yōu)化計(jì)算效率?
? factor是指每次對(duì)邊縮放的倍數(shù)。
? 第一階段會(huì)多次縮放原圖得到圖片金字塔,目的是為了讓縮放后圖片中的人臉與P-NET訓(xùn)練時(shí)候的圖片尺度(12px * 12px)接近。
? 引申優(yōu)化項(xiàng):先把圖像縮放到一定大小,再通過factor對(duì)這個(gè)大小進(jìn)行縮放。可以減少計(jì)算量。
? minsize是指你認(rèn)為圖片中需要識(shí)別的人臉的最小尺寸(單位:px)。
? 注:代碼中使用的是“引申優(yōu)化項(xiàng)“的策略。
圖例:如果待測圖片1200px1200px,想要讓縮放后的尺寸接近模型訓(xùn)練圖片的尺度(12px*12px)。
縮放因子為什么官方選擇0.709?
? 圖片金字塔縮放時(shí),如果默認(rèn)把寬,高都變?yōu)樵瓉淼?/2,縮放后面積變?yōu)樵瓉淼?/4;
? 如果認(rèn)為1/4的縮放幅度太大,你會(huì)怎么辦?—把面積縮放為原來的1/2。
? 這是很直觀的想法,所以這里的縮放因子0.709 ≈ sqrt(2)/2,這樣寬高變?yōu)樵瓉淼膕qrt(2)/2, 面積就變?yōu)樵瓉淼?/2。
? 從實(shí)際意義上看,factor應(yīng)該設(shè)置為小于1。
圖像金字塔的缺點(diǎn):
慢。
2、P-Net(Proposal Network)
其基本的構(gòu)造是一個(gè)全卷積網(wǎng)絡(luò)。對(duì)上一步構(gòu)建完成的圖像金字塔,通過一個(gè)FCN(全卷積網(wǎng)絡(luò)) 進(jìn)行初步特征提取與標(biāo)定邊框。
MTCNN算法可以接受任意尺度的圖片,為什么?
? 因?yàn)榈谝浑A段的P-NET是一個(gè)全卷積網(wǎng)絡(luò)(Fully Convolutional Networks)。
? 卷積、池化、非線性激活都是一些可以接受任意尺度矩陣的運(yùn)算,但全連接運(yùn)算是需要規(guī)定輸入。 如果網(wǎng)絡(luò)中有全連接層,則輸入的圖片尺度(一般)需固定;如果沒有全連接層,圖片尺度可以是任 意的。
? 在推理的時(shí)候,測試圖像中人臉區(qū)域的尺度未知。但是因?yàn)镻網(wǎng)結(jié)構(gòu)是固定的,當(dāng)輸入圖為1212時(shí), 輸出的恰好是11的5通道特征圖,所以可以把p網(wǎng)整體看做一個(gè)1212的卷積核在圖片上從左上方開 始,取步長stride=2,依次做滑窗操作。——>所以,當(dāng)剛開始圖很大的時(shí)候,1212的框可能只是 框住了一張大臉上的某個(gè)局部如眼睛、耳朵、鼻子。當(dāng)該圖不斷縮至很小的時(shí)候(圖像金字塔), 12*12的框能對(duì)其框住的也越來越全,直至完全框住了整張臉。
? 3次卷積和1次池化操作后,原來12123的矩陣變?yōu)?132
? 利用這個(gè)1132的向量,再通過一個(gè)112的卷積,得到了”是否是人臉”的分類結(jié)果
? 我們令輸入圖片矩陣為A,卷積核在原圖矩陣A上滑動(dòng),把每個(gè)12123區(qū)域的矩陣都計(jì)算成該區(qū)域有 無人臉的得分,最后可以得到一個(gè)二維矩陣為S,S每個(gè)元素的值是[0, 1]的數(shù),代表有人臉的概率。即 A通過一系列矩陣運(yùn)算,變化到S。
P-Net的輸出:
舉例:
一張7070的圖,經(jīng)過P網(wǎng)絡(luò)全卷積后,輸出為(70-2)/2 -2 -2 =30,即一個(gè)5通道的3030的特征 圖。這就意味著該圖經(jīng)過p的一次滑窗操作,得到了30*30=900個(gè)建議框,而每個(gè)建議框?qū)?yīng)1個(gè)置 信度cond與4個(gè)偏移量offset。再經(jīng)nms(非極大值抑制:通過iou,把不是極大值的值全都?xì)⒌?把 cond大于設(shè)定的閾值0.6對(duì)應(yīng)的建議框保留下來,將其對(duì)應(yīng)的offset經(jīng)邊框回歸操作,得到在原圖中 的坐標(biāo)信息,即得到符合p網(wǎng)的這些建議框了。之后再傳給R網(wǎng)。
3、R-Net(Refine Network):
從網(wǎng)絡(luò)圖可以看到,只是由于該網(wǎng)絡(luò)結(jié)構(gòu)和P-Net網(wǎng)絡(luò)結(jié)構(gòu)有差異,多了一個(gè)全連接層,所以會(huì)取得更好的抑制false-positive的作用。在輸入R-Net之前,都需要縮放到24x24x3,網(wǎng)絡(luò)的輸出與P- Net是相同的,R-Net的目的是為了去除大量的非人臉框。
4、O-Net(Output Network):
該層比R-Net層又多了一層卷積層,所以處理的結(jié)果會(huì)更加精細(xì)。輸入的圖像大小48x48x3,輸出包括N個(gè)邊界框的坐標(biāo)信息,score以及關(guān)鍵點(diǎn)位置。
總結(jié):
從P-Net到R-Net,再到最后的O-Net,網(wǎng)絡(luò)輸入的圖像越來越大,卷積層的通道數(shù)越來越多,網(wǎng)絡(luò)的深度(層數(shù))也越來越深,因此識(shí)別人臉的準(zhǔn)確率應(yīng)該也是越來越高的。
實(shí)現(xiàn):
MTCNN人臉檢測的訓(xùn)練數(shù)據(jù)可以從http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/地址下載。該數(shù)據(jù)集有32,203張圖片,共有93,703張臉被標(biāo)記。
完整代碼在資源中。
實(shí)現(xiàn)結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的Keras框架:人脸检测-mtcnn思想及代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老是梦到自己的前夫是怎么回事
- 下一篇: 莫烦Pytorch神经网络第二章代码修改