實現參考:https://github.com/foreverYoungGitHub/MTCNN
MTCNN作者提供了matlab版的測試代碼,但是實驗室的生產環境是caffe,這篇文章記錄下使用C++改寫MTCNN的一些注意點。
類似於caffe提供的examples里的cpp_classification,創建MTCNN類用於其他函數調用。
1、MTCNN構造函數中使用模型文件和訓練文件初始化網絡
2、預處理:與matlab按列存儲數據不同,caffe按行存儲數據,因此,如果想要使用作者提供的caffemodel和prototxt文件,需要在預處理階段將圖像進行轉置處理
3、P-Net:多尺度縮放圖像,全卷積輸出得到邊界框校正回歸向量和類別向量,根據邊界框校正回歸向量(歸一化值)生成在輸入圖像上的邊界框表示(左上點坐標、寬度、高度),這里需要注意的是記住P-Net中池化下采樣的倍數,然后才能根據每幅圖的輸出大小乘以相應的下采樣倍數還原到輸入圖像大小。得到每幅圖像的一系列候選框后,進行NMS處理。
4、R-Net:在原圖上裁剪P-Net輸出的矩形區域進行歸一化作為輸入,送入網絡輸出邊界框偏移量,在P-Net邊界框的基礎上進行校正計算,然后進行NMS處理。
5、O-Net:操作類似於R-Net。
訓練:
(1)使用caffe進行訓練時由於輸入是多標簽數據,可以考慮定義自己的層類型、Python數據輸入層或者HDF5文件。
(2)因為是多任務訓練,所以損失函數需要多個損失組合。