版权声明:希望我的博客可以为别人带去知识与便利,让那些像我曾经一样迷茫的小伙伴不再迷茫~ https://blog.csdn.net/qq_34374664/article/details/81348020
0.前言
在这里将MTCNN程序复现一遍,这个Github程序的README是有问题的,程序也有一些问题,我也是仅仅将他的算法训练完毕,由于小白一个,只看了MTCNN的论文,里面有大量的先验论文与知识,对整体的网络实现以及代码还是有些懵懂,算是熟悉了跑模型的流程,其他知识待补充。
复现程序地址:点击打开
1.准备工作
- 需要有与CUDA兼容的GPU来训练模型。
- 应该首先下载WIDER Face和landmark dataset前者用于训练人脸检测,后者用于训练landmark检测。
2.依赖的版本
- Tensorflow 1.2.1
- TF-Slim
- Python 2.7
- Ubuntu 16.04
- Cuda 8.0
3.数据处理以及训练流程
- 下载Wider Face 数据集,将里面的WIDER_train.zip解压到 prepare_data文件并且更名为WIDER_train
- 下载“1.准备工作”中的landmark数据集,将landmark_train.zip数据集解压到prepare_data中
- 运行prepare_data/gen_12net_data.py来为PNet生成人脸检测的训练数据集
- 运行gen_landmark_aug_12.py来为PNet生成人脸特征点的训练数据集
- 运行gen_imglist_pnet.py来合并两部分数据
- 运行gen_PNet_tfrecords.py来生成PNet的tfrecords文件
- 运行 train_models/train_PNet.py训练PNet,训练完PNet之后运行gen_hard_example来为RNet生成人脸检测部分的训练数据(论文中提到的损失值前70%的样本),这里会出错,详细为“Key fc1/alphas not found in checkpoint ”,具体解决方案如下:
- 找到train_models/mtcnn_model.py,找到第186行与第232行,将 activation_fn = prelu删掉即可。
- 同时找到main函数里,具体是215行,将网络改成相应的网络。
- 运行 gen_landmark_aug_24.py来为RNet生成人脸特征点的训练数据
- 运行 gen_imglist_rnet.py来合并两部分训练数据
- 运行 gen_RNet_tfrecords.py来生成RNet的tfrecords,值得注意的是,这个程序需要运行四次,每次都要更改一些参数来生成neg,pos,part, landmark的tfrecords.具体如下:
修改gen_RNet_tfrecords.py 和 gen_ONet_tfrecords.py里相应的函数修改为下面的代码:
def get_dataset(dir, net):
#item = 'imglists/PNet/train_%s_raw.txt' % net
#item = 'imglists/PNet/train_%s_landmark.txt' % net
#------运行四次时,依次取消下面的注释---------
#item = '%s/landmark_%s_aug.txt' % (net,net) #if you want to generate landmark_landmark tfrecord,uncomment this line.
#item = '%s/pos_%s.txt' % (net,net) #if you want to generate pos_landmark tfrecord,uncomment this line.
#item = '%s/neg_%s.txt' % (net,net) #if you want to generate neg_landmark tfrecord,uncomment this line.
item = '%s/part_%s.txt' % (net,net) #if you want to generate part_landmark tfrecord,uncomment this line.
def get_output_filename(output_dir, name, net):
#st = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#return '%s/%s%s_%s.tfrecord' % (output_dir, name, net, st)
#return '%s/train_PNet_landmark.tfrecord' % (output_dir)
#------运行四次时,依次取消下面的注释---------
#return '%s/landmark_landmark.tfrecord' % (output_dir) #if you want to generate landmark_landmark tfrecord,uncomment this line.
#return '%s/pos_landmark.tfrecord' % (output_dir) #if you want to generate pos_landmark tfrecord,uncomment this line.
#return '%s/neg_landmark.tfrecord' % (output_dir) #if you want to generate neg_landmark tfrecord,uncomment this line.
return '%s/part_landmark.tfrecord' % (output_dir) #if you want to generate part_landmark tfrecord,uncomment this line.
- 运行 train_models/train_RNet.py训练RNet,训练完PNet之后运行gen_hard_example来为ONet生成人脸检测部分的训练数据
- 运行gen_landmark_aug_48.py来为ONet生成人脸特征点检测的训练数据
- 运行gen_imglist_onet.py合并这两部分数据
- 运行gen_ONet_tfrecords.py来生成ONet的tfrecords,同样还是按照上述方法跑四次。
- 运行 train_models/train_ONet.py训练ONet,大功告成。