如何应用MTCNN和FaceNet模型实现人脸检测及识别

编辑 | Vincent
AI 前线导读:人脸检测是对人脸进行识别和处理的第一步,主要用于检测并定位图片中的人脸,返回高精度的人脸框坐标及人脸特征点坐标。人脸识别会进一步提取每一个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每一个人脸的身份。目前人脸检测 / 识别的应用场景逐渐从室内演变到室外,从单一限定场景发展到广场、车站、地铁口等场景,人脸检测 / 识别面临的要求也愈来愈高,好比:人脸尺度多变、数量冗大、姿式多样包括俯拍人脸、戴帽子口罩等的遮挡、表情夸张、化妆假装、光照条件恶劣、分辨率低甚至连肉眼都较难区分等。随着深度学习的发展,基于深度学习技术的人脸检测 / 识别方法取得了巨大的成功,本文主要介绍人脸检测的深度学习模型 MTCNN 和人脸识别的深度学习模型 FaceNet。

更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)
人脸检测与人脸识别

2016 年 Kaipeng Zhang, Zhanpeng Zhang, Zhifeng Li, Yu Qiao 提出了人脸检测 MTCNN(Multi-task Cascaded Convolutional Networks)模型。该模式是一种 Multi-task 的人脸检测框架,使用 3 个 CNN 级联算法结构,将人脸检测和人脸特征点检测同时进行,检测效果以下图所示:html

Google 工程师 Florian Schroff,Dmitry Kalenichenko,James Philbin 提出了人脸识别 FaceNet 模型,该模型没有用传统的 softmax 的方式去进行分类学习,而是抽取其中某一层做为特征,学习一个从图像到欧式空间的编码方法,而后基于这个编码再作人脸识别、人脸验证和人脸聚类等。人脸识别效果以下图所示,其中横线上表示的数字是人脸间的距离,当人脸距离小于 1.06 可看做是同一我的。git

MTCNN 模型

MTCNN 是多任务级联 CNN 的人脸检测深度学习模型,该模型中综合考虑了人脸边框回归和面部关键点检测。MTCNN 的网络总体架构以下图所示:github

首先照片会按照不一样的缩放比例,缩放成不一样大小的图片,造成图片的特征金字塔。PNet 主要得到了人脸区域的候选窗口和边界框的回归向量。并用该边界框作回归,对候选窗口进行校准,而后经过非极大值抑制(NMS)来合并高度重叠的候选框。RNet 将通过 PNet 的候选框在 RNet 网络中训练,而后利用边界框的回归值微调候选窗体,再利用 NMS 去除重叠窗体。ONet 功能与 RNet 做用相似,只是在去除重叠候选窗口的同时,同时显示五我的脸关键点定位。算法

MTCNN 人脸检测的训练数据能够从 http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/ 地址下载。该数据集有 32,203 张图片,共有 93,703 张脸被标记,以下图所示:express

标记文件的格式以下所示:微信

# 文件名网络

File name数据结构

# 标记框的数量架构

Number of bounding box框架

# 其中 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 张从网站下载的图片。以下所示:

标记文件的格式为:

/# 第一个数据为文件名,第二和第三个数据为标记框左上角坐标,第四和第五个数据为标记框长宽,第六和第七个数据为左眼标记点,第八和第九个数据为右眼标记点,第十和第十一个数据为左嘴标记点,最后两个坐标为右嘴标记点。

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

PNet 的网络结构是一个全卷积的神经网络结构,以下图所:

该训练网络的输入是一个 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 网络的训练数据。训练数据经过 10 个 3×3×3 的卷积核,2×2 的 Max Pooling(stride=2)操做,生成 10 个 5×5 的特征图。接着经过 16 个 3×3×10 的卷积核,生成 16 个 3×3 的特征图。接着经过 32 个 3×3×16 的卷积核,生成 32 个 1×1 的特征图。最后针对 32 个 1×1 的特征图,能够经过 2 个 1×1×32 的卷积核,生成 2 个 1×1 的特征图用于分类;4 个 1×1×32 的卷积核,生成 4 个 1×1 的特征图用于回归框判断;10 个 1×1×32 的卷积核,生成 10 个 1×1 的特征图用于人脸轮廓点的判断。

RNet 的模型结构以下所示:

模型输入为 24×24 大小的图片,经过 28 个 3×3×3 的卷积核和 3×3(stride=2)的 max pooling 后生成 28 个 11×11 的特征图;经过 48 个 3×3×28 的卷积核和 3×3(stride=2)的 max pooling 后生成 48 个 4×4 的特征图;经过 64 个 2×2×48 的卷积核后,生成 64 个 3×3 的特征图;把 3×3×64 的特征图转换为 128 大小的全链接层;对回归框分类问题转换为大小为 2 的全链接层;对 bounding box 的位置回归问题,转换为大小为 4 的全链接层;对人脸轮廓关键点转换为大小为 10 的全链接层。

ONet 是 MTCNN 中的最后一个网络,用于作网络的最后输出。ONet 的训练数据生成相似于 RNet,检测数据为图片通过 PNet 和 RNet 网络后,检测出来的 bounding boxes,包括正样本,负样本和中间样本。ONet 的模型结构以下所示:

模型输入是一个 48×48×3 大小的图片,经过 32 个 3×3×3 的卷积核和 3×3(stride=2)的 max pooling 后转换为 32 个 23×23 的特征图;经过 64 个 3×3×32 的卷积核和 3×3(stride=2)的 max pooling 后转换为 64 个 10×10 的特征图;经过 64 个 3×3×64 的卷积核和 3×3(stride=2)的 max pooling 后转换为 64 个 4×4 的特征图;经过 128 个 2×2×64 的卷积核转换为 128 个 3×3 的特征图;经过全连接操做转换为 256 大小的全连接层;最好生成大小为 2 的回归框分类特征;大小为 4 的回归框位置的回归特征;大小为 10 的人脸轮廓位置回归特征。

MTCNN 模型推理

MTCNN 的 Inference 流程以下图所示:

由原始图片和 PNet 生成预测的 bounding boxes。输入原始图片和 PNet 生成的 bounding box,经过 RNet,生成校订后的 bounding box。输入元素图片和 RNet 生成的 bounding box,经过 ONet,生成校订后的 bounding box 和人脸面部轮廓关键点。执行过程以下所示:

  1. 首先读入要检测的图片:image = cv2.imread(imagepath)

  2. 加载训练好的模型参数,构建检测对象:detector = MtcnnDetector

  3. 执行推理操做:all_boxes,landmarks = detector.detect_face(image)

  4. 绘制目标框:cv2.rectangle(image, box,(0,0,255))

FaceNet 模型

FaceNet 主要用于验证人脸是否为同一我的,经过人脸识别这我的是谁。FaceNet 的主要思想是把人脸图像映射到一个多维空间,经过空间距离表示人脸的类似度。同我的脸图像的空间距离比较小,不一样人脸图像的空间距离比较大。这样经过人脸图像的空间映射就能够实现人脸识别,FaceNet 中采用基于深度神经网络的图像映射方法和基于 triplets(三联子)的 loss 函数训练神经网络,网络直接输出为 128 维度的向量空间。

FaceNet 的训练数据能够从 http://www.cbsr.ia.ac.cn/english/CASIA-WebFace-Database.html 下载,该训练数据包括 10575 我的,共 453453 张图片。验证数据集能够从 http://vis-www.cs.umass.edu/lfw/ 地方下载,该数据集包含 13,000 张图片。训练数据的组织结构以下所示,其中目录名是人名,目录下的文件是对应人的照片。

Aaron_Eckhart
Aaron_Eckhart_0001.jpg

Aaron_Guiel
Aaron_Guiel_0001.jpg

Aaron_Patterson
Aaron_Patterson_0001.jpg

Aaron_Peirsol
Aaron_Peirsol_0001.jpg
Aaron_Peirsol_0002.jpg
Aaron_Peirsol_0003.jpg
Aaron_Peirsol_0004.jpg

······

接着对该训练数据中每一个图片进行预处理,经过 MTCNN 模型把人脸检测出来,生成 FaceNet 的训练数据,以下图所示:

造成相应的数据结构以下所示:

Aaron_Eckhart
Aaron_Eckhart_0001_face.jpg

Aaron_Guiel
Aaron_Guiel_0001_face.jpg

······

FaceNet 的网络结构以下图所示:

其中 Batch 表示人脸的训练数据,接下来是深度卷积神经网络,而后采用 L2 归一化操做,获得人脸图像的特征表示,最后为三元组(Triplet Loss)的损失函数。

下图为 FaceNet 中采用的 Inception 架构的深度卷积神经网络:

模型结构的末端使用 triplet loss 来直接分类。triplet loss 的启发是传统 loss 函数趋向于将有一类特征的人脸图像映射到同一个空间。而 triplet loss 尝试将一个个体的人脸图像和其它人脸图像分开。三元组其实就是三个样例,如 (anchor, pos, neg),利用距离关系来判断。即在尽量多的三元组中,使得 anchor 和 pos 正例的距离,小于 anchor 和 neg 负例的距离,以下图所示:

用数学公式能够表示为:

模型在每一个 Mini Batch 的训练时,为了计算 triplet Loss 值,须要选定合理的 triplet 三元组。若是采用暴力的方法从全部样本中找出离他最近的反例和离它最远的正例,而后进行优化,查找时间太长,而且还会因为错误标签图像致使训练收敛困难。可采用在线生成 triplet 的方式,在每一个 mini-batch 中,生成 triplet 的时候,找出全部的 anchor-pos 对,而后对每一个 anchor-pos 对找出其 hard neg 样本。

主要流程以下所示:

  1. 在 mini-batch 开始的时候,从训练数据集中抽样人脸照片。好比每个 batch 抽样多少人,每一个人抽样多少张图片,这样会获得要抽样的人脸照片。

  2. 计算这些抽样图片在网络模型中获得的 embedding,这样经过计算图片的 embedding 之间的欧式距离获得三元组了。

  3. 根据获得的三元组,计算 triplet-loss,进行模型优化,更新 embedding。

FaceNet 模型推理

FaceNet 模型推理流程以下所示:

  1. 经过 MTCNN 人脸检测模型,从照片中提取人脸图像。

  2. 把人脸图像输入到 FaceNet,计算 Embedding 的特征向量。

  3. 比较特征向量间的欧式距离,判断是否为同一人,例如当特征距离小于 1 的时候认为是同一我的,特征距离大于 1 的时候认为是不一样人。

总结

本文首先介绍了人脸检测和人脸识别,人脸检测用于定位图片中的人脸,人脸识别用于识别人脸的身份。而后讲解了 MTCNN 模型的主要思想,并对 MTCNN 的关键技术进行分析,主要包括训练数据,网络架构,PNet,RNet,ONet 及模型推理。接着讲解了 FaceNet 模型的主要思想及关键技术包括训练数据,网络结构,损失方程及 Triplet 的选择。用户可应用 MTCNN 及 FaceNet 模型架构到工业领域中相关人脸检测及识别场景。

参考文献

[1] MTCNN: a Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks.

[2] https://github.com/AITTSMD/MTCNN-Tensorflow

[3] FaceNet: A Unified Embedding for Face Recognition and Clustering

[4] https://github.com/davidsandberg/facenet

做者简介

武维(微信:allawnweiwu):博士,现为 IBM 架构师。主要从事深度学习平台及应用研究,大数据领域的研发工做。

相关文章
相关标签/搜索