论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
论文链接:https://arxiv.org/abs/1604.02878
官方代码链接:https://github.com/kpzhang93/MTCNN_face_detection_alignment
其他代码实现(MXNet):https://github.com/pangyupo/mxnet_mtcnn_face_detection

一 模型及流程概览

使用mtcnn神经网络进行人脸检测是目前比较主流的方式,相较于传统的人脸检测方法,mtcnn更能够适用各种自然条件下复杂的人脸场景。mtcnn是两年前发表的成果,在原作者实现的时候先后有两个版本:V1和V2。V1就是用matlab实现的论文《Joint Face Detection and Alignment using Multi-task Cascaded  Convolutional Neural Networks》,V2在V1的stage3后又添加了一个stage4,以实现更精确的回归。

训练前,对图像做了multi scale的resize,构成了图像金字塔,然后这些不同scale的图像作为3个stage的输入进行训练,目的是为了可以检测不同scale的人脸。

  将图像进行多级scale操作(除了第一次resize,每次resize操作使得待检测图片的面积变为之前的一半),如果最小边长小于12,则停止scale操作;对于720p的图片来说,一共会进行11次scale: [0.6, 0.4242640687119285, 0.3, 0.21213203435596426, 0.15, 0.10606601717798213, 0.075, 0.053033008588991064, 0.0375, 0.026516504294495532, 0.01875];然后将11个不同尺度的图片送入P-Net;

MTCNN由三个子模型组成,由粗到细(coarse-to-fine)生成结果:

P(Proposal)-Net:浅层的全卷积神经网络CNN快速产生候选窗体和边界回归向量,利用NMS方法去除重叠窗体。在训练阶段,顶部有3条支路用来分别做人脸分类、人脸框的回归和人脸关键点定位;在推理阶段,输出只有N个bounding box的4个坐标信息和score,当然这4个坐标信息已经用回归支路的输出进行修正了,score可以看做是人脸的概率,具体可以看代码。

R(Refine)-Net:通过更复杂的全连接CNN精炼候选窗体,利用边界框向量微调候选窗体,再利用NMS去除重叠窗体,丢弃大量的重叠窗体。输入是P-Net中得到的大量bounding box并都被resize成24*24尺寸。同样在推理阶段,这一步的输出只有M个bounding box的4个坐标信息和score,4个坐标信息也用回归支路的输出进行修正了。

O(Output)-Net:网络结构比R-Net多一层卷积,功能与R-Net作用一样,只是在去除重叠候选窗口的同时,显示五个人脸关键点定位。输入大小调整为48*48,输出包含P个bounding box的4个坐标信息、score和关键点信息。

二、损失函数

1. face classification

判定是否包含face的二分类问题,采用交叉熵损失函数

2.bounding box regression

回归检测人脸包围盒,使用L2 loss

3.facial landmark localization

4. 权值平衡

不同的阶段对应的损失函数组合不一样,权重也不一样,因此定义了公式4用来控制对不同的输入计算不同的损失。可以在出,在P-Net和R-Net中,关键点的损失权重(α)要小于O-Net部分,这是因为前面2个stage重点在于过滤掉非人脸的bbox。β存在的意义是比如非人脸输入,就只需要计算分类损失,而不需要计算回归和关键点的损失。

三 模型细节

  • PNet

图片尺寸:12*12*3

卷积层一 : [in_channel(3), shape(3), shape(3), out_channel(10)]      激活PReLU  MaxPool

卷积层二 : [in_channel(10), shape(3), shape(3), out_channel(16)]    激活PReLU  MaxPool

卷积层三 : [in_channel(16), shape(3), shape(3), out_channel(32)]    激活PReLU

卷积层四_一 : [in_channel(32), shape(1), shape(1), out_channel(2)]    conv4-1  激活Softmax 到 prob1层 对应人脸概率的得分

卷积层四_二 : [in_channel(32), shape(1), shape(1), out_channel(4)]    conv4-2

卷积层三为1x1卷积核得到PNet输出。PNet层输出分为3部分:
1). face classification:图像中包含人脸的概率
2). bounding box:输出矩形框位置信息
3). facial landmark localization:5个关键点位置。

rnet: 24x24x3, onet:48x48x3

三、人脸对齐的一些笔记

MTCNN人脸检测识别笔记的更多相关文章

  1. MTCNN人脸检测 附完整C++代码

    人脸检测 识别一直是图像算法领域一个主流话题. 前年 SeetaFace 开源了人脸识别引擎,一度成为热门话题. 虽然后来SeetaFace 又放出来 2.0版本,但是,我说但是... 没有训练代码, ...

  2. 项目实战 - 原理讲解<-> Keras框架搭建Mtcnn人脸检测平台

    Mtcnn它是2016年中国科学院深圳研究院提出的用于人脸检测任务的多任务神经网络模型,该模型主要采用了三个级联的网络,采用候选框加分类器的思想,进行快速高效的人脸检测.这三个级联的网络分别是快速生成 ...

  3. Emgu cv人脸检测识别

    Emgu cv人脸检测识别 1.开发平台:WIN10 X64    VS2012    Emgucv版本:3.1 2.先给大家分享一个官网给的示例源代码: https://ncu.dl.sourcef ...

  4. Python学习案例之视频人脸检测识别

    前言 上一篇博文与大家分享了简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统.人脸动态跟踪识别系统等等. 案例 这里我们还是使用 opencv 中 ...

  5. Python学习案例之人脸检测识别

    前言 随着科技的发展,人脸识别技术在许多领域得到的非常广泛的应用,手机支付.银行身份验证.手机人脸解锁等等. 识别 废话少说,这里我们使用 opencv 中自带了 haar人脸特征分类器,利用训练好的 ...

  6. 人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)

    1.Easily Create High Quality Object Detectors with Deep Learning 2016/10/11 http://blog.dlib.net/201 ...

  7. MTCNN 人脸检测

    demo.py import cv2 from detection.mtcnn import MTCNN # 检测图片中的人脸 def test_image(imgpath): mtcnn = MTC ...

  8. 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别

      AdaBoost 算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高.   系统在技术上的三个贡献: 1.用简单的Haa ...

  9. Python视频人脸检测识别

    案例 这里我们还是使用 opencv 中自带了 haar人脸特征分类器,通过读取一段视频来识别其中的人脸. 代码实现:   动图有点花,讲究着看吧:   如果是捕捉摄像头,只需要改变以下代码即可: c ...

随机推荐

  1. table 设置边框

    本文引自:https://www.cnblogs.com/leona-d/p/6125896.html 示例代码: <!DOCTYPE html> <html lang=" ...

  2. Scala 基础新手教程

    1.前言 近期在參加Hadoop和Spark培训.须要使用Scala,自学了一下作为入门.这里作一个记录. 2.下载 1) 在scala官网下载.地址: http://www.scala-lang.o ...

  3. python(17)- 迭代器和生成器及应用

    什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代对象 ...

  4. 如何获得(读取)web.xml配置文件的參数

    參考代码例如以下: com.atguigu.struts2.app.converters.DateConverter.java public DateFormat getDateFormat(){ i ...

  5. 【每日Scrum】第二天(4.23) TD学生助手Sprint2站立会议

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 昨天觉得整个界面不适合后期功能扩展,所以进行了整体整改 今天主要看了多事件处理的内容然后改了下界面, 遇到的困难就是正在寻找用户交互性比较好的 ...

  6. Nginx简单了解

    1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML.图片)通过HTTP协议展现给客户端. 配置: server { listen80; # 端口号 lo ...

  7. Selenium学习(一)环境搭建

    一.安装selenium有两种方式: 1.pip install -U selenium(网络条件好) 2.下载selenium安装包,通过python setup.py install(压缩包)或p ...

  8. PHP框架的基本原理以及选择标准

    PHP框架的原理 说到PHP框架,可能很多PHP新手会感到有些胆怯.其实,PHP框架也不是那么深不可测的,框架就是别人使用PHP基础只是为你写好了的东西,只是封装在一起:这就好比我们使用PHP的函数, ...

  9. 启动app-inspector报Internal Server Error

    前言 应用工具app-inspector可以协助定位IOS版App的控件元素,然鹅启动时报Internal Server Error! 解决办法 一.找到XCTestWD项目 目录: /usr/loc ...

  10. slidemenu

    1. 在github上有一个效果不错的开源库,SlidingMenu 最新的代码下载下来后,会报错: No resource found that matches the given name: at ...