MTCNN算法与代码理解—人脸检测和人脸对齐联合学习

MTCNN是一种通过级联CNN结构实现人脸检测和对齐的算法,采用多任务学习,包括P-Net、R-Net、O-Net三个阶段。它在2016年取得最佳效果并广泛应用于人脸识别。算法的关键在于精心设计的级联架构、在线困难样本挖掘和人脸对齐的联合学习。训练涉及多任务损失函数,包括分类和回归,并针对不同数据类型有不同的训练策略。
摘要由CSDN通过智能技术生成

博客:blog.shinelee.me | 博客园 | CSDN

写在前面

主页https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html
论文https://arxiv.org/abs/1604.02878
代码官方matlab版C++ caffe版
第三方训练代码tensorflowmxnet

MTCNN,恰如论文标题《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》所言,采用级联CNN结构,通过多任务学习,同时完成了两个任务——人脸检测和人脸对齐,输出人脸的Bounding Box以及人脸的关键点(眼睛、鼻子、嘴)位置

MTCNN 又好又快,提出时在FDDBWIDER FACEAFLW数据集上取得了当时(2016年4月)最好的结果,速度又快,现在仍被广泛使用作为人脸识别的前端,如InsightFacefacenet

MTCNN效果为什么好,文中提了3个主要的原因:

  1. 精心设计的级联CNN架构(carefully designed cascaded CNNs architecture)
  2. 在线困难样本挖掘(online hard sample mining strategy)
  3. 人脸对齐联合学习(joint face alignment learning)

下面详细介绍。

算法Pipeline详解

总体而言,MTCNN方法可以概括为:图像金字塔+3阶段级联CNN,如下图所示

MTCNN Pipeline

对输入图像建立金字塔是为了检测不同尺度的人脸,通过级联CNN完成对人脸 由粗到细(coarse-to-fine) 的检测,所谓级联指的是 前者的输出是后者的输入,前者往往先使用少量信息做个大致的判断,快速将不是人脸的区域剔除,剩下可能包含人脸的区域交给后面更复杂的网络,利用更多信息进一步筛选,这种由粗到细的方式在保证召回率的情况下可以大大提高筛选效率。下面为MTCNN中级联的3个网络(P-Net、R-Net、O-Net),可以看到它们的网络层数逐渐加深输入图像的尺寸(感受野)在逐渐变大12→24→48最终输出的特征维数也在增加32→128→256,意味着利用的信息越来越多。

the architectures of P-Net, R-Net, and O-Net

工作流程是怎样的?
首先,对原图通过双线性插值构建图像金字塔,可以参看前面的博文《人脸检测中,如何构建输入图像金字塔》。构建好金字塔后,将金字塔中的图像逐个输入给P-Net。

  • P-Net:其实是个全卷积神经网络(FCN),前向传播得到的特征图在每个位置是个32维的特征向量,用于判断每个位置处约 12 × 12 12\times12 12×12大小的区域内是否包含人脸,如果包含人脸,则回归出人脸的Bounding Box,进一步获得Bounding Box对应到原图中的区域,通过NMS保留分数最高的Bounding box以及移除重叠区域过大的Bounding Box。
  • O-Net:是单纯的卷积神经网络(CNN),先将P-Net认为可能包含人脸的Bounding Box 双线性插值 24 × 24 24\times24 24×24,输入给O-Net,判断是否包含人脸,如果包含人脸,也回归出Bounding Box,同样经过NMS过滤。
  • R-Net:也是纯粹的卷积神经网络(CNN),将O-Net认为可能包含人脸的Bounding Box 双线性插值 48 × 48 48\times 48 48×48,输入给R-Net,进行人脸检测和关键点提取。

需要注意的是:

  1. face classification判断是不是人脸使用的是softmax,因此输出是2维的,一个代表是人脸,一个代表不是人脸
  2. bounding box regression回归出的是bounding box左上角和右下角的偏移 d x 1 , d y 1 , d x 2 , d y 2 dx1, dy1, dx2, dy2 dx1,dy1,dx2,dy2,因此是4维的
  3. facial landmark localization回归出的是左眼、右眼、鼻子、左嘴角、右嘴角共5个点的位置,因此是10维的
  4. 训练阶段,3个网络都会将关键点位置作为监督信号来引导网络的学习, 但在预测阶段,P-Net和R-Net仅做人脸检测,不输出关键点位置(因为这时人脸检测都是不准的),关键点位置仅在O-Net中输出。
  5. Bounding box关键点输出均为归一化后的相对坐标,Bounding Box是相对待检测区域(R-Net和O-Net是相对输入图像),归一化是相对坐标除以检测区域的宽高,关键点坐标是相对Bounding box的坐标,归一化是相对坐标除以Bounding box的宽高,这里先建立起初步的印象,具体可以参看后面准备训练数据部分和预测部分的代码细节。

MTCNN效果好的第1个原因是精心设计的级联CNN架构,其实,级联的思想早已有之,而使用级联CNN进行人脸检测的方法是在2015 CVPR《A convolutional neural network cascade for face detection》中被率先提出,MTCNN与之的差异在于:

  • 减少卷积核数量(层内)
  • 5 × 5 5\times 5 5×5的卷积核替换为 3 × 3 3\times 3 3×3
  • 增加网络深度

这样使网络的表达能力更强,同时运行时间更少。

MTCNN效果好的后面2个原因在线困难样本挖掘人脸对齐联合学习将在下一节介绍。

如何训练

损失函数

MTCNN的多任务学习有3个任务,1个分类2个回归,分别为face classification、bounding box regression以及facial landmark localization,分类的损失函数使用交叉熵损失,回归的损失函数使用欧氏距离损失,如下:

MTCNN loss function

对于第 i i i个样本, L i d e t L_i^{det} Lidet为判断是不是人脸的交叉熵损失, L i b o x L_i^{box} Libox为bounding box回归的欧式距离损失, L i l a n d m a r k L_i^{landmark} Li<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值