人脸检测MTCNN进行人脸检测的过程

原创 2018年04月16日 11:02:34

MTCNN是比较经典快速的人脸检测技术,Github:https://github.com/kpzhang93/MTCNN_face_detection_alignment

MTCNN可实现两个任务——人脸检测与人脸关键点检测——由三个级联的轻量级CNN完成:PNet,RNet和Onet。图像数据先后经这三个网络的处理,最终输出人脸检测和关键点检测结果。

检测的过程可见于detect_face函数,以下做简单整理。

一、第一阶段:PNet

  • 输入:待检测的图像,如图:

test.jpg

  • 输出:m*n(最终特征图的尺度)个box坐标回归值以及对应的是否为人脸的得分。经过进一步的计算,得到可能为人脸的box集合,如图红色框:


  • 中间过程简述:将原图重采样(resample),得到一系列尺寸的待检测图。对于每一张待检测图,输入到PNet,会输出一系列box,去掉那些得分(score)不达标的box,并用非极大值抑制(nms)再去掉一部分box。对于所有尺寸的待检测图,都得到类似的box集合。将所有box集合合并,再用nms去除一部分box,余下的就是第一阶段最终的输出。

二、第二阶段:RNet

  • 输入:第一阶段生成的box,在原图中截取对应的区域,将所有截取得到的图像合并到一个四维矩阵中,作为RNet的输入。
  • 输出:对于输入的每个box,输出其对应的坐标回归值以及对应的是否为人脸的得分。将得分不达标的box去掉,得到第二阶段的box集合。也就是说,第二阶段是在第一阶段的基础上对box实现进一步分筛选,同时也会以通过回归将box坐标进行更新,使得其精度更高。如图:

  • 中间过程简述:略。

三、第三阶段:ONet

3.1 人脸检测

  • 输入:类似于RNet,但以第二阶段的输出为输入。
  • 输出:类似于RNet。如图:


  • 中间过程简述:略。

3.2 人脸关键点检测

  • 输入:3.1中最终得到的人脸图像。
  • 输出:N*(2*5)个坐标值。其中N是人脸的数目,每个人脸检测5个关键点。
  • 中间过程简述:略。

四、注意点

  • CNN输出的不是坐标,而是坐标的回归量(这么称不知准确与否),实际的坐标是要通过进一步计算得到的。可以参考bbreg.m文件
  • 第一阶段生成box的时候,用到了generateBoundingBox函数,是从特征图上映射到原图得到box的。如下:
function [boundingbox reg] = generateBoundingBox(map,reg,scale,t)
	%use heatmap to generate bounding boxes
    stride=2;
    cellsize=12;
    boundingbox=[];
	map=map';
	dx1=reg(:,:,1)';
	dy1=reg(:,:,2)';
	dx2=reg(:,:,3)';
	dy2=reg(:,:,4)';
    [y x]=find(map>=t);
	a=find(map>=t); 
    if size(y,1)==1
		y=y';x=x';score=map(a)';dx1=dx1';dy1=dy1';dx2=dx2';dy2=dy2';
	else
		score=map(a);
    end   
	reg=[dx1(a) dy1(a) dx2(a) dy2(a)];
	if isempty(reg)
		reg=reshape([],[0 3]);
	end
    boundingbox=[y x];
    %reg是网络输出的一部分,是坐标的回归值;score也是网络的输出,是“为目标”的得分;
    %fix((stride*(boundingbox-1)+1)/scale)是通过在最终特征图上的坐标,反求对应的原图中的感受野?
   
    boundingbox=[fix((stride*(boundingbox-1)+1)/scale) fix((stride*(boundingbox-1)+cellsize-1+1)/scale) score reg];
end
  • 将一张图像输入到PNet,可以输出m*n组box回归值(每组4个数)及其对应的score;而一张图像输入到RNet,仅会得到1组box回归值及其score;ONet与RNet类似。下图分别是PNet的conv4-2和RNet的conv5-2的参数,红色框出来的地方,显示后者将kernel_size和stride参数注释了,这应该是上述二者输出blob维度不一致的原因吧!

Mtcnn人脸检测实践(一)

放寒假了,闲来无事就开始捣鼓人脸识别了。这次看了一篇2016年的论文,算是比较新的了。论文提到一种名为“基于多任务级联卷积神经网络进行人脸检测和对齐”的算法,英文名 Joint Face Detect...
  • dapanbest
  • dapanbest
  • 2018-02-21 22:21:37
  • 319

使用卷积神经网络(CupCnn)训练人脸检测模型

结果展示 最近尝试做了下人脸检测,先上两张效果图吧: 这已经是跳出来的效果比较好的图片了,表现的确是有点差。 我用了4000(19*19)多张人脸图片和8000(19*19)多张非人脸图...
  • u011913612
  • u011913612
  • 2018-03-12 16:44:15
  • 219

人脸检测:MTCNN

《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》论文解读。本文来自于中国科学院...
  • tinyzhao
  • tinyzhao
  • 2016-11-19 23:01:02
  • 19141

人脸检测(三)——Multi-task CNN(MTCNN)

这篇文章主要记录了《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》链接 ...
  • qq_28618765
  • qq_28618765
  • 2017-09-28 20:48:23
  • 821

MTCNN-将多任务级联卷积神经网络用于人脸检测和对齐

论文链接:  https://kpzhang93.github.io/MTCNN_face_detection_alignment/,本文是根据自己的理解翻译的如有错误,还请见谅,评论提出,立马修...
  • lff1208
  • lff1208
  • 2017-08-17 14:40:21
  • 8472

人脸检测、人脸对齐(MTCNN方法)

众所众知,严格定义上的人脸识别分为四个步骤: ①人脸检测:从图片中准确定位到人脸 ②人脸矫正(对齐): 检测到的人脸,可能角度不是很正,需要使其对齐 ③对矫正后的人脸进行特征提取 ④对两张人脸图像的特...
  • zxj942405301
  • zxj942405301
  • 2017-05-13 13:54:51
  • 4526

基于NCNN的人脸检测MTCNN实现过程

本文主要讲述当你拿到MTCNN的caffemodel后,如何使用它对一张图里的人脸进行检测和特征点标定。 相当于一个代码实现的解释。因为最近卤煮在用ncnn,所以该代码也是基于ncnn架构做的。 c...
  • sinat_24143931
  • sinat_24143931
  • 2017-12-12 09:12:00
  • 2016

人脸识别之人脸检测(十四)--MTCNN

本文来自于中国科学院深圳先进技术研究院,目前发表在arXiv上,是2016年4月份的文章,算是比较新的文章。 论文地址:https://kpzhang93.github.io/MTCNN_face_d...
  • App_12062011
  • App_12062011
  • 2017-12-18 19:41:04
  • 754

人脸检测算法MTCNN

本文将对人脸检测效果不错的MTCNN算法做一个梳理。 论文地址 MTCNN主要分为三步: 最初先对图像进行多尺度变换,获取图像金字塔,获取图像多尺度信息。P-net(Proposal Netwo...
  • xygl2009
  • xygl2009
  • 2017-09-09 19:56:25
  • 2118

实时人脸检测

实时人脸检测 (Real-Time Face Detection)   (2014-08-24 17:23:16) 转载▼ 标签:  人脸检测   机器学习   adaboost  ...
  • Real_Myth
  • Real_Myth
  • 2016-04-28 10:18:48
  • 1582
收藏助手
不良信息举报
您举报文章:人脸检测MTCNN进行人脸检测的过程
举报原因:
原因补充:

(最多只允许输入30个字)