许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  深度学习论文复现:MTCNN算法分析笔记(网络结构/训练)

深度学习论文复现:MTCNN算法分析笔记(网络结构/训练)

阅读数 5
点赞 0
article_banner


MTCNN算法分析笔记


1. 项目来源

(1)论文题目

本次复现的论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks ,原作者是使用Matlab进行算法实现的。

(2)实现目标

本次的任务是基于该论文的 Pytorch 实现,使用百度Paddle Paddle框架对其进行复现。这篇博客则是以论文的Pytorch复现为基础,对MTCNN论文与算法进行学习与分析。

(3)相关资源

按要求下载以下资源:

  • 参考Github前辈的复现代码,自己做了一点点修改 百度网盘:https://pan.baidu.com/s/14otWIZM8ix-dNoBkCYGoiA 提取码:xwet
  • WIDER FACE数据集中的wider_face_split.zip与WIDER_train.zip压缩包,解压后存放路径分别为: MTCNN_TUTORIAL-MASTER/data_set/wider_face_split/ MTCNN_TUTORIAL-MASTER/data_set/WIDER_train/
  • 登录FDDB官网下载数据集,包括原图Original images与标注文件Face annotations,存放路径分别为: MTCNN_TUTORIAL-MASTER/data_set/train/ MTCNN_TUTORIAL-MASTER/data_set/FDDB-folds/

2. 代码运行

由于本论文每个阶段的训练与测试过程都是按照PNet-RNet-ONet的顺序级联进行的,前一阶段的训练结果为后一阶段的网络输入,故而训练与测试均需要分多个阶段进行,下面将逐个对各阶段进行简要分析。

i)图像标注

在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的人脸框坐标。

ii)生成PNet训练数据

输入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训练数据的准备

iii)训练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三个标注文件。

iv)生成RNet训练数据

创建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三个标注文件

v)训练RNet

执行下述语句,功能大致与第三步中PNet网络训练相同

python train/Train_Pnet.py

vi)生成ONet训练数据

创建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

vii)训练ONet

执行下述语句,功能大致与第三步中PNet网络训练相同

python train/Train_Onet.py

自此,训练、验证阶段完成


下面展示一下我们的训练过程与测试结果~

训练过程之模型导入
在这里插入图片描述

   训练过程
在这里插入图片描述

测试过程:

在这里插入图片描述

测试效果:

size=300x200
size=300x200
size=300x200
size=300x200

size=300x200

size=300x200

   加载了训练好的模型,我们又训练了几轮,效果还挺好的,是吧~

3. 算法与代码分析

对照代码通读论文,对模型与算法进行一系列分析。

  • 整体来看,整个训练过程其实是三个网络按照P-R-O的顺序迭代进行的,包括训练与验证,都是级联进行的。同时,网络在整体上保持着数据准备(随机crop出训练用图像边框,并按其IOU值分为positive、part、negative三类)、数据扰乱、网络训练的顺序进行的,PRO三个网络首尾相接。
  • 网络在训练过程中,每一个stage分别对人脸二分类,边界框回归、人脸关键点三个任务进行loss值的运算。至于loss函数的选取,人脸二分类问题使用交叉熵损失函数,其余问题则应用均方误差MSE。 值得一提的是,由于PNet与RNet中feature map尺寸较小,对于landmark的识别较为困难,故而我们只在最后的ONet中引入人脸关键点检测的任务,故而也只有在ONet的训练过程中对人脸标志点landmark进行均方误差的计算。 下面的这张图或许具有一定的误导性,让你以为在PNet与RNet中同样进行landmark任务的训练,但其实作者在代码中已经给出了明确的答案。
  • 依靠上图,我们对网络架构进行解释:为了提升网络的性能,作者应用3x3滤波器代替5x5卷积核,激活函数方面则使用PReLu,大概是下图这个形状的。 至于PRO网络的具体形状,输入数据分别为12
    免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空