本文是对MTCNN进行人脸关键点检测和对齐的原理的描述,具体代码请见:https://github.com/Emma0118/preprocessing-images-for-Face-Recognition
一、概述
MTCNN(Multi-task Cascaded Convolutional Networks)是 一种多任务级联卷积神经网络,用以同时处理人脸检测和人脸关键点定位问题。作者认为人脸检测和人脸关键点检测两个任务之间往往存在着潜在的联系,然而大多数方法都未将两个任务有效的结合起来,MTCNN充分利用两任务之间潜在的联系,将人脸检测和人脸关键点检测同时进行,可以实现人脸检测和5个特征点的标定。
目前人脸检测大体分为两个阶段:找出所有可能是人脸的候选区域,从候选区域中选择出最可能是人脸的区域。
MTCNN为了解决人脸识别的两阶段问题,提出三个级联的多任务卷积神经网络(Proposal Network (P-Net)、Refine Network (R-Net)、Output Network (O-Net),每个多任务卷积神经网络均有三个学习任务,分别是人脸分类、边框回归和关键点定位。每一级的输出作为下一级的输入。
二、算法主体流程
1.Image Pyramid(图像金字塔):
MTCNN使用了“Image Pyramid(图像金字塔)”方法,解决不同尺度的人脸的检测。通过把原图按照一定的比例(如0.5),多次等比缩放得到多尺度的图片。
- 由于MTCNN下一阶段使用的P-Net是基于12x12的图片训练出来的,所以MTCNN在本阶段将缩放图片,直至最小边小于或者等于12,由此生成具有不同尺度的图片金字塔。
- 具体实现:先把原图等比缩放`12/minsize`,再按缩放因子`factor`(例如0.5)用上一次的缩放结果不断缩放,直至最短边小于或等于12。(code from detector.py)
# scales for scaling the image
scales = []
# scales the image so that
# minimum size that we can detect equals to
# minimum face size that we want to detect
m = min_detection_siz