MTCNN超详解-初学者看这篇文章就够了

时间:2024-03-14 22:01:46

基于PyTorch的人脸检测算法模型MTCNN

本文对MTCNN的样本制作,网络搭建,使用过程以及将要使用的算法和工具做了详尽的说明。
源码部分可直接点击MTCNN代码下载

一、MTCNN的介绍

1、人脸检测算法模型MTCNN使用多任务级联卷积网络进行联合人脸检测和对齐。

  • 多任务体现在:人脸的检测和关键点的对齐两个训练任务
  • 级联体现在:在使用MTCNN检测人脸时使用三个网络串行使用

2、MTCNN的三个网络

  • P-Net(ProposalNetwork): 12*12, 找出建议框
  • R-Net(RefinementNetwork): 24*24, 精细化建议框
  • O-Net(OutputNetwork): 48*48, 输出最终的结果

网络输入越来越大,是为了网络的层数可以越来越深,学习能力能越来越好

3、MTCNN的优缺点:

优点

  • 设备要求低:使用了级联思想,将复杂问题分解,使得模型能够在小型设备上运行;
  • 容易训练:三个级联网络都较小,训练模型时容易收敛;
  • 精度较高:三个网络逐步加深,逐步提高精度

缺点

  • 误检率较高,由于网络学习的背景图片太少,可以通过增加负样本的比例改善

二、MTCNN用到的主要模块

1、图像金字塔

MTCNN是如何从单类单目标检测,过渡到单类多目标的检测呢?
MTCNN超详解-初学者看这篇文章就够了
检测一张图中多个人脸有两种方式:

  1. 将一张图片划分成N个区域,在每个区域中分别检测人脸
  2. 设置建议框,用建议框在图片上滑动检测人脸

MTCNN采用的就是第二种,利用P网络的建议框在原图上不断的滑动去检测人脸,但是由于P网络的建议框的大小时固定的,只能检测12*12范围内的人脸,没法检测大一点的人脸,因此引入了图像金字塔的概念
MTCNN超详解-初学者看这篇文章就够了
不断缩小图片以适应于建议框的大小,当下一次图像的最小边长小于12时,停止缩放。

2、IOU

作用:计算两张图像的重合程度
两种方式

  1. 交集比并集
  2. 交集比最小集

由于我们在算iou时,iou值大于阈值的框被认为是重复的框会丢弃,留下iou值小的框,但是如果出现了下图中大框套小框的情况,则iou值偏小也会被保留,是我们不想看到的,因此我们在O网络采用了第二种方式的iou以提高误检率。
MTCNN超详解-初学者看这篇文章就够了

3、NMS

作用:去除预测结果中重复的框
预测出的结果出现很多重复框的原因:

  1. 由于我们传入一张图片时,会不断对图片做金字塔下采样,每一次都要对采样后的图片去检测人脸;
  2. 当我们检测时是用P网络以步长为2的大小在图片上滑动,由于滑动步长过小,会导致一个人脸被框了很多次

nms的计算方式
MTCNN超详解-初学者看这篇文章就够了
假设我们第一次在一张图上框出了五个人脸,置信度分别为0.98,0.83,0.75,0.81,0.67,前三个置信度为一个人脸,后两个为一个人脸。
我们将这五个框根据置信度排序,取出最大的置信度(0.98)的框分别和剩下的框做iou,保留iou小于阈值的框(代码中阈值设置的是0.3),这样就剩下0.81和0.67这两个框了,重复上面的过程,取出置信度(0.81)大的框,和剩下的框做iou,保留iou小于阈值的框。这样最后只剩下0.98和0.81这两个人脸框了。

4、图像正方形转换

作用:防止图像缩放时产生变形
方式
MTCNN超详解-初学者看这篇文章就够了

图中蓝色的框是P网络的预测框,黄色框是转换成正方形的框

由于P网络预测出的人脸框大部分都是矩形框,在我们传到R网络时要将框出的图片缩放成24x24的大小,如果直接缩放就像上图中右侧第二个一样,人脸会变形,不是我们想要的。
图中右侧第三个是先将矩形框的图片裁剪下来,再转成正方性后缩放的图,但是会有黑边。
最终采用的是将矩形框按照最大的边长转换成正方形再按照正方形的框从原图中裁剪下来图片后缩放成24x24的大小传入R网络,如图中右侧第四个,O网络同理。

5、图像坐标反算

作用:就是根据网络输出的预测值算出真实框的位置和大小

我们制作标签的时候用的是坐标的偏移量,因此我们需要根据网络预测的偏移量算出真实框的位置。

由于P网络是通过在图片上不断滑动得到的输出,因此计算真实坐标时需要把滑动的步长也要算进去。
接下来,我们就看看具体的计算方法:
MTCNN超详解-初学者看这篇文章就够了

图像金字塔中建议框坐标的反算

上图左边的是检测的图形,右边是P网络输出的特征图,根据特征图的索引乘以滑动步长就可以算出对应在原图中的建议框位置。

公式如下:
MTCNN超详解-初学者看这篇文章就够了
公式中的scale是图像金字塔中的缩放比例。

MTCNN超详解-初学者看这篇文章就够了

根据预测偏移量反算框的坐标

得到建议框的位置(上图中蓝色的框)后根据网络输出的偏移值,就可以求出真实框(黄色的框)的位置和大小了。
MTCNN超详解-初学者看这篇文章就够了
公式中offset为网络预测的偏移值, w,h为建议框的宽高。

三、MTCNN的网络架构

1、样本数据的生成

训练样本采用的是以CelebA数据集为基准进行偏移而成,
CeleA是香港中文大学的开放数据,包含10177个名人的202599张图片
官网:http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
下载地址(百度网盘,官方的):http://pan.baidu.com/s/1eSNpdRG

对CelebA数据集样本的人脸坐标框进行随机偏移,根据偏移框和真实框的iou大小来判别属于哪一类样本。
正样本:IOU>0.65
部分样本:0.4<IOU<0.65
负样本: IOU<0.3
正样本、部分样本、负样本的比例是1:1:3
因为这样偏移的负样本数据不够全面,因此负样本的比例要多一些。
MTCNN超详解-初学者看这篇文章就够了MTCNN超详解-初学者看这篇文章就够了MTCNN超详解-初学者看这篇文章就够了
红色框为真实框,蓝色框为偏移框
上图从左到右,依次是正样本、部分样本和负样本。

2、网络模型搭建

MTCNN超详解-初学者看这篇文章就够了

P网络

MTCNN超详解-初学者看这篇文章就够了

R网络

MTCNN超详解-初学者看这篇文章就够了

O网络

P网络为4层全卷积网络,第一层的池化核为2x2,输出了三个部分,第一部分表示类别,第二部分表示坐标的回归,第三部分表示5个关键点的回归(样本数据的生成里未指出)。
R网络为5层网络结构,前三层为卷积层,最后两层使用的是全连接层,第一层和第二层的池化核为3x3,输出部分同P网络。
O网络为6层网络结构,前四层为卷积层,最后两层使用的是全连接层,第一层和第二层的池化核为3x3,第三层的池化核为2x2,输出部分同P网络。

3、网络模型的训练

根据样本的置信度分类([负,正,部分] :[0,1,2]),对样本进行分类训练。

  1. 将类别小于2 的正、负样本用来做置信度的训练,损失函数选择BCE
  2. 将类别大于0的正、部分样本用来做坐标偏移量的训练,损失函数选择MSE

由于P,R,O三个网络的样本都是各自独立的,所以可以同时训练三个网络。

四、MTCNN的检测流程

MTCNN超详解-初学者看这篇文章就够了
检测步骤
第一步:输出一张图片,将图片等比例缩放成N张图片,逐一穿入P网络中,P网络输出包含偏移率和置信度的三维特征图;
第二步:根据置信度做判断,如果置信度大于设定的阈值就留下该网格中的偏移率反算回原图坐标,得到网络的预测框;
第三步:对所有的预测框做NMS,去除多余重复的框,留下重复较少的预测框转成正方形,把原图对应位置的正方形裁剪下来;
第四步:缩放成24x24的大小放入R网络,R网络做更精确的回归和置信度筛选,输出偏移率和置信度的二维特征图(N,V结构),之后重复第二和第三步;
第五步:缩放成48x48的大小放入O网络,O网络做更精确的回归和置信度筛选,输出偏移率和置信度的二维特征图(N,V结构),之后重复第二步;
第六步:对得到的预测框做第二种方式的NMS,最后输出坐标,画出预测框。

下图展示的是P网络输出后做NMS和正方形转换的细节:
MTCNN超详解-初学者看这篇文章就够了
MTCNN超详解-初学者看这篇文章就够了

MTCNN超详解-初学者看这篇文章就够了