MTCNN算法笔记

1 介绍

多任务级联卷积神经网络(MTCNN, Multi-task Cascaded Convolutional Networks)用以同时处理人脸检测人脸关键点定位(5个关键点)问题,该论文入选2016的ECCV。

MTCNN算法笔记

作者认为人脸检测和人脸关键点检测两个任务之间往往存在着潜在的联系,然而大多数方法都未将两个任务有效的结合起来,本文为了充分利用两任务之间潜在的联系,提出一种多任务级联的人脸检测框架,将人脸检测和人脸关键点检测同时进行

MTCNN 包含三个级联的多任务卷积神经网络,分别是 Proposal Network (P-Net)、Refine Network (R-Net)、Output Network (O-Net),每个多任务卷积神经网络均有三个学习任务,分别是人脸分类、边框回归和关键点定位

2 训练数据集

人脸检测的训练数据可以从 http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/ 下载。

该数据集有 32,203 张图片,共有 93,703 张脸被标记,如下图所示:MTCNN算法笔记

文件的格式如下所示:

文件名:0_Parade_marchingband_1_20

标记框的数量:1

边界框:x1, y1, w, h, blur, expression, illumination, invalid, occlusion, pose

# 其中 x1,y1 为标记框左上角的坐标,w,h 为标记框的宽度

# blur, expression, illumination, invalid, occlusion, pose 为标记框的属性,比如是否模糊,光照情况,是否遮挡,是否有效,姿势等。

 

人脸关键点的训练数据可从 http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm 下载。

该数据集包含 5,590 张 LFW 数据集的图片和 7,876 张从网站下载的图片。如下所示:

MTCNN算法笔记

标记文件的格式为:

lfw_5590\Abbas_Kiarostami_0001.jpg 75 165 87 177 106.750000 108.250000 143.750000 108.750000 131.250000 127.250000 106.250000 155.250000 142.750000 155.250000

第一个数据为文件名:lfw_5590\Abbas_Kiarostami_0001.jpg

第二和第三个数据为标记框左上角坐标:  75 165 

第四和第五个数据为标记框长宽:  87 177

第六和第七个数据为左眼标记点:106.750000 108.250000 

第八和第九个数据为右眼标记点:143.750000 108.750000 

第十和第十一个数据为鼻子标记点:131.250000 127.250000

第十二和第十三个数据为左嘴标记点:106.250000 155.250000 

第十四和第十五个数据为右嘴标记点:142.750000 155.250000

3 代码实现

汇总:https://github.com/open-face/mtcnn

Matlab + Caffe:https://github.com/kpzhang93/MTCNN_face_detection_alignment (论文作者)

Caffe:https://github.com/dlunion/mtcnn

TensorFlow:https://github.com/davidsandberg/facenet  (最为通用的tf版mtcnn)

4 训练流程

MTCNN算法笔记

输入原始图片和 PNet 生成预测的 bounding boxes。

输入原始图片和 PNet 生成的 bounding box,通过 RNet,生成校正后的 bounding box。

输入原始图片和 RNet 生成的 bounding box,通过 ONet,生成校正后的 bounding box 和人脸面部轮廓关键点。

网络结构

MTCNN算法笔记

 

照片会按照不同的缩放比例,缩放成不同大小的图片,形成图片的特征金字塔。

网络实现人脸检测(人脸分类、边框回归)和关键点定位分为三个阶段:

第一阶段:

由 P-Net 获得了人脸区域的候选窗口和边界框的回归向量,并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。

MTCNN算法笔记

1 该训练网络的输入是一个 12×12 大小的图片,所以训练前需要生成 PNet 网络的训练数据。

训练数据可以通过和 Guarantee True Box 的 IOU 的计算生成一系列的 bounding box。可以通过滑动窗口或者随机采样的方法获取训练数据,训练数据分为三种正样本,负样本,中间样本其中正阳本是生成的滑动窗口和 Guarantee True Box 的 IOU 大于 0.65,负样本是 IOU 小于 0.3,中间样本是 IOU 大于 0.4 小于 0.65

然后把 bounding box resize 成 12×12 大小的图片,转换成 12×12×3 的结构,生成 PNet 网络的训练数据。

2 训练数据通过 10 个 3×3×3 的卷积核,2×2 的 Max Pooling(stride=2)操作,生成 10 个 5×5 的特征图。

3 接着通过 16 个 3×3×10 的卷积核,生成 16 个 3×3 的特征图。

4 接着通过 32 个 3×3×16 的卷积核,生成 32 个 1×1 的特征图

5 最后针对 32 个 1×1 的特征图:(最后这一步依然是卷积,不是全连接

通过 2  个 1×1×32 的卷积核,生成 2  个 1×1 的特征图用于分类

通过 4  个 1×1×32 的卷积核,生成 4  个 1×1 的特征图用于回归框判断

通过10 个 1×1×32 的卷积核,生成 10 个 1×1 的特征图用于特征点的判断

 

第二阶段, P-Net 得出的候选框作为输入,输入到 R-Net,网络最后选用全连接的方式进行训练,利用边界框向量微调候选窗体,再利用NMS去除重叠窗体。。

MTCNN算法笔记

1 RNet 的训练数据生成类似于 PNet,检测数据为图片经过 PNet 网络后,检测出来的 bounding boxes,包括正样本,负样本和中间样本。

2 模型输入为 24×24 大小的图片,通过 28 个 3×3×3 的卷积核和 3×3(stride=2)的 max pooling 后生成 28 个 11×11 的特征图;

3 通过 48 个 3×3×28 的卷积核和 3×3(stride=2)的 max pooling 后生成 48 个 4×4 的特征图;

4 通过 64 个 2×2×48 的卷积核后,生成 64 个 3×3 的特征图

5 把 3×3×64 的特征图转换为 128 大小的全连接层

6 最后接入不同大小全连接层

回归框分类问题转换为大小为 2 的全连接层

对 bounding box 的位置回归问题,转换为大小为 4 的全连接层

人脸轮廓关键点转换为大小为 10 的全连接层

 

第三阶段,使用更加强大的CNN( O-Net),网络结构比R-Net多一层卷积,功能与R-Net作用一样,只是在去除重叠候选窗口的同时,显示五个人脸关键点定位。ONet 是网络的最后输出。

MTCNN算法笔记

1 ONet 的训练数据生成类似于 RNet,检测数据为图片经过 PNet 和 RNet 网络后,检测出来的 bounding boxes,包括正样本,负样本和中间样本。

2 模型输入是一个 48×48×3 大小的图片,通过 32 个 3×3×3 的卷积核和 3×3(stride=2)的 max pooling 后转换为 32 个 23×23 的特征图;

3 通过 64 个 3×3×32 的卷积核和 3×3(stride=2)的 max pooling 后转换为 64 个 10×10 的特征图;

4 通过 64 个 3×3×64 的卷积核和 3×3(stride=2)的 max pooling 后转换为 64 个 4×4 的特征图;

5 通过 128 个 2×2×64 的卷积核转换为 128 个 3×3 的特征图

6 通过全链接操作转换为 256 大小的全链接层;

7 最后接入不同大小全连接层

大小为 2 的回归框分类特征;

大小为 4 的回归框位置的回归特征;

大小为 10 的人脸轮廓关键点回归特征

6 损失函数

在具体训练过程中,作者就多任务学习的损失函数计算方式进行相应改进。

在多任务学习中,当不同类型的训练图像输入到网络时,有些任务时是不进行学习的,因此相应的损失应为 0

例如,当训练图像为背景(Non-face)时,边界框和关键点的 loss 应为 0,文中提供计算公式自动确定 loss 的选取,公式为:

MTCNN算法笔记

其中:

MTCNN算法笔记表示任务的重要程度:

    在 P-Net 和 R-Net 中,MTCNN算法笔记

    在 O-Net 中,要对关键点检测任务增大重要性,MTCNN算法笔记

MTCNN算法笔记作为样本类型指示器

7 Trike :在线hard-negative-mining

为了提升网络性能,需要hard-negative-mining,传统方法是通过研究训练好的模型进行挑选,而本文提出一种能在训练过程中进行挑选困难样本的在线挑选方法

1 在 mini-batch 中,对每个样本的损失进行排序,挑选前 70% 较大的损失对应的样本作为困难样本。

2 在反向传播时忽略那 30% 的样本,因为那 30% 样本对更新作用不大。

8 结果

MTCNN 在人脸检测数据集 FDDB 和 WIDER FACE 以及人脸关键点定位数据集 LFPW 均获得当时最佳成绩。

在运行时间方面,采用 2.60GHz 的 CPU 可以达到 16fps,采用 Nvidia Titan Black 可达 99fps。