MTCNN人脸检测识别笔记
论文: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
rnet: 24x24x3, onet:48x48x3
三、人脸对齐的一些笔记
MTCNN人脸检测识别笔记的更多相关文章
- MTCNN人脸检测 附完整C++代码
人脸检测 识别一直是图像算法领域一个主流话题. 前年 SeetaFace 开源了人脸识别引擎,一度成为热门话题. 虽然后来SeetaFace 又放出来 2.0版本,但是,我说但是... 没有训练代码, ...
- 项目实战 - 原理讲解<-> Keras框架搭建Mtcnn人脸检测平台
Mtcnn它是2016年中国科学院深圳研究院提出的用于人脸检测任务的多任务神经网络模型,该模型主要采用了三个级联的网络,采用候选框加分类器的思想,进行快速高效的人脸检测.这三个级联的网络分别是快速生成 ...
- Emgu cv人脸检测识别
Emgu cv人脸检测识别 1.开发平台:WIN10 X64 VS2012 Emgucv版本:3.1 2.先给大家分享一个官网给的示例源代码: https://ncu.dl.sourcef ...
- Python学习案例之视频人脸检测识别
前言 上一篇博文与大家分享了简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统.人脸动态跟踪识别系统等等. 案例 这里我们还是使用 opencv 中 ...
- Python学习案例之人脸检测识别
前言 随着科技的发展,人脸识别技术在许多领域得到的非常广泛的应用,手机支付.银行身份验证.手机人脸解锁等等. 识别 废话少说,这里我们使用 opencv 中自带了 haar人脸特征分类器,利用训练好的 ...
- 人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)
1.Easily Create High Quality Object Detectors with Deep Learning 2016/10/11 http://blog.dlib.net/201 ...
- MTCNN 人脸检测
demo.py import cv2 from detection.mtcnn import MTCNN # 检测图片中的人脸 def test_image(imgpath): mtcnn = MTC ...
- 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别
AdaBoost 算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高. 系统在技术上的三个贡献: 1.用简单的Haa ...
- Python视频人脸检测识别
案例 这里我们还是使用 opencv 中自带了 haar人脸特征分类器,通过读取一段视频来识别其中的人脸. 代码实现: 动图有点花,讲究着看吧: 如果是捕捉摄像头,只需要改变以下代码即可: c ...
随机推荐
- angular 图片加载失败 情况处理? 如何在ionic中加载本地图片 ?
1.angular 图片加载失败 情况处理 在directive中定义组件,在ng-src错误时,调用err-src app.directive('errSrc',function(){ return ...
- sum-root-to-leaf-numbers——dfs
Given a binary tree containing digits from0-9only, each root-to-leaf path could represent a number. ...
- Selenium系列之--05 录制脚本并导出
一.下载Firefox Firefox官方下载地址:http://www.firefox.com.cn/download/#more,下载延长支持版. 二.下载插件 Selenium本身有录制功能组件 ...
- Allegro16.6和17.0和17.2中将板框导出DXF文件
Allegro16.6和17.0和17.2中将板框导出DXF文件 转载 https://blog.csdn.net/pieces_thinking/article/details/69817600 标 ...
- EhCache Monitor的使用
1.在http://ehcache.org/documentation/monitor.html#Installation_And_Configuration下载ehcache-monitor-kit ...
- kubernetes对象之deployment
系列目录 简述 Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用.典型的应 ...
- 通过Pojo对象 field 属性加注解实现格式校验,极大的降低代码量
近期做一个接口.接受外系统的报文,通过XStream转换成java对象以后.须要对当中的字段做格式校验. 要求例如以下: 传统的方式是硬编码校验.可是对于field非常多的情况.代码量暴增.easy出 ...
- php时间12小时和24小时区别
date('Y-m-d H:i:s',$row1['time']) 大写H为24小时制 小写h为12小时制
- 模式识别之ocr项目---(模板匹配&BP神经网络训练)
摘 要 在MATLAB环境下利用USB摄像头采集字符图像,读取一帧保存为图像,然后对读取保存的字符图像,灰度化,二值化,在此基础上做倾斜矫正,对矫正的图像进行滤波平滑处理,然后对字符区域进行提取分割出 ...
- 记使用WaitGroup时的一个错误
记使用WaitGroup时的一个错误 近期重构我之前写的server代码时,不当使用了WaitGroup,碰到了个错误,记录下. package main import ( "fmt&quo ...