轉自:http://blog.csdn.net/amds123/article/details/69568495
MTCNN主要包括三個部分,PNet,RNet,ONet
其中PNet在訓練階段的輸入尺寸為12*12,RNet的輸入尺寸為24*24, ONet的輸入尺寸為48*48. PNet網絡參數最小,ceffemodel僅有28.2KB, 所以速度最快.RNet的網絡參數次之,caffemodel大小為407.9KB, ONet的caffemodel大小為1.6M,三個網絡合起來不到2M.
測試階段大概過程
首先圖像經過金字塔,生成多個尺度的圖像,然后輸入PNet, PNet由於尺寸很小,所以可以很快的選出候選區域,但是准確率不高,然后采用NMS算法,合並候選框,然后根據候選框提取圖像,作為RNet的輸入,RNet可以精確的選取邊框,一般最后只剩幾個邊框,最后輸入ONet,ONet雖然速度較慢,但是由於經過前兩個網絡,已經得到了高概率的邊框,所以輸入ONet的圖像較少,然后ONet輸出精確的邊框和關鍵點信息.
訓練數據庫
論文中作者主要使用了Wider_face 和CelebA數據庫,其中Wider_face主要用於檢測任務的訓練,CelebA主要用於關鍵點的訓練.訓練集分為四種:負樣本,正樣本 ,部分樣本,關鍵點樣本. 三個樣本的比例為3: 1: 1: 2
訓練主要包括三個任務
人臉分類任務:利用正樣本和負樣本進行訓練
人臉邊框回歸任務:利用正樣本和部分樣本進行訓練
關鍵點檢測任務:利用關鍵點樣本進行訓練
訓練數據整理:
Wider_face包含人臉邊框標注數據,大概人臉在20萬,CelebA包含邊框標注數據和5個點的關鍵點信息.對於三個網絡,提取過程類似,但是圖像尺寸不同.
正負樣本,部分樣本提取:
1.從Wider_face隨機選出邊框,然后和標注數據計算IOU,如果大於0.65,則為正樣本,大於0.4小於0.65為部分樣本,小於0.4為負樣本.
2.計算邊框偏移.對於邊框,(x1,y1)為左上角坐標,(x2,y2)為右下角坐標,新剪裁的邊框坐標為(xn1,yn1),(xn2,yn2),width,height.則offset_x1 = (x1 - xn1)/width,同上,計算另三個點的坐標偏移.
3.對於正樣本,部分樣本均有邊框信息,而對於負樣本不需要邊框信息
關鍵點樣本提取
1.從celeba中提取,可以根據標注的邊框,在滿足正樣本的要求下,隨機裁剪出圖片,然后調整關鍵點的坐標.
loss修改
由於訓練過程中需要同時計算3個loss,但是對於不同的任務,每個任務需要的loss不同.
所有在整理數據中,對於每個圖片進行了15個label的標注信息
1.第1列:為正負樣本標志,1正樣本,0負樣本,2部分樣本,3關鍵點信息
2.第2-5列:為邊框偏移,為float類型,對於無邊框信息的數據,全部置為-1
3.第6-15列:為關鍵點偏移,為floagt類型,對於無邊框信息的數據,全部置為-1
修改softmax_loss_layer.cpp 增加判斷,只對於1,0計算loss值
修改euclidean_loss_layer.cpp 增加判斷,對於置為-1的不進行loss計算
困難樣本選擇
論文中作者對與人臉分類任務,采用了在線困難樣本選擇,實現過程如下:
修改softmax_loss_layer.cpp,根據計算出的loss值,進行排序,只對於70%的值較低的數據,
進行反向傳播.