AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

  • 2018-05-29
  • 本文字数:4482 字

    阅读完需:约 15 分钟

人脸检测与人脸识别

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

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

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

MTCNN 模型

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

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

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

标记文件的格式如下所示:

复制代码
#文件名
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 架构师。主要从事深度学习平台及应用研究,大数据领域的研发工作。

2018-05-29 18:1312229

评论

发布
暂无评论
发现更多内容

精选2023年大厂高频Java面试真题集锦(含答案),面试一路开挂

程序知音

java面试 java架构 Java进阶 后端技术 Java面试八股文

干货分享|金融机构如何通过标签画像实现精细化客户运营?

索信达控股

关于 IDP 的五大认知误解

SEAL安全

IdP 平台工程

行业盛会丨九科信息亮相第十一届中国电子信息博览会(CITE2023),与您共享科技盛宴

九科Ninetech

关于FTP文件传输协议说明,带你了解更详细的文件传输协议

镭速

Redis崩吗?来一起搞定 Redis 实践中的常见问题!

Steven

redis

详解 Flink Catalog 在 ChunJun 中的实践之路

袋鼠云数栈

flink

【福利】ChatGPT免费体验期延长,商用版正式开启预约!

BeeWorks

EasyMR 安全架构揭秘:如何管理 Hadoop 数据安全

袋鼠云数栈

大数据

新旧版本功能对比 | v1.5.0 全新升级

BinTools图尔兹

数据库 社区版 版本更新

现在学C4D还是Blender好?这俩有啥区别?

Finovy Cloud

blender C4D

PCB拼版对SMT组装的影响,华秋一文告诉你

华秋电子

携多款产品亮相“深圳先进制造业集群展”,华秋积极探索发展机遇

华秋电子

【论文解读】不和谐区域定位

合合技术团队

人工智能 图像识别 图像处理

GOPS 全球运维大会来了,龙蜥社区邀您一起了解“系统运维”

OpenAnolis小助手

开源 操作系统 内核 龙蜥社区 GOPS全球运维大会

苹果电脑软件应用打开出现意外退出、崩溃问题解决办法

互联网搬砖工作者

面试还不懂Netty,看这篇文章就够了!

程序员小毕

Java 程序员 后端 Netty 架构师

阿里内部都在疯传!企业级Spring Boot 项目开发实战教程,我先肝了

程序知音

Java 微服务 springboot java架构 Java进阶

OpenSea交易平台开发NFT系统部署技术

薇電13242772558

NFT

智慧公共厕所,重构城市公共服务的新模式@光明源智慧公厕

光明源智慧厕所

智慧城市

上传了ipa但在苹果App Store中没有看到构建版本的问题

漫谈 ChatGPT 与问答式 BI

观远数据

数据分析 BI ChatGPT

EMQ&阿里云Lindorm联合方案:解决物联网关键业务场景数据处理难题

EMQ映云科技

阿里云 物联网 IoT 数据处理 企业号 4 月 PK 榜

MobTech ShareSDK|分享报错怎么办

MobTech袤博科技

华秋PCB生产工艺分享 | 第十一道之成型

华秋电子

面试官:谈谈分布式一致性机制

Java永远的神

程序员 分布式 微服务 后端 架构师

选择低代码,帮企业数字化转型提交一份满分答卷

加入高科技仿生人

软件开发 低代码 数字化 数字转型

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等

汀丶人工智能

人工智能 自然语言处理 深度学习 关系抽取 命名实体识别

如何应用MTCNN和FaceNet模型实现人脸检测及识别_语言 & 开发_武维_InfoQ精选文章