人脸检测-mtcnn

概念:

MTCNN,英文全称是Multi-task convolutional neural network,中文全称是多任务卷积神经网络, 该神经网络将人脸区域检测与人脸关键点检测放在了一起。
从工程实践上,MTCNN是一种检测速度和准确率都很不错的算法,算法的推断流程有一定的启发性。

总体可分为P-Net、R-Net、和O-Net三层网络结构。

流程:

1.由原始图片和PNet生成预测的bounding boxes。
2.输入原始图片和PNet生成的bounding box,通过RNet,生成校正后的bounding box。
3.输入原始图片和RNet生成的bounding box,通过ONet,生成校正后的bounding box和人脸面部轮 廓关键点。


MTCNN主要包括三层网络:

  1. 第一层P-Net将经过卷积,池化操作后输出分类(对应像素点是否存在人脸)和回归(回归 box)结果。
  2. 第二层网络将第一层输出的结果使用非极大抑制(NMS)来去除高度重合的候选框,并将这些 候选框放入R-Net中进行精细的操作,拒绝大量错误框,再对回归框做校正,并使用NMS去除 重合框,输出分支同样两个分类和回归。
  3. 最后将R-Net输出认为是人脸的候选框输入到O-Net中再一次进行精细操作,拒绝掉错误的框, 此时输出分支包含三个分类:
    a. 是否有人脸:2个输出;
    b. 回归:回归得到的框的起始点的xy坐标和框的长宽,4个输出;
    c. 人脸特征点定位:5个人脸特征点的xy坐标,10个输出。

注:三段网络都有NMS,但是所设阈值不同。

1、构建图像金字塔

首先对图片进行Resize操作,将原始图像缩放成不同的尺度,生成图像金字塔。然后将不同尺度的图 像送入到这三个子网络中进行训练,目的是为了可以检测到不同大小的人脸,从而实现多尺度目标检测。
构建方式是通过不同的缩放系数factor分别对图片的h和w进行缩放,每次缩小为原来的factor大小。
注意:缩小后的长宽最小不可以小于12。

为什么需要对图片做“金字塔”变换?
图片中的人脸的尺度有大有小,让识别算法不被目标尺度影响一直是个挑战。
MTCNN使用了图像金字塔来解决目标多尺度问题,即把原图按照一定的比例(如0.709),多次等比 缩放得到多尺度的图片,很像个金字塔。
P-NET的模型是用单尺度(1212)的图片训练出来的。推理的时候,缩小后的长宽最小不可以小于12。
对多个尺度的输入图像做训练,训练是非常耗时的。因此通常只在推理阶段使用图像金字塔,提高算法的精度。
设置合适的最小人脸尺寸和缩放因子为什么可以优化计算效率?
• factor是指每次对边缩放的倍数。
• 第一阶段会多次缩放原图得到图片金字塔,目的是为了让缩放后图片中的人脸与P-NET训练时候的图片尺度(12px * 12px)接近。
• 引申优化项:先把图像缩放到一定大小,再通过factor对这个大小进行缩放。可以减少计算量。
• minsize是指你认为图片中需要识别的人脸的最小尺寸(单位:px)。
• 注:代码中使用的是“引申优化项“的策略。

图例:如果待测图片1200px
1200px,想要让缩放后的尺寸接近模型训练图片的尺度(12px*12px)。
缩放因子为什么官方选择0.709?
• 图片金字塔缩放时,如果默认把宽,高都变为原来的1/2,缩放后面积变为原来的1/4;
• 如果认为1/4的缩放幅度太大,你会怎么办?—把面积缩放为原来的1/2。
• 这是很直观的想法,所以这里的缩放因子0.709 ≈ sqrt(2)/2,这样宽高变为原来的sqrt(2)/2, 面积就变为原来的1/2。
• 从实际意义上看,factor应该设置为小于1。
图像金字塔的缺点:
慢。

  1. 第一,生成图片金字塔慢;
  2. 第二,每种尺度的图片都需要输入进模型,相当于执行了多次的模型推理流程。

2、P-Net(Proposal Network)

其基本的构造是一个全卷积网络。对上一步构建完成的图像金字塔,通过一个FCN(全卷积网络) 进行初步特征提取与标定边框。

MTCNN算法可以接受任意尺度的图片,为什么?
• 因为第一阶段的P-NET是一个全卷积网络(Fully Convolutional Networks)。
• 卷积、池化、非线性激活都是一些可以接受任意尺度矩阵的运算,但全连接运算是需要规定输入。 如果网络中有全连接层,则输入的图片尺度(一般)需固定;如果没有全连接层,图片尺度可以是任 意的。
• 在推理的时候,测试图像中人脸区域的尺度未知。但是因为P网结构是固定的,当输入图为1212时, 输出的恰好是11的5通道特征图,所以可以把p网整体看做一个1212的卷积核在图片上从左上方开 始,取步长stride=2,依次做滑窗操作。——>所以,当刚开始图很大的时候,1212的框可能只是 框住了一张大脸上的某个局部如眼睛、耳朵、鼻子。当该图不断缩至很小的时候(图像金字塔), 12*12的框能对其框住的也越来越全,直至完全框住了整张脸。

• 3次卷积和1次池化操作后,原来12123的矩阵变为1132
• 利用这个1132的向量,再通过一个112的卷积,得到了”是否是人脸”的分类结果
• 我们令输入图片矩阵为A,卷积核在原图矩阵A上滑动,把每个12123区域的矩阵都计算成该区域有 无人脸的得分,最后可以得到一个二维矩阵为S,S每个元素的值是[0, 1]的数,代表有人脸的概率。即 A通过一系列矩阵运算,变化到S。
P-Net的输出:

  1. 网络的第一部分输出是用来判断该图像是否存在人脸,输出向量大小1x1x2,也就是两个值。
  2. 网络的第二部分给出框的精确位置,即边框回归:P-Net输入的12×12的图像块可能并不是完美的 人脸框的位置,如有的时候人脸并不正好为方形,有可能12×12的图像偏左或偏右,因此需要输出 当前框位置相对完美的人脸框位置的偏移。这个偏移大小为1×1×4,即表示框左上角的横坐标的相 对偏移,框左上角的纵坐标的相对偏移、框的宽度的误差、框的高度的误差。
  3. 网络的第三部分给出人脸的5个关键点的位置。5个关键点分别对应着左眼的位置、右眼的位置、 鼻子的位置、左嘴巴的位置、右嘴巴的位置。每个关键点需要两维来表示,因此输出是向量大小 为1×1×10。

举例:
一张7070的图,经过P网络全卷积后,输出为(70-2)/2 -2 -2 =30,即一个5通道的3030的特征 图。这就意味着该图经过p的一次滑窗操作,得到了30*30=900个建议框,而每个建议框对应1个置 信度cond与4个偏移量offset。再经nms(非极大值抑制:通过iou,把不是极大值的值全都杀掉)把 cond大于设定的阈值0.6对应的建议框保留下来,将其对应的offset经边框回归操作,得到在原图中 的坐标信息,即得到符合p网的这些建议框了。之后再传给R网。

3、R-Net(Refine Network):

从网络图可以看到,只是由于该网络结构和P-Net网络结构有差异,多了一个全连接层,所以会取得更好的抑制false-positive的作用。在输入R-Net之前,都需要缩放到24x24x3,网络的输出与P- Net是相同的,R-Net的目的是为了去除大量的非人脸框。

4、O-Net(Output Network):

该层比R-Net层又多了一层卷积层,所以处理的结果会更加精细。输入的图像大小48x48x3,输出包括N个边界框的坐标信息,score以及关键点位置。

总结:

从P-Net到R-Net,再到最后的O-Net,网络输入的图像越来越大,卷积层的通道数越来越多,网络的深度(层数)也越来越深,因此识别人脸的准确率应该也是越来越高的。

实现:

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

完整代码在资源中。
实现结果如下:

Keras框架:人脸检测-mtcnn思想及代码相关推荐

  1. 人脸检测MTCNN和人脸识别Facenet(附源码)

    原文链接:人脸检测MTCNN和人脸识别Facenet(附源码) 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haa ...

  2. Python MTCNN(人脸检测)项目附代码讲解(1)-原理与论文介绍

    首先介绍下什么是MTCNN? 论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Network ...

  3. mtcnn人脸检测python_Python MTCNN(人脸检测)项目附代码讲解(2)-NMS/IOU工具介绍...

    对于MTCNN中使用的原理工具,这一节分为代码的三部分(NMS,IOU,框的改变),对于图像金字塔.三个网络(R.P.ONET)和数据集的处理部分放在模型搭建中来讲,要不突然讲起来感觉太虚空,没办法很 ...

  4. python 图像iou_Python MTCNN(人脸检测)项目附代码讲解(2)-NMS/IOU工具介绍

    对于MTCNN中使用的原理工具,这一节分为代码的三部分(NMS,IOU,框的改变),对于图像金字塔.三个网络(R.P.ONET)和数据集的处理部分放在模型搭建中来讲,要不突然讲起来感觉太虚空,没办法很 ...

  5. (转)第三十七节、人脸检测MTCNN和人脸识别Facenet(附源码)

    http://www.cnblogs.com/zyly/p/9703614.html 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第 ...

  6. 口罩人脸检测与分类开源代码汇总

    点击我爱计算机视觉标星,更快获取CVML新技术 最近因为疫情影响,口罩人脸检测与分类突然火了起来,首先是百度开源了相关模型,然后腾讯和阿里也分别称在云服务中提供了相关能力. 今天CV君汇总了目前开源的 ...

  7. 深度学习自学(二):人脸检测MTCNN学习总结

    一.MTCNN关键参数 nms_threshold:非极大值抑制nms筛选人脸框时的IOU阈值,三个网络可单独设定阈值,值设置的过小,nms合并的少,会产生较多冗余计算.示例nms_threshold ...

  8. 手把手教你使用Keras进行人脸检测和识别

    先决条件 在开始检测和识别面部之前,您需要设置开发环境.首先,您需要先通过Python"读取"图像,然后再对其进行任何处理.我们将使用绘图库matplotlib来读取和操作图像.通 ...

  9. 基于PCA的人脸检测(Matlab版代码)

    花了几天,终于把matlab版的人脸检测运行成功了,虽然正确率不是很高,看着各种论文上的人脸检测正确率都出奇的高,我是不怎么相信的,有的论文连基于平均脸的人脸检测正确率都能达到98%,汗啊--  也许 ...

最新文章

  1. [Notes] Bash Shell特性
  2. python实现序列数据预处理_Python笔记:序列处理函数
  3. 妹子每天加班1分钟,半年崩溃!向公司索赔55万!
  4. yolov3为什么对大目标检测不好_从YOLOv1到YOLOv3,目标检测的进化之路
  5. 从零开始学前端:显示隐藏与文本溢出 --- 今天你学习了吗?(CSS:Day16)
  6. 20211102:数字滤波器按照实现结构的分类及其优缺点总结
  7. vue 获取安卓原生方法_H5-vue与原生Android、ios交互获取相册图片
  8. PHP开发苍穹DDOS压力测试页端源码
  9. Win10下安装GrADS
  10. 带宽总结:3dB带宽、零点到零点带宽、均方根带宽等
  11. 阿里云dataV大屏可视化的使用攻略——vue项目
  12. 如果以后找不到工作了,应该干点啥?
  13. iOS调用系统相机、相册里面的文字显示英文
  14. MTK6737平台的GPIO驱动例程(六)
  15. 深刻揭露当今楼市中的七大谬论
  16. 挺带劲!这款免费开源的监控系统真强大~
  17. Charles工具使用-pc端
  18. apk 打包 java出错_一次不成功的apk重新打包经过
  19. 数据结构C语言顺序表入门简单题目你会了吗?
  20. 浅谈slf4j,logger中的{}功能

热门文章

  1. CodeForces - 641ELittle Artem and Time Machine——map+树状数组
  2. Java-进阶:多线程2
  3. 网易严选Java开发三面面经:java技术编程培训班
  4. 成功跳槽百度工资从15K涨到28K,已整理成文档
  5. 这些新技术你们都知道吗?成功收获美团,小米安卓offer
  6. CV2摄像头人脸、人眼、微笑等检测
  7. 条件变量 sync.Cond
  8. python安装Crypto:NomodulenamedCrypto.Cipher
  9. [BZOJ2599][IOI2011]Race 点分治
  10. windows 删除删除不掉的文件