携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
基于 MTCNN 的人脸检测的算法详解
计算机视觉中,目标检测是一项基本任务,主要是为了得到图像中特定对象的位置。相较于分类任务,目标检测首先要知道对象的位置信息,然后进行分类,因此它是更加复杂的图像任务。以往的目标检测算法大多是使用人工设计的特征,对整个图像进行地毯式的窗口对比。而随着神经网络的兴起,它在图像的目标检测这一任务上取得了比传统方法更强大的性能,因此,本文中的目标检测算法也采用的是基于深度学习的算法。
系统的目标检测算法参考了一种叫做 MTCNN 的多任务级联卷积神经网络算法。
它的思想流程图如下所示。
img_ 可以是任意大小的图片,用来传入我们要检测的图片 finalBbox_ 输出分为 3 部分:
- face classification:输入图像为人脸图像的概率
- bounding box:输出矩形框位置信息
- facial landmark localization:输入人脸样本的 5 个关键点位置。
图像金字塔是一种数据预处理的方式,可以被当作为是对输入图像进行的一种多尺度表达,即通过这样的预处理方法的操作后所得到的多种分辨率的图像来解释原输入图像的结构。图像金字塔操作可被应用于多种领域,例如图像的像素压缩、特征图像的融合以及待检测图像的语义层面的分割等等。
目前对于机器视觉领域中的对于人脸检测与面部关键点定位表现效果较好的模型为多任务卷积神经网络模型(MTCNN),其对输入图像采取的预处理方式正是基于多尺度的图像金字塔处理方法。但是通过大量不同类型的人脸图像对于 MTCNN 模型的表现效果进行实践时,发现当图像中的人脸数量较密集且人脸图像像素值较低时,MTCNN 模型易出现人脸误检与漏检的情形。
因此本章将采用改变 MTCNN 模型的数据预处理的方式,在其多尺度图像金字塔的原预处理的方式中再加入多模板的处理方法,即采用多尺度多模板图像金字塔的预处理方式与 MTCNN 模型相结合。不同于传统的单一模板的多尺度图像金字塔预处理方法,多模板多尺度图像金字塔预处理方式丰富了输入图像的表现形式并对输入的图像数据集进行了扩充,因此更适用于运用在场景较为复杂的人脸检测任务中。
本次模型的训练,人脸回归框的预测任务采用 WIDER Face 数据集,由于 Celeba 数据集在面部关键点的预测任务中存在标签错误的情况,因此对于面部关键点定位任务采用 BioID 和 LFPW 的混合数据集进行训练。本章通过两个不同数据预处理方式训练的 MTCNN 网络进行对同一张人脸较为密集且干扰物较多的图片进行检测,发现加入了多尺度多模板金字塔预处理的 MTCNN 模型具有更好的表现效果。
输出结构体如下:
//人脸识别框
struct Bbox
{
float score;//得分
int x1; //坐标值
int y1;
int x2;
int y2;
float area; //面积
float ppoint[10]; //人脸的特征点
float regreCoord[4];//4个坐标的修正信息,返回的是框的比例
Bbox& copy(const Bbox& bbox)
{
if(&bbox == this)
return *this;
this->x1 = bbox.x1;
this->y1 = bbox.y1;
this->x2 = bbox.x2;
this->y2 = bbox.y2;
this->area = bbox.area;
memcpy(this->ppoint, bbox.ppoint, sizeof(bbox.ppoint));
memcpy(this->regreCoord, bbox.regreCoord, sizeof(bbox.regreCoord));
return *this;
}
};
多尺度多模板图像金字塔的数据预处理方法
由上图可以看出,它是由三个小的卷积神经网络级联而成,三个网络分别叫做 Proposal Network(P-Net)、Refinement Network(R-Net)、Output Network(O-Net)。首先构建图像金字塔,将输入图像 resize 为不同的大小作为三个网络的输入。P-Net 是一个全卷积神经网络。
它的作用包含了两个部分:判断是否是人脸以及得到人脸的区域框,最后通过非极大值抑制来对得到的一系列候选区域进行合并,剔除部分重合度太高的候选框。
R-Net 和 P-Net 作用类似,相比之下,他并不是全卷积网络,因此卷积核大小也不同。还多了一个全连接层。O-Net 又多了一层卷基层。作用和前两个网络相似。但是该网络获取了更多的信息,同时还会输出五个关键点的信息,分别对应两个眼睛、一个鼻子和两边嘴角。