论文: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. 【Caffe代码解析】compute_image_mean

    功能: 计算训练数据库的平均图像. 由于平均归一化训练图像会对结果有提升,所以Caffe里面,提供了一个可选项. 用法: compute_image_mean [FLAGS] INPUT_DB [OU ...

  2. windows平台是上的sublime编辑远程linux平台上的文件

    sublime是个跨平台的强大的代码编辑工具,不多说. 想使用sublime完毕linux平台下django网站的代码编辑工作以提高效率(原来使用linux下的vim效率较低,适合编辑一些小脚本). ...

  3. 在CentOS 7上构建RAID5、LVM和SAMBAserver(5)——架设SAMBAserver

    在CentOS 7上构建RAID5.LVM和SAMBAserver(5)--架设SAMBAserver 6. 架设SAMBAserver 6.1. 预备 本节的任务是配置SAMBA服务,共享/home ...

  4. Ffmpeg 获取USB Camera 视频流

    本文讲述的案例是如何通过Ffmpeg实现从USB Camera中获取视频流并将视频流保存到MP4文件. 本文亦适用于从USB Camera 获取视频流并将视频流转发到rtmp服务的案例,二者基本的原理 ...

  5. Vue 资源

    一. 资源教程 综合类 vuejs 英文资料 Vue中文资料总汇 Vue.js 的一些资源索引 vue资料 入门类 vue 快速入门 Vue.js 中文系列视频教程 on Laravist 英文教程 ...

  6. angular 关于 factory、service、provider的相关用法

    1.factory() Angular里面创建service最简单的方式是使用factory()方法. factory()让我们通过返回一个包含service方法和数据的对象来定义一个service. ...

  7. 最新wap手机agent

    名称 agent 铃声格式 和弦数 数据量 删除 LGE-CU8080  LGE-CU8080/1.0 UP.Browser/4.1.26l UP.Link/5.1.2.9  pmd2.0  40   ...

  8. hdu5698 百度之星2016round2b第3题

    这题首先是找规律推公式,然后就是组合数学的知识了. 题目是问到第n行第m列的格式有几种方案,我们可以用手算的方法列出当n和m比较小时的所有答案 比如我列出以下8*8的矩阵 矩阵上的数表示从那个位置到最 ...

  9. 九度OJ 1098:字母统计 (计数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3720 解决:1809 题目描述: 输入一行字符串,计算其中A-Z大写字母出现的次数 输入: 案例可能有多组,每个案例输入为一行字符串. 输 ...

  10. DuiLib笔记之CDuiString的bug

    在C/C++中,当使用==比较两个对象时,推荐的风格是将常量置前 例如 if (0 == variable) { ... } 但在DuiLib中,CDuiString存在一个bug:在用==进行比较时 ...