# mtcnn **Repository Path**: JamesBingWu/mtcnn ## Basic Information - **Project Name**: mtcnn - **Description**: mtcnn模型——mindspore-gpu - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-07-06 - **Last Updated**: 2022-08-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 目录 ## MTCNN描述 MTCNN(Multi-task Cascaded Convolutional Networks)是一种多任务级联卷积神经网络,用以同时处理人脸检测和人脸关键点定位问题。作者认为人脸检测和人脸关键点检测两个任务之间往往存在着潜在的联系,然而大多数方法都未将两个任务有效的结合起来,MTCNN充分利用两任务之间潜在的联系,将人脸检测和人脸关键点检测同时进行,可以实现人脸检测和5个特征点的标定。 [论文](https://kpzhang93.github.io/MTCNN_face_detection_alignment/): Zhang K , Zhang Z , Li Z , et al. Joint Face Detection and Alignment Using Multitask Cascaded Convolutional Networks[J]. IEEE Signal Processing Letters, 2016, 23(10):1499-1503. ## 模型架构 MTCNN为了解决人脸识别的两阶段问题,提出三个级联的多任务卷积神经网络(Proposal Network (P-Net)、Refine Network (R-Net)、Output Network (O-Net),每个多任务卷积神经网络均有三个学习任务,分别是人脸分类、边框回归和关键点定位。每一级的输出作为下一级的输入。 ## 数据集 使用的数据集一共有三个: 1. [WIDER Face](http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/) 1. [Dataset of Deep Convolutional Network Cascade for Facial Point Detection](http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm) 1. [FDDB](http://vis-www.cs.umass.edu/fddb/index.html) 详细地, ### WIDER Face - WIDER Face数据集用于训练模型,下载训练数据WIDER Face Training Images,解压下载的WIDER_train数据集于项目dataset文件夹下。 - 下载WIDER Face的[标注文件](http://shuoyang1213.me/WIDERFACE/support/bbx_annotation/wider_face_split.zip),解压并将wider_face_train_bbx_gt.txt文件保存在dataset文件夹下。 - 数据集大小:包含32,203张图片,393,703个标注人脸。 - WIDER_train: 1.4G - 检查WIDER_train文件夹在dataset文件夹下,并检查dataset文件下含有wider_face_train_bbx_gt.txt文件,包含人脸标注信息。 ### Dataset of Deep Convolutional Network Cascade for Facial Point Detection - 该数据集用于训练模型,下载数据集Training set并解压,将其中的lfw_5590和net_7876文件夹以及trainImageList.txt文件放置在datatset文件夹下。 - 数据集大小:包含5,590张LFW图片和7,876张其他图片。 - lfw_5590:58M - net_7876:100M - 检查trainImageList.txt文件、lfw_5590文件夹和net_7876文件夹在dataset文件夹下。 ### FDDB - FDDB数据集用来评估模型,下载[originalPics.tar.gz](http://vis-www.cs.umass.edu/fddb/originalPics.tar.gz)压缩包和[FDDB-folds.tgz](http://vis-www.cs.umass.edu/fddb/FDDB-folds.tgz)压缩包,originalPics.tar.gz压缩包包含未标注的图片,FDDB-folds.tgz包含标注信息。 - 数据集大小:包含2,845张图片和5,171个人脸标注。 - originalPics.tar.gz:553M - FDDB-folds.tgz:1M - 在dataset文件夹下新建文件夹FDDB。 - 解压originalPics.tar.gz至FDDB,包含两个文件夹2002和2003: ````bash ├── 2002 │ ├── 07 │ ├── 08 │ ├── 09 │ ├── 10 │ ├── 11 │ └── 12 ├── 2003 │ ├── 01 │ ├── 02 │ ├── 03 │ ├── 04 │ ├── 05 │ ├── 06 │ ├── 07 │ ├── 08 │ └── 09 ```` - 解压FDDB-folds.tgz至FDDB,包含20个txt文件: ```bash FDDB-folds │ ├── FDDB-fold-01-ellipseList.txt │ ├── FDDB-fold-01.txt │ ├── FDDB-fold-02-ellipseList.txt │ ├── FDDB-fold-02.txt │ ├── FDDB-fold-03-ellipseList.txt │ ├── FDDB-fold-03.txt │ ├── FDDB-fold-04-ellipseList.txt │ ├── FDDB-fold-04.txt │ ├── FDDB-fold-05-ellipseList.txt │ ├── FDDB-fold-05.txt │ ├── FDDB-fold-06-ellipseList.txt │ ├── FDDB-fold-06.txt │ ├── FDDB-fold-07-ellipseList.txt │ ├── FDDB-fold-07.txt │ ├── FDDB-fold-08-ellipseList.txt │ ├── FDDB-fold-08.txt │ ├── FDDB-fold-09-ellipseList.txt │ ├── FDDB-fold-09.txt │ ├── FDDB-fold-10-ellipseList.txt │ ├── FDDB-fold-10.txt ``` - 检查2002,2003,FDDB-folds三个文件夹在FDDB文件夹下,且FDDB文件夹在dataset文件夹下。 --------- 综上,一共有两个训练集,分别是WIDER Face和Dataset of Deep Convolutional Network Cascade for Facial Point Detection;一个测试集FDDB。 总的数据集目录结构如下: ```bash dataset ├── FDDB ├── 2002 ├── 2003 └── FDDB-folds ├── lfw_5590 ├── net_7876 ├── trainImageList.txt ├── wider_face_train_bbx_gt.txt └── WIDER_train └── images ``` ## 环境要求 - 硬件(Ascend/GPU/CPU) - 使用GPU搭建硬件环境 - 框架 [MindSpore](https://www.mindspore.cn/install/en) - 如需查看详情,请参见如下资源: - [MindSpore教程](https://www.mindspore.cn/tutorials/zh-CN/master/index.html) - [MindSpore Python API](https://www.mindspore.cn/docs/api/zh-CN/master/index.html) ## 快速入门 通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估: 在开始训练前,需要对wider_face_train_bbx_gt.txt文件进行预处理以生成wider_face_train.txt文件。 ````bash # 预处理wider_face_train_bbx_gt.txt文件 # 切换到项目主目录 python preprocess.py # 成功执行后dataset文件夹下出现wider_face_train.txt ```` 因为MTCNN由PNet, RNet, ONet三个子模型组成,因此训练过程总体分为三大步骤: 1. 训练PNet ```bash # 1-1. 生成用于训练PNet模型的mindrecord文件,默认保存在mindrecords文件夹中 bash scripts/generate_train_mindrecord_pnet.sh ``` ``` bash # 1-2. 待mindrecord文件生成完毕,开始训练PNet模型 # 单卡训练 bash scripts/run_standalone_train_gpu.sh pnet DEVICE_ID MINDRECORD_FILE # example: bash scripts/run_standalone_train_gpu.sh pent 0 mindrecords/PNet_train.mindrecord # 多卡训练 bash scripts/run_distribute_train.sh pnet DEVICE_NUM MINDRECORD_FILE # example: bash scripts/run_distribute_train.sh pnet 8 mindrecords/PNET_train.mindrecord ``` 2. 训练RNet ```bash # 2-1. 生成用于训练RNet模型的mindrecord文件,默认保存在mindrecords文件夹中 bash scripts/generate_train_mindrecord_rnet.sh PNET_CKPT # example: scripts/generate_train_mindrecord_rnet.sh checkpoints/pnet.ckpt ``` ```bash # 2-2. 待mindrecord文件生成完毕,开始训练RNet模型 # 单卡训练 bash scripts/run_standalone_train_gpu.sh rnet DEVICE_ID MINDRECORD_FILE # example: bash scripts/run_standalone_train_gpu.sh rnet 0 mindrecords/RNET_train.mindrecord # 多卡训练 bash scripts/run_distribute_train_gpu.sh rnet DEVICE_NUM MINDRECORD_FILE # example: bash scripts/rum_distribute_train_gpu.sh rnet 8 mindrecords/RNET_train.mindrecord ``` 3. 训练ONet ```bash # 3-1. 生成用于训练ONet模型的mindrecord文件,默认保存在mindrecords文件夹中 bash scripts/generate_train_mindrecord_onet.sh PNET_CKPT RNET_CKPT # example: bash scripts/generate_train_mindrecord_onet.sh checkpoints/pnet.ckpt checkpoints/rnet.ckpt ``` ```bash # 3-2. 待mindrecord文件生成完毕,开始训练ONet模型 # 单卡训练 bash scripts/run_standalone_train_gpu.sh onet DEVICE_ID MINDRECORD_FILE # example: bash scripts/run_standalone_train_gpu.sh onet 0 mindrecords/ONET_train.mindrecord # 多卡训练 bash scripts/run_distribute_train_gpu.sh onet DEVICE_NUM MINDRECORD_FILE # example: bash scripts/rum_distribute_train_gpu.sh onet 8 mindrecords/ONET_train.mindrecord ``` 训练完毕后,开始评估MTCNN模型。 ``` bash # 评估模型 bash scripts/run_eval_gpu.sh PNET_CKPT RNET_CKPT ONET_CKPT # example: bash scripts/run_eval_gpu.sh checkpoints/pnet.ckpt checkpoints/rnet.ckpt checkpoints/onet.ckpt ``` ## 脚本说明 ### 脚本及样例代码 ```bash MTCNN ├── dataset // 保存原始数据集和标注文件(需要自行创建该文件夹) ├── eval.py // 评估脚本 ├── preprocess.py // wider_face_train_bbx_gt.txt文件预处理脚本 ├── README_CN.md // MTCNN中文描述文档 ├── config.py // 配置文件 ├── scripts │ ├── generate_train_mindrecord_pnet.sh // 生成用于训练PNet的mindrecord文件shell脚本 │ ├── generate_train_mindrecord_rnet.sh // 生成用于训练RNet的mindrecord文件shell脚本 │ ├── generate_train_mindrecord_onet.sh // 生成用于训练ONet的mindrecord文件shell脚本 │ ├── run_distributed_train_gpu.sh // GPU多卡训练shell脚本 │ ├── run_eval_gpu.sh // GPU模型评估shell脚本 │ └── run_standalone_train_gpu.sh // GPU单卡训练shell脚本 ├── src │ ├── acc_callback.py // 自定义训练回调函数脚本 │ ├── dataset.py // 创建Mindspore数据集脚本 │ ├── evaluate.py // 模型评估脚本 │ ├── loss.py // 损失函数 │ ├── utils.py // 工具函数 │ ├── models │ │ ├── mtcnn.py // MTCNN模型 │ │ ├── mtcnn_detector.py // MTCNN检测器 │ │ └── predict_nets.py // 模型推理函数 │ ├── prepare_data │ │ ├── generate_PNet_data.py // 生成PNet的mindrecord文件 │ │ ├── generate_RNet_data.py // 生成RNet的mindrecord文件 │ │ └── generate_ONet_data.py // 生成ONet的mindrecord文件 │ └── train_models │ ├── train_p_net.py // 训练PNet脚本 │ ├── train_r_net.py // 训练RNet脚本 │ └── train_o_net.py // 训练ONet脚本 └── train.py // 训练模型脚本 ``` ### 脚本参数 #### wider_face_train_bbx_gt.txt预处理 ```bash usage: preprocess.py [-f F] Preprocess WIDER Face Annotation file optional arguments: -f F Original wider face train annotaion file ``` #### 训练模型 ```bash usage: train.py --model {pnet,rnet,onet} --mindrecord_file MINDRECORD_FILE [--ckpt_path CKPT_PATH] [--save_ckpt_steps SAVE_CKPT_STEPS] [--max_ckpt MAX_CKPT] [--end_epoch END_EPOCH] [--lr LR] [--batch_size BATCH_SIZE] [--device_target {GPU,Ascend}] [--distribute] [--num_workers NUM_WORKERS] Train PNet/RNet/ONet optional arguments: --model {pnet,rnet,onet} Choose model to train --mindrecord_file MINDRECORD_FILE mindrecord file for training --ckpt_path CKPT_PATH save checkpoint directory --save_ckpt_steps SAVE_CKPT_STEPS steps to save checkpoint --max_ckpt MAX_CKPT maximum number of ckpt --end_epoch END_EPOCH end epoch of training --lr LR learning rate --batch_size BATCH_SIZE train batch size --device_target {GPU,Ascend} device for training --distribute --num_workers NUM_WORKERS ``` #### 评估模型 ```bash usage: eval.py --pnet_ckpt PNET_CKPT --rnet_ckpt RNET_CKPT --onet_ckpt ONET_CKPT Evaluate MTCNN on FDDB dataset optional arguments: --pnet_ckpt PNET_CKPT, -p PNET_CKPT checkpoint of PNet --rnet_ckpt RNET_CKPT, -r RNET_CKPT checkpoint of RNet --onet_ckpt ONET_CKPT, -o ONET_CKPT checkpoint of ONet ``` #### 配置参数 ```bash config.py: DATASET_DIR: 原始数据集文件夹 FDDB_DIR: 验证数据集FDDB文件夹 TRAIN_DATA_DIR: 训练数据集文件夹,保存用于生成mindrecord的临时数据文件 MINDRECORD_DIR: mindrecord文件夹 CKPT_DIR: checkpoint文件夹 LOG_DIR: logs文件夹 RADIO_CLS_LOSS:classification loss比例 RADIO_BOX_LOSS:box loss比例 RADIO_LANDMARK_LOSS: landmark loss比例 TRAIN_BATCH_SIZE: 训练batch size大小 TRAIN_LR: 默认学习率 END_EPOCH: 训练轮数 MIN_FACE_SIZE: 脸最小尺寸 SCALE_FACTOR: 缩放比例 P_THRESH: PNet阈值 R_THRESH: RNet阈值 O_THRESH: ONet阈值 ``` ## 训练过程 在开始训练之前,需要先在主目录下创建dataset文件夹,按照数据集部分的步骤下载并保存原始数据集文件在dataset文件夹下。 dataset文件夹准备完毕后,即可开始数据预处理、训练集生成以及模型训练。 因为MTCNN由PNet, RNet和ONet三个子模型串联而成,因此整个训练过程分为三大步骤: ### 1. 训练PNet ```bash # 预处理wider_face_train_bbx_gt.txt文件 python preprocess.py # 生成用于训练PNet的mindrecord文件 bash scripts/generate_train_mindrecord_pnet.sh ``` 运行后,将产生`generate_pnet_mindrecord.log`日志文件,保存于`logs`文件夹下。 运行完成后,生成`PNet_train.mindrecord`文件,默认保存在`mindrecords`文件夹下。 #### 单卡训练PNet ```bash bash scripts/run_standalone_train_gpu.sh pnet [DEVICE_ID] [MINDRECORD_FILE] # example: bash scripts/run_standalone_train_gpu.sh pnet 0 mindrecords/PNet_train.mindrecord ``` 训练过程会在后台运行,训练模型将保存在`checkpoints/single_rank`文件夹中,可以通过`logs/training_gpu_pnet.log`文件查看训练输出,输出结果如下所示: ```bash epoch: 3 step: 5251, loss is 0.23660370707511902 epoch: 3 step: 5252, loss is 0.34514105319976807 epoch: 3 step: 5253, loss is 0.2584073543548584 epoch: 3 step: 5254, loss is 0.27220091223716736 epoch: 3 step: 5255, loss is 0.27572113275527954 epoch: 3 step: 5256, loss is 0.2557501792907715 epoch: 3 step: 5257, loss is 0.2680498957633972 epoch: 3 step: 5258, loss is 0.28304949402809143 epoch: 3 step: 5259, loss is 0.2415134757757187 epoch: 3 step: 5260, loss is 0.32401952147483826 epoch: 3 step: 5261, loss is 0.2538865804672241 epoch: 3 step: 5262, loss is 0.25765320658683777 epoch: 3 step: 5263, loss is 0.2678167521953583 epoch: 3 step: 5264, loss is 0.2987630367279053 epoch: 3 step: 5265, loss is 0.2540401816368103 epoch: 3 step: 5266, loss is 0.29490023851394653 epoch: 3 step: 5267, loss is 0.30698898434638977 epoch: 3 step: 5268, loss is 0.33522605895996094 epoch: 3 step: 5269, loss is 0.3006625175476074 epoch: 3 step: 5270, loss is 0.18212208151817322 epoch: 3 step: 5271, loss is 0.3041674494743347 epoch: 3 step: 5272, loss is 0.28812840580940247 epoch: 3 step: 5273, loss is 0.2859807312488556 epoch: 3 step: 5274, loss is 0.3787861168384552 epoch: 3 step: 5275, loss is 0.30436971783638 epoch: 3 step: 5276, loss is 0.24277956783771515 epoch: 3 step: 5277, loss is 0.31508031487464905 epoch: 3 step: 5278, loss is 0.34478887915611267 epoch: 3 step: 5279, loss is 0.3202991187572479 ··· ``` #### 多卡训练PNet ```bash bash scripts/run_distributed_train_gpu.sh pnet [DEVICE_NUM] [MINDRECORD_FILE] # example: bash scripts/run_distributed_train_gpu.sh pnet 8 mindrecord/PNet_train.mindrecord ``` 训练过程会在后台运行,只保存第一张卡的训练模型,训练模型将保存在`checkpoints/distribute_rank0`文件夹中,可以通过`logs/distribute_training_gpu_pnet.log`文件查看训练输出,输出结果如下所示: ```bash epoch: 32 step: 951, loss is 0.2749897241592407 epoch: 32 step: 952, loss is 0.21657834947109222 epoch: 32 step: 953, loss is 0.23599888384342194 epoch: 32 step: 954, loss is 0.2910762131214142 epoch: 32 step: 955, loss is 0.24090512096881866 epoch: 32 step: 956, loss is 0.2586892247200012 epoch: 32 step: 957, loss is 0.25208911299705505 epoch: 32 step: 958, loss is 0.26607948541641235 epoch: 32 step: 959, loss is 0.27760857343673706 epoch: 32 step: 960, loss is 0.305815726518631 epoch: 32 step: 961, loss is 0.2672029733657837 epoch: 32 step: 962, loss is 0.28443169593811035 epoch: 32 step: 963, loss is 0.3534330725669861 ... ``` ### 2. 训练RNet ``` bash # 生成用于训练RNet的mindrecord文件 bash scripts/generate_train_mindrecord_rnet.sh [PNET_CKPT] # example: bash scripts/generate_train_mindrecord_rnet.sh checkpoints/pnet.ckpt ``` 将产生`generate_rnet_mindrecord.log`日志文件,保存于`logs`文件夹下。 运行完成后,生成`RNet_train.mindrecord`文件,默认保存在`mindrecords`文件夹下。 #### 单卡训练RNet ```bash bash scripts/run_standalone_train_gpu.sh rnet [DEVICE_ID] [MINDRECORD_FILE] # example: bash scripts/run_standalone_train_gpu.sh rnet 0 mindrecords/RNet_train.mindrecord ``` 训练过程会在后台运行,训练模型将保存在`checkpoints/single_rank`文件夹中,可以通过`logs/training_gpu_rnet.log`文件查看训练输出,输出结果如下所示: ```bash epoch: 4 step: 977, loss is 0.11666364967823029 epoch: 4 step: 978, loss is 0.11807325482368469 epoch: 4 step: 979, loss is 0.24172309041023254 epoch: 4 step: 980, loss is 0.1319468915462494 epoch: 4 step: 981, loss is 0.19084466993808746 epoch: 4 step: 982, loss is 0.2393287718296051 epoch: 4 step: 983, loss is 0.2688186764717102 epoch: 4 step: 984, loss is 0.1218106672167778 epoch: 4 step: 985, loss is 0.20158495008945465 epoch: 4 step: 986, loss is 0.16333498060703278 epoch: 4 step: 987, loss is 0.1163112223148346 epoch: 4 step: 988, loss is 0.1712242215871811 epoch: 4 step: 989, loss is 0.2437034547328949 epoch: 4 step: 990, loss is 0.14970020949840546 ··· ``` #### 多卡训练RNet ```bash bash scripts/run_distributed_train_gpu.sh rnet [DEVICE_NUM] [MINDRECORD_FILE] # example: bash scripts/run_distributed_train_gpu.sh rnet 8 mindrecord/RNet_train.mindrecord ``` 训练过程会在后台运行,只保存第一张卡的训练模型,训练模型将保存在`checkpoints/distribute_rank0`文件夹中,可以通过`logs/distribute_training_gpu_rnet.log`文件查看训练输出,输出结果如下所示: ```bash epoch: 3 step: 399, loss is 0.28467029333114624 epoch: 3 step: 414, loss is 0.2579796314239502 epoch: 3 step: 403, loss is 0.32600703835487366 epoch: 2 step: 268, loss is 0.33735185861587524 epoch: 3 step: 368, loss is 0.3756731152534485 epoch: 3 step: 370, loss is 0.3082232177257538 epoch: 3 step: 379, loss is 0.323677659034729 epoch: 3 step: 406, loss is 0.4128563404083252 ... ``` ### 3. 训练ONet ``` bash # 生成用于训练ONet的mindrecord文件 bash scripts/generate_train_mindrecord_onet.sh [PNET_CKPT] [RNET_CKPT] # example: bash scripts/generate_train_mindrecord_rnet.sh checkpoints/pnet.ckpt checkpoints/rnet.ckpt ``` 将产生`generate_onet_mindrecord.log`日志文件,保存于`logs`文件夹下。 运行完成后,生成`ONet_train.mindrecord`文件,默认保存在`mindrecords`文件夹下。 #### 单卡训练ONet ```bash bash scripts/run_standalone_train_gpu.sh onet [DEVICE_ID] [MINDRECORD_FILE] # example: bash scripts/run_standalone_train_gpu.sh onet 0 mindrecords/ONet_train.mindrecord ``` 训练过程会在后台运行,训练模型将保存在`checkpoints/single_rank`文件夹中,可以通过`logs/training_gpu_onet.log`文件查看训练输出,输出结果如下所示: ```bash epoch: 1 step: 2297, loss is 0.1711895614862442 epoch: 1 step: 2298, loss is 0.15471038222312927 epoch: 1 step: 2299, loss is 0.14111976325511932 epoch: 1 step: 2300, loss is 0.1571352779865265 epoch: 1 step: 2301, loss is 0.12659740447998047 epoch: 1 step: 2302, loss is 0.15625852346420288 epoch: 1 step: 2303, loss is 0.15753498673439026 epoch: 1 step: 2304, loss is 0.1298990249633789 epoch: 1 step: 2305, loss is 0.06691041588783264 epoch: 1 step: 2306, loss is 0.2363453358411789 epoch: 1 step: 2307, loss is 0.1818249672651291 epoch: 1 step: 2308, loss is 0.18366925418376923 epoch: 1 step: 2309, loss is 0.26212823390960693 epoch: 1 step: 2310, loss is 0.219395250082016 epoch: 1 step: 2311, loss is 0.15139049291610718 epoch: 1 step: 2312, loss is 0.16559019684791565 epoch: 1 step: 2313, loss is 0.10367508232593536 epoch: 1 step: 2314, loss is 0.2061292976140976 epoch: 1 step: 2315, loss is 0.17241860926151276 epoch: 1 step: 2316, loss is 0.1200847178697586 epoch: 1 step: 2317, loss is 0.1870795339345932 epoch: 1 step: 2318, loss is 0.17522504925727844 epoch: 1 step: 2319, loss is 0.12924939393997192 epoch: 1 step: 2320, loss is 0.10786916315555573 epoch: 1 step: 2321, loss is 0.1464981585741043 epoch: 1 step: 2322, loss is 0.16420891880989075 epoch: 1 step: 2323, loss is 0.16585564613342285 epoch: 1 step: 2324, loss is 0.19770380854606628 epoch: 1 step: 2325, loss is 0.16236989200115204 epoch: 1 step: 2326, loss is 0.21390074491500854 epoch: 1 step: 2327, loss is 0.16150733828544617 epoch: 1 step: 2328, loss is 0.24075555801391602 epoch: 1 step: 2329, loss is 0.14488619565963745 epoch: 1 step: 2330, loss is 0.20462839305400848 epoch: 1 step: 2331, loss is 0.15032608807086945 epoch: 1 step: 2332, loss is 0.1420859843492508 epoch: 1 step: 2333, loss is 0.09253405779600143 epoch: 1 step: 2334, loss is 0.16005948185920715 epoch: 1 step: 2335, loss is 0.1367063671350479 epoch: 1 step: 2336, loss is 0.09677258133888245 ··· ``` #### 多卡训练ONet ```bash bash scripts/run_distributed_train_gpu.sh onet [DEVICE_NUM] [MINDRECORD_FILE] # example: bash scripts/run_distributed_train_gpu.sh onet 8 mindrecord/ONet_train.mindrecord ``` 训练过程会在后台运行,只保存第一张卡的训练模型,训练模型将保存在`checkpoints/distribute_rank0`文件夹中,可以通过`logs/distribute_training_gpu_onet.log`文件查看训练输出,输出结果如下所示: ```bash epoch: 1 step: 19, loss is 0.8007889986038208 epoch: 1 step: 19, loss is 0.9112601280212402 epoch: 1 step: 19, loss is 0.919980525970459 epoch: 1 step: 18, loss is 0.8301095366477966 epoch: 1 step: 19, loss is 0.9067224264144897 epoch: 1 step: 19, loss is 0.8360832929611206 epoch: 1 step: 19, loss is 0.8765885233879089 epoch: 1 step: 14, loss is 1.0187568664550781 epoch: 1 step: 20, loss is 0.9025142788887024 epoch: 1 step: 20, loss is 0.8888133764266968 epoch: 1 step: 20, loss is 0.848777174949646 epoch: 1 step: 19, loss is 0.8055309057235718 ... ``` ## 评估过程 ```bash bash scripts/run_eval_gpu.sh [PNET_CKPT] [RNET_CKPT] [ONET_CKPT] # example: bash scripts/run_eval_gpu.sh checkpoints/pnet.ckpt checkpoints/rnet.ckpt checkpoints/onet.ckpt ``` 评估过程会在后台进行,评估结果可以通过`logs/eval_gpu.log`文件查看,输出结果如下所示: ```bash ==================== Results ==================== FDDB-fold-1 Val AP: 0.846041313059397 FDDB-fold-2 Val AP: 0.8452332863014286 FDDB-fold-3 Val AP: 0.854312327697665 FDDB-fold-4 Val AP: 0.8449615417375469 FDDB-fold-5 Val AP: 0.868903617729559 FDDB-fold-6 Val AP: 0.8857753502792894 FDDB-fold-7 Val AP: 0.8200462708769559 FDDB-fold-8 Val AP: 0.8390865359172448 FDDB-fold-9 Val AP: 0.8584513847530266 FDDB-fold-10 Val AP: 0.8363366158400566 FDDB Dataset Average AP: 0.8499148244192171 ================================================= ``` ## 模型描述 ## 性能 | 参数 | MTCNN | | -------------------- | ------------------------------------------------------- | | 资源 | GPU(Tesla V100 SXM2),CPU 2.1GHz 24cores,Memory 128G| | 上传日期 | 2022-08-05 | | MindSpore版本 | 1.8.0 | | 数据集 | WIDER Face, Dataset of Deep Convolutional Network Cascade for Facial Point Detection, FDDB | | 训练参数 | PNet: epoch=30,batch_size=384, lr=0.001; RNet: epoch=22, batch_size=384, lr=0.001; ONet: epoch=22, batch_size=384, lr=0.001 | | 优化器 | Adam | | 损失函数 | SoftmaxCrossEntropyWithLogits, MSELoss | | 输出 | 类别,坐标 | | 损失 | PNet: 0.20 RNet: 0.15 ONet: 0.04 | | 速度 | PNet: 6毫秒/步 RNet: 8毫秒/步 ONet: 18毫秒/步 | | 总时长 | 8时40分(单卡);1时22分(八卡) | | 微调检查点 | PNet: 1M (.ckpt文件) RNet: 2M (.ckpt文件) ONet: 6M (.ckpt文件) |