上篇文章主要介绍了如何用深度学习的方法鉴别nsfw图片,这篇文章以及后面的一篇文章将会介绍如何利用深度学习的方法来识别一些特定人脸(明星或者政治人物),在识别人脸之前,我们需要先把人脸区域给检测出来,识别一张图片有没有人脸,并表示出人脸的范围,也就是人脸检测和对齐,这篇文章主要是介绍MTCNN网络架构(一种可以同时进行人脸检测和对齐的深度学习网络架构)以及自己的思考和总结
人脸检测的目标
人脸检测(Face Detection), 就是给一幅图片,找出图像中所有人脸的位置,通常用一个矩形框框出来,输入是一副图像img, 输出是若干个包含人脸的矩形框的位置, 以及5个关键人脸位置坐标(左眼,右眼,鼻子,左嘴角,右嘴角)。 如下图所示:
有了表示人脸区域的矩形框,后续就可以裁剪这块区域,进行后续的人脸匹配和识别工作。
MTCNN网络架构
本文介绍的主要算法是Multi-task Cascaded Convolutional Networks, 来自于论文 Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Network
这篇论文提出了一种通过三个CNN网络进行级联来进行人脸检测和人脸对齐的网络架构,网络架构如下图所示:
网络架构分为P-Net, N-Net, 和O-Net
整体的pipeline如下图所示:
给定一个图片,把它的尺寸resize到不同的大小(通过一定的比例,对图像进行缩放,就可以生成多个不同大小的图片),由此可以建立一个**图像金字塔 image pyramid **建立图像金字塔的目的是为了得到不同大小的人脸图片,提高人脸检出的概率。
-
Stage 1: P-Net, 全称(Proposal Network), 是一个纯卷积神经网络(不包含fc层),这个网络的主要目的是获得候选的人脸以及这些人脸的bounding box的坐标向量,bounding box 就是人脸外边的矩形方框,用来把人脸标出来,然后通过 non-maximun suppression(NMS, 非极大抑制)算法来选出一些bounding box 高度重叠的候选。
-
Stage 2: R-Net, 全称(Refine Network), 所有的候选人脸区域,会被喂入另一个CNN, 这个网络用来进一步过滤错误的候选,对bounding box 进行进一步的校准,这里也会用到NMS。
-
Stage 3: O-Net, 全称(Output Network), 这一层类似于R-Net, 但是这一层会在脸部区域给与更多的监督,会输出人脸的五个关键位置的坐标。
训练
训练的时候,采用三个任务(人脸分类, bounding box 回归,人脸关键位置定位)来训练CNN 模型, 这个应该就是Muti-task CNN 这个名字的由来吧, 这里的训练方式还是挺有意思的。
- 人脸分类 : 这个任务主要是一个二分类问题(人脸,非人脸),对于每个 样例 xi, 通过交叉熵损失函数计算cross-entroy loss:
L i d e t = − ( y i d e t l o g ( p i ) + ( 1 − y i d e t ) ( 1 − l o g ( p i ) ) ) ( 1 ) L^{det}_i = -(y^{det}_ilog(p_i) + (1-y^{det}_i)(1-log(p_i)))(1) Lidet=−(yidetlog(pi)+(1−yidet)(1−log(pi)))(1) - bounding box 回归 : 对于每个候选的人脸区域,计算它和最近的人脸真实位置的距离(主要是 left, top, height, and width), 这个任务可以看成是一个回归问题,对每个样例xi, 损失函数是欧式损失 (Eucliddean loss):
L i b o x = ∣ ∣ y ^ i b o x