本次复现的论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks ,原作者是使用Matlab进行算法实现的。
本次的任务是基于该论文的 Pytorch 实现,使用百度Paddle Paddle框架对其进行复现。这篇博客则是以论文的Pytorch复现为基础,对MTCNN论文与算法进行学习与分析。
按要求下载以下资源:
由于本论文每个阶段的训练与测试过程都是按照PNet-RNet-ONet的顺序级联进行的,前一阶段的训练结果为后一阶段的网络输入,故而训练与测试均需要分多个阶段进行,下面将逐个对各阶段进行简要分析。
在MTCNN_TUTORIAL- MASTER /data_preprocessing/文件夹下新建文件夹anno_store,并执行如下指令
python data_preprocessing/transform.py
将在该路径下生成文件anno_train.txt,以将预先下载的wider_face_split/wider_face_train.mat标记文件转换为txt格式。
转换后的wider_face_train.txt文件中记录有 数据集 中原图像地址,以及作为ground truth的人脸框坐标。
输入PNet的训练数据,按图像交并比IOU的值,分为三部分:0-0.3划分为negative,0.4-0.65划分为part,0.65-1划分为positive。
执行如下指令
python data_preprocessing/gen_Pnet_train_data.py
该文件负责从原图中crop出图像并按照IOU值进行分类,将三种标签的数据分别存入data_set/train/12/negative/,data_set/train/12/part/,data_set/train/12/positive/
--------------------------------------一条分割线-------------------------------------------
再执行下述指令
python data_preprocessing/assemble_Pnet_imglist.py
组装PNet的数据集注释文件并完成shuffle,将其打乱,自此完成PNet训练数据的准备
执行下述语句
python train/Train_Pnet.py
训练过程中,PNet网络的train模式与val模式交替进行。
值得一提的是,首次训练之前,需要创建验证集对应的文件夹data_set/val/12/,文件夹中将生成pos_12_val.txt,part_12_val.txt,neg_12_val.txt三个标注文件。
创建data_set/train/24/文件夹,执行如下命令
python data_preprocessing/gen_Rnet_train_data.py
python data_preprocessing/assemble_Rnet_imglist.py
功能大致与第二步中PNet数据准备的功能相同,data_set/train/24/文件夹中将生成pos_24_val.txt,part_24_val.txt,neg_24_val.txt三个标注文件
执行下述语句,功能大致与第三步中PNet网络训练相同
python train/Train_Pnet.py
创建data_set/train/48/文件夹,执行下列语句
python data_preprocessing/gen_Onet_train_data.py
功能与第二步中PNet数据准备功能相同,文件夹中将生成pos_48.txt, part_48.txt, neg_48.txt三个标注文件
由于第三阶段ONet,即Output Net需要输出脸部 landmark坐标,故而在数据准备阶段需要额外生成data_preprocessing/anno_store/landmark_48.txt文件,记录面部标志点信息,执行下述语句
python data_preprocessing/gen_landmark_48.py
为完成ONet训练数据的预处理与shuffle,执行下述语句
python data_preprocessing/assemble_Onet_imglist.py
执行下述语句,功能大致与第三步中PNet网络训练相同
python train/Train_Onet.py
自此,训练、验证阶段完成
下面展示一下我们的训练过程与测试结果~
训练过程之模型导入
训练过程
测试过程:

测试效果:






加载了训练好的模型,我们又训练了几轮,效果还挺好的,是吧~
对照代码通读论文,对模型与算法进行一系列分析。