1. 程式人生 > >MTCNN的訓練與測試小結

MTCNN的訓練與測試小結

本文重點介紹其中一篇關注度比較高的文章《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》也就是標題中提到的MTCNN。

MTCNN網路結構

訓練資料:該演算法訓練資料來源於wider和celeba兩個公開的資料庫,wider提供人臉檢測資料,在大圖上標註了人臉框groundtruth的座標資訊,celeba提供了5個landmark點的資料。根據參與任務的不同,將訓練資料分為四類:人臉正樣本(positives)、非人臉負樣本(negatives)、部分臉(partfaces)、關鍵點(landmark)。positives、negatives、partfaces由隨機取的框與groundtruth的overlap區域比例的大小決定,大於0.65為positives,小於0.3為negatives,0.4到0.65之間為partfaces。positives和negatives參與到分類任務,positives和partfaces參與到迴歸任務,landmark資料參與到關鍵點回歸任務。關鍵點回歸僅在第三個net中實用,此時landmark資料的人臉框位置可由前兩個net的模型檢測得到,或是由landmark的座標位置擬合出來。在每個batchSize中的樣本比例如下,positives:negatives:partfaces:landmark = 1 : 3 : 1 : 2。到此為止,資料的來源組成我們都交代完畢,但是如何生成訓練資料呢,這也是很多MTCNN的擁簇者希望能開源訓練程式碼。本文以caffe為例,採用hdf5資料格式,先由指令碼隨機在wider上擷取positives、negatives、partfaces,注意要覆蓋到不同尺度的,負樣本的量級達到2000w左右(該文作者透露)。之所以採用hdf5的資料格式,是考慮到能夠方便的實現多label,以前兩個net為例,筆者採用的label為7為,分別是 f1 c1 f2 dx1 dy1 dx2 dy2,f1和f2是標記位,f1標記該樣本是否參與分類,f2標記該樣本是否參與迴歸,f1和f2後面緊跟的是真實的label資訊,c1是樣本類別,dx dy是偏移量。與此對應的是,筆者自己實現了帶標誌位的softmax和euclidean loss(這種訓練的方式不夠美觀,有其他更好的方式還望有讀者能告知我)。

網路結構:三個net的網路結構如上圖所示,注意pnet是全卷積的結構,不包含fc層。筆者在訓練pnet和rnet的時候,並沒有加入landmark迴歸的任務,分類和人臉框迴歸的loss_weight之比為1:0.5,onet加入landmark迴歸,分類、人臉框迴歸和關鍵點回歸的loss_weight之比為1:0.5:0.5。

hard mining:筆者按照論文上的線上hard mining的方式,只計算loss大的前70%樣本的梯度,沒有取得收益。rnet和onet訓練的時候,負樣本分別是經過前面的net處理而搞不定的這些。

MTCNN測試流程

測試

測試流程參見附圖,對影象進行金字塔處理,筆者用的縮放係數是1.3,注意pnet是全圖計算,得到的featureMap上每個點對應金字塔圖上12*12的大小,然後是否通過分類閾值進行視窗合併(NMS)和人臉框位置矯正。在pnet和rnet階段,筆者實驗發現人臉框位置矯正在NMS之前能提高召回率,在onet階段,為避免同一人臉輸出多個框,將NMS操作放在人臉框位置矯正之後。

還有一些簡單的細節筆者沒有一一詳盡描述,如果讀者有問題,可留言與我討論。