Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >人脸算法系列:MTCNN人脸检测详解

人脸算法系列:MTCNN人脸检测详解

作者头像
AI算法与图像处理
发布于 2020-03-26 03:13:34
发布于 2020-03-26 03:13:34
2.7K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,从今天起我要开始更新人脸识别系列的文章了。为了提升自己水平,输入更优质的内容,我报了一个培训班,人脸识别相关的,但是这资料是不能分享给大家的,但是我将分享培训班课程的部分课后作业,挖掘出更多宝贵的内容与大家分享。我会尽可能多的参考大量资料,希望能给大家提供一些帮助,如果觉得有用的,帮我分享出去,谢啦!

本文的内容预览

人脸检测的概念

人脸检测是一种在多种应用中使用的计算机技术,可以识别数字图像中的人脸。人脸检测还指人类在视觉场景中定位人脸的过程

人脸检测可以视为目标检测的一种特殊情况。在目标检测中,任务是查找图像中给定类的所有对象的位置和大小。例如行人和汽车。

人脸检测示例

在人脸检测中应用较广的算法就是MTCNN( Multi-task Cascaded Convolutional Networks的缩写)。MTCNN算法是一种基于深度学习的人脸检测和人脸对齐方法,它可以同时完成人脸检测和人脸对齐的任务,相比于传统的算法,它的性能更好,检测速度更快。

本文目的不是为了强调MTCNN模型的训练,而是如何使用MTCNN提取人脸区域和特征点,为后续例如人脸识别和人脸图片预处理做铺垫。

接下来介绍MTCNN的使用,让大家对其有一个直观的感受,再深入了解其原理。

MTCNN的使用

Paper地址:https://kpzhang93.github.io/MTCNN_face_detection_alignment/ github链接:https://github.com/kpzhang93/MTCNN_face_detection_alignment 其他版本:https://github.com/AITTSMD/MTCNN-Tensorflow

作者是基于caffe实现的,因为本人配置了多次,都失败了,因此尝试了其他框架的,采用mxnet框架,当然也附上了pytorch版本的。

本次使用的项目链接:https://github.com/YYuanAnyVision/mxnet_mtcnn_face_detection

其他参考: pytorch版本:https://github.com/TropComplique/mtcnn-pytorch


第一步:将项目克隆下来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/YYuanAnyVision/mxnet_mtcnn_face_detection

当然很有可能会中途失败,我自己也是尝试多次都没搞定,又慢又老是不行。不过之前分享过一个妙招,如果看过的小伙伴一定知道如何解决。

这里附上文章链接:

完美解决Github上下载项目失败或速度太慢的问题

第二步:配置好所需的环境

mxnet的安装非常容易,这里以我的电脑为例安装GPU版本的mxnet

只需一行代码即可完成安装,首先查询自己所安装cuda的版本,并输入对应的指令即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 例如我的电脑是cuda 9.0的
pip install mxnet-cu90

这里有补充说明https://pypi.org/project/mxnet-cu90/,更多内容可以百度搜索解决。

第三步:运行代码

该项目已经有预训练模型了,直接运行main.py即可。

但是你一运行,就会发现 哦豁,报错了。

这是因为该项目是用python2写的,所以存在一些需要修改的地方。

问题一:ImportError: cannot import name 'izip' (报错文件 mtcnn_detector.py)

解决方案:python3中的zip就相当于 python2 itertools里的izip

因此,只需要做以下修改即可,在mtcnn_detector.py将报错的from itertools import izip注释掉,下面加一行试试看。

具体操作,在main.py中找到 from itertools import izip,并修改成下面即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#from itertools import izip
izip = zip

解决了之后在运行一次main.py

卧槽,又不行了

问题2:TypeError: 'float' object cannot be interpreted as an integer

类型错误:“float”对象不能解释为整数

解决方法:将报错的地方存在的 “/” 都修改成 “//” 即可,同类报错,相同的解决方法。

python2和python3中运算符的区别。

python3中 / 运算的结果是含有浮点数的。而python2中/是等价于python3中的 // ,python3中// 表示向下取整的除法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 举个例子在python3中 //
print(3/2,3//2) # 输出 1.5, 1

历经千辛万苦,最终展示效果:

到这里我们已经能够检测到人脸了,对于自己的图片,只需要修改main.py中读入的图片路径即可。更多自定义操作,例如批量处理和保存,可以根据自己的需求来添加。

MTCNN的原理

对于如此经典的网络仅仅掌握其使用还是不够的,因此接下来将详细的说明一下其内在的原理。

图片来源与论文原文

从上图可以知道主要包括四个操作,三个步骤。

1、图像金字塔

对图片进行Resize操作,将原始图像缩放成不同的尺度,生成图像金字塔。然后将不同尺度的图像送入到这三个子网络中进行训练,目的是为了可以检测到不同大小的人脸,从而实现多尺度目标检测。

图像金字塔是图像中多尺度表达的一种。对于图像金字塔的具体原理这里不详细展开,有兴趣可以参考这篇文章:https://zhuanlan.zhihu.com/p/80362140

三个子网络图

2、P-Net(Proposal Network)

论文原文对P-Net的描述:该网络结构主要获得了人脸区域的候选框和边界框的回归向量。然后基于预测边界框回归向量对候选框进行矫正。在这之后,我们采用NMS来合并重叠率高的候选框。

P-Net是一个人脸区域的候选网络,该网络的输入一个12x12x3的图像,通过3层的卷积之后,判断这个12x12的图像中是否存在人脸,并且给出人脸框的回归和人脸关键点。

网络的第一部分输出是用来判断该图像是否存在人脸,输出向量大小1x1x2,也就是两个值。

网络的第二部分给出框的精确位置,一般称为框回归。P-Net输入的12×12的图像块可能并不是完美的人脸框的位置,如有的时候人脸并不正好为方形,有可能12×12的图像偏左或偏右,因此需要输出当前框位置相对完美的人脸框位置的偏移。这个偏移大小为1×1×4,即表示框左上角的横坐标的相对偏移,框左上角的纵坐标的相对偏移、框的宽度的误差、框的高度的误差。

网络的第三部分给出人脸的5个关键点的位置。5个关键点分别对应着左眼的位置、右眼的位置、鼻子的位置、左嘴巴的位置、右嘴巴的位置。每个关键点需要两维来表示,因此输出是向量大小为1×1×10。

3、R-Net(Refine Network)

论文原文对P-Net的描述:P-Net的所有候选框都输入到R-Net中,该网络结构还是通过边界框回归和NMS来去掉大量的false-positive区域。

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

4、O-Net(Output Network)

论文原文对O-Net的描述:这个阶段类似于第二阶段,但是在这个阶段在此阶段,我们目的通过更多的监督来识别面部区域。特别是,网络将输出五个面部关键点的位置。

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

总结:

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

对各个网络结果的作用理解之后,我们深入了解一下其所采用的损失函数。

MTCNN的损失函数

针对人脸识别问题,直接使用交叉熵代价函数,对于框回归和关键点定位,使用L2损失。最后把这三部分的损失各自乘以自身的权重累加起来,形成最后的总损失。 1、人脸识别损失函数(cross-entry loss)

2、回归框的损失函数 (Euclidean loss)

3、关键点的损失函数 (Euclidean loss)

4、总损失

具体的各个公式的含义,大家应该都明白,这里强调一下,最后的总损失前添加了一个权重 α ,即损失函数所对应的权重是不一致的。详细设置可以参看论文原文。

END

参考文献:

https://en.wikipedia.org/wiki/Face_detection

https://fishc.com.cn/thread-108647-1-1.html

https://blog.csdn.net/qq_41185868/article/details/100942855

https://zhuanlan.zhihu.com/p/58825924

https://www.cnblogs.com/zyly/p/9703614.html

https://blog.csdn.net/qq_36782182/article/details/83624357#commentBox

https://zhuanlan.zhihu.com/p/80362140

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI算法与图像处理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于Pytorch实现人脸关键点检测模型MTCNN
MTCNN,Multi-task convolutional neural network(多任务卷积神经网络),将人脸区域检测与人脸关键点检测放在了一起,总体可分为P-Net、R-Net、和O-Net三层网络结构。它是2016年中国科学院深圳研究院提出的用于人脸检测任务的多任务神经网络模型,该模型主要采用了三个级联的网络,采用候选框加分类器的思想,进行快速高效的人脸检测。这三个级联的网络分别是快速生成候选窗口的P-Net、进行高精度候选窗口过滤选择的R-Net和生成最终边界框与人脸关键点的O-Net。和很多处理图像问题的卷积神经网络模型,该模型也用到了图像金字塔、边框回归、非最大值抑制等技术。
夜雨飘零
2021/12/07
2K0
基于Pytorch实现人脸关键点检测模型MTCNN
MTCNN算法与代码理解—人脸检测和人脸对齐联合学习
主页:https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html 论文:https://arxiv.org/abs/1604.02878 代码:官方matlab版、C++ caffe版 第三方训练代码:tensorflow、mxnet
李拜六不开鑫
2018/12/26
2.3K0
基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+Laplacian(模糊度检测) 的人脸检测服务
「 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》」
山河已无恙
2023/10/22
5170
基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+Laplacian(模糊度检测) 的人脸检测服务
基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/10/16
5540
基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务
【人脸检测】Compact Cascade CNN和MTCNN算法
【文章导读】目前人脸识别技术已经遍地开花,火车站、机场、会议签到等等领域都有应用,人脸识别的过程中有个重要的环节叫做人脸检测,顾名思义就是在一张图片中找出所有的人脸的位置,早期的人脸检测是用人工提取特征的方式,训练分类器,比如opencv中自带的人脸检测器使用了haar特征,早期的这种算法自然是鲁棒性、抗干扰性太差,本文主要来介绍近几年的几种用卷积神经网络做的经典算法。
张俊怡
2018/09/19
1.9K0
【人脸检测】Compact Cascade CNN和MTCNN算法
人脸检测和对齐算法MTCNN
人脸识别在实际的生活中有着广泛的应用,得益于深度学习的发展,使得人脸识别的准确率得到大幅度提升。然而,为了做好人脸识别,第一步需要做的是对人脸检测,主要是通过对图片分析,定位出图片中的人脸。近年来,深度学习在人脸检测方面也得到了大力发展,在2016年Kaipeng Zhang, Zhanpeng Zhang等人提出了人脸检测算法MTCNN(Multi-task Cascaded Convolutional Networks)模型[1],MTCNN算法的效果也是得到了很多实际项目的验证,在工业界得到了广泛的应用,在我个人的实际项目中也得到了较多应用。在MTCNN算法中,主要有三点的创新:
felixzhao
2022/12/31
3.5K0
人脸检测和对齐算法MTCNN
人脸检测对齐--Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
用户1148525
2018/01/03
1.3K0
人脸检测对齐--Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
『人脸识别系列教程』0·MTCNN讲解
背景介绍: 人脸检测,解决两个问题:1)识别图片中有没有人脸?2)如果有,人脸在哪?因此,许多人脸应用(人脸识别、面向分析)的基础是人脸检测。 大多数人脸检测采用的流程为两阶段: 1) 找出所有可能是人脸的候选区域 2) 从候选区域中选择出最可能是人脸的区域 本文的主角MTCNN,大致是这种套路,也集成了其优缺点为:准和慢。 MTCNN人脸检测是2016年的论文提出来的,MTCNN的“MT”是指多任务学习(Multi-Task),在同一个任务中同时学习”识别人脸“、”边框回归“、”人脸关键点识别“。相比2015年的CVPR(边框调整和识别人脸分开做)的结构,MTCNN是有创新的。 从工程实践上,MTCNN是一种检测速度和准确率都还不错的算法,算法的推断流程有一定的启发性,在这里给大家分享。(以下用“MTCNN”代指这个算法)本文以Q&A的方式,与你分享一些经验和思考。先列出本文会回答的问题列表:
小宋是呢
2022/03/07
1.7K0
『人脸识别系列教程』0·MTCNN讲解
[深度学习概念]·人脸识别MTCNN解析
人脸识别MTCNN解析 源代码,效果相当不错(只有测试代码): https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.ht
小宋是呢
2019/06/27
1.5K0
[深度学习概念]·人脸识别MTCNN解析
人脸检测和对齐算法MTCNN
人脸识别在实际的生活中有着广泛的应用,得益于深度学习的发展,使得人脸识别的准确率得到大幅度提升。然而,为了做好人脸识别,第一步需要做的是对人脸检测,主要是通过对图片分析,定位出图片中的人脸。近年来,深度学习在人脸检测方面也得到了大力发展,在2016年Kaipeng Zhang, Zhanpeng Zhang等人提出了人脸检测算法MTCNN(Multi-task Cascaded Convolutional Networks)模型[1],MTCNN算法的效果也是得到了很多实际项目的验证,在工业界得到了广泛的应用,在我个人的实际项目中也得到了较多应用。在MTCNN算法中,主要有三点的创新:
felixzhao
2022/12/23
1.3K0
人脸识别系列三 | MTCNN算法详解上篇
我们前面分享了PCA,Fisher Face,LBPH三种传统的人脸识别算法,Dlib人脸检测算法。今天我们开始分享一下MTCNN算法,这个算法可以将人脸检测和特征点检测结合起来,并且MTCNN的级联结构对现代的人脸识别也产生了很大的影响。上篇为大家介绍MTCNN的算法原理和训练技巧,下篇为大家解析MTCNN算法的代码和进行demo演示。论文地址为:https://arxiv.org/ftp/arxiv/papers/1604/1604.02878.pdf
BBuf
2019/12/04
5.2K0
人脸识别系列三 | MTCNN算法详解上篇
人脸检测
算法:人脸检测是将人脸区域检测与人脸关键点检测放在了一起,它的主题框架类似于cascade。总体可分为P-Net、R-Net、和O-Net三层网络结构。
裴来凡
2022/05/29
2.6K0
人脸检测
手把手教学,人脸检测小案例 opencv+MTCNN
哈喽,大家好,今天我们一起来做一个人脸检测的小应用案例,看看现在满大街普及的人脸检测到底是个什么玩意儿。其实,这个技术没那么唬人,现在技术已经非常成熟啦。小白同学可以跟着我一步一步操作,就能够实现。
唐国梁Tommy
2021/05/08
1.9K0
手把手教学,人脸检测小案例 opencv+MTCNN
干货 | MTCNN实时人脸检测网络详解与代码演示
多任务卷积神经网络(MTCNN)实现人脸检测与对齐是在一个网络里实现了人脸检测与五点标定的模型,主要是通过CNN模型级联实现了多任务学习网络。整个模型分为三个阶段,第一阶段通过一个浅层的CNN网络快速产生一系列的候选窗口;第二阶段通过一个能力更强的CNN网络过滤掉绝大部分非人脸候选窗口;第三阶段通过一个能力更加强的网络找到人脸上面的五个标记点;完整的MTCNN模型级联如下:
OpenCV学堂
2018/12/17
2.5K0
【深度学习】人脸检测与人脸识别
人脸是个人重要的生物特征,业界很早就对人脸图像处理技术进行了研究。人脸图像处理包括人脸检测、人脸识别、人脸检索等。人脸检测是在输入图像中检测人脸的位置、大小;人脸识别是对人脸图像身份进行确认,人脸识别通常会先对人脸进行检测定位,再进行识别;人脸检索是根据输入的人脸图像,从图像库或视频库中检索包含该人脸的其它图像或视频。
杨丝儿
2022/03/20
11.6K0
【深度学习】人脸检测与人脸识别
深度学习之视频人脸识别系列二:人脸检测与对齐
人脸检测解决的问题为给定一张图片,输出图片中人脸的位置,即使用方框框住人脸,输出方框的左上角坐标和右下角坐标或者左上角坐标和长宽。算法难点包括:人脸大小差异、人脸遮挡、图片模糊、角度与姿态差异、表情差异等。而关键检测则是输出人脸关键点的坐标,如左眼(x1,y1)、右眼(x2,y2)、鼻子(x3,y3)、嘴巴左上角(x4,y4)、嘴巴右上角(x5,y5)等。
磐创AI
2018/08/20
2.3K0
深度学习之视频人脸识别系列二:人脸检测与对齐
人脸检测算法综述
人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一,它在安防监控,人证比对,人机交互,社交和娱乐等方面有很强的应用价值,也是整个人脸识别算法的第一步。在本文中,SIGAI将和大家一起回顾人脸检测算法的整个发展历史。
SIGAI学习与实践平台
2018/08/07
3.4K0
人脸检测算法综述
深度学习在人脸检测中的应用 | CSDN 博文精选
在目标检测领域,可以划分为人脸检测与通用目标检测,往往人脸这方面会有专门的算法(包括人脸检测、人脸识别、人脸其他属性的识别等),并且和通用目标检测(识别)会有一定的差别。这主要来源于人脸的特殊性(譬如有时候目标比较小、人脸之间特征不明显、遮挡问题等),本文将主要从人脸检测方面来讲解目标检测。
AI科技大本营
2019/07/11
1.2K0
深度学习在人脸检测中的应用 | CSDN 博文精选
从传统方法到深度学习,人脸关键点检测方法综述
人脸关键点检测是人脸识别和分析领域中的关键一步,它是诸如自动人脸识别、表情分析、三维人脸重建及三维动画等其它人脸相关问题的前提和突破口。近些年来,深度学习方法由于其自动学习及持续学习能力,已被成功应用到了图像识别与分析、语音识别和自然语言处理等很多领域,且在这些方面都带来了很显著的改善。因此,本文针对深度学习方法进行了人脸关键点检测的研究。 关键词:人脸关键点;人脸特征点;人脸对齐;卷积神经网络 目录 一、引言 二、人脸关键点检测方法 2.1 ASM (Active Shape Models) 2.2 AA
企鹅号小编
2018/02/24
2.9K0
从传统方法到深度学习,人脸关键点检测方法综述
人脸算法系列(二):RetinaFace论文精读
大家好,今天给大家分享一篇人脸算法领域非常知名的paper,RetinaFace(RetinaFace: Single-stage Dense Face Localisation in the Wild)。同时也在文末附上开源项目的链接。 跟着我一起读这篇论文,希望论文的思路能够对你有所启发,如果觉得有用的,帮我分享出去,谢啦!
AI算法与图像处理
2020/04/15
8.3K0
推荐阅读
相关推荐
基于Pytorch实现人脸关键点检测模型MTCNN
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验