点击上方“AI算法与图像处理”,选择加"星标"或“置顶”

重磅干货,第一时间送达

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

本文的内容预览

人脸检测的概念

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

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

人脸检测示例

在人脸检测中应用较广的算法就是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


第一步:将项目克隆下来

git clone https://github.com/YYuanAnyVision/mxnet_mtcnn_face_detection

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

这里附上文章链接:

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

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

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

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

# 例如我的电脑是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,并修改成下面即可。

#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中// 表示向下取整的除法。

# 举个例子在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

用心创作求鼓励

人脸算法系列:MTCNN人脸检测详解相关推荐

  1. OpenCV-Python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)

    OpenCV-Python实战(14)--人脸检测详解(仅需6行代码学会4种人脸检测方法) 0. 前言 1. 人脸处理简介 2. 安装人脸处理相关库 2.1 安装 dlib 2.2 安装 face_r ...

  2. Java版人脸检测详解下篇:开发java应用并做成docker镜像

    本篇概览 如果您看过<Java版人脸检测上篇>一文,甚至动手实际操作过,那么你应该会对背后的技术细节感兴趣,开发这样一个应用,咱们总共要做以下三件事: 1.准备好docker基础镜像 2. ...

  3. Java版人脸检测详解下篇:编码

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 如果您看过<三分钟极速体验:Java版 ...

  4. 人脸识别SeetaFace2原理与代码详解

    人脸识别SeetaFace2原理与代码详解 前言 一.人脸识别步骤 二.SeetaFace2基本介绍 三.seetaFace2人脸注册.识别代码详解 3.1 人脸注册 3.1.1 人脸检测 3.1.2 ...

  5. [3D检测系列-PV-RCNN] PV-RCNN论文详解、PV-RCNN代码复现、包含官网PV-RCNN预训练权重及报错问题

    [3D检测系列-PV-RCNN] PV-RCNN论文详解.PV-RCNN代码复现 一.论文详解 1.3D voxel CNN 2.体素到关键点场景编码 2.1.关键点抽样 2.2.体素抽象 3.VSA ...

  6. 大型网站架构系列:负载均衡详解(4)

    原文:大型网站架构系列:负载均衡详解(4) 本文是负载均衡详解的第四篇,主要介绍了LVS的三种请求转发模式和八种负载均衡算法,以及Haproxy的特点和负载均衡算法.具体参考文章,详见最后的链接. 三 ...

  7. 大型网站系统架构系列:负载均衡详解(一)

    大型网站系统架构系列:负载均衡详解(一) 2016-03-20 架构说 面对大量用户访问.高并发请求,海量数据,可以使用高性能的服务器.大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比 ...

  8. RxJS 系列之二 - Observable 详解

    查看新版教程,请访问前端修仙之路 RxJS 系列目录 RxJS 系列之一 - Functional Programming 简介 RxJS 系列之二 - Observable 详解 (本文) RxJS ...

  9. OpenCV实战(16)——角点检测详解

    OpenCV实战(16)--角点检测详解 0. 前言 1. Harris 特征检测器 1.1 检测 Harris 角点 1.2 cv::cornerHarris 函数参数 2. 可追踪的良好特征 3. ...

  10. 并发编程系列之volatile关键字详解

    并发编程系列之volatile关键字详解 1.volatile是什么? 首先简单说一下,volatile是什么?volatile是Java中的一个关键字,也是一种同步机制.volatile为了保证变量 ...

最新文章

  1. 美团提出基于隐式条件位置编码的Transformer,性能优于ViT和DeiT
  2. Android7.1update.zip升级在system/bin下新增可执行文件没有可执行权限问题
  3. 办公室琐事--沟通、交流
  4. 【NLP】利用jieba对网易云音乐的评论进行词云分析
  5. kafka消费速度跟不上生产速度的解决方案!
  6. DZ论坛系统 UC_KEY拿webshell
  7. CAN总线技术 | 物理层03 - 采样点
  8. 从零开始springboot 第二讲
  9. 2021-2025年中国独立式梳妆浴缸行业市场供需与战略研究报告
  10. Flask常见问题记录
  11. 使用GDAL构造OpenCV的图像格式
  12. 获得执行计划方法三-sql_trace
  13. 游戏筑基开发之menset底层实现及C语言项目常见问题解决方案(C语言)
  14. windows快速全局检索文件工具-Listary
  15. php重构求圆柱圆锥的体积,圆锥的体积 - 彭阳县第二小学数学教研社区 - 宁夏教育云...
  16. MeshBaker插件 使用套路
  17. cannon的英文名_卡农的作者是谁啊 此曲的赏析 英文名cannon不是大炮吗
  18. android 远吗编译 刷机 小米,小米10/小米10 Pro系统源代码现已开源,能刷机才是为发烧而生...
  19. jQuery框架的介绍以及基本用法--操作dom
  20. 苹果ppt_毫无惊喜的苹果新品发布会,用到的这4个PPT技巧却值得学习

热门文章

  1. 【兰陵王系列】今天给大家讲解下传奇世界开服教程
  2. android pay充值比例,Apple Pay 比 Android Pay在安全性上要略胜一成
  3. [软件试用3]AI写作软件AI-WRITER.COM:博客思路及成文解析
  4. Shopee C++ / 计网 / OS / DS / DB / 算法 部分题目解析
  5. PPT分享:基于事件解决微服务架构中分布式数据问题
  6. jquery插件chosen 选择框无法重置
  7. 字帖287 董其昌 行书《采莲曲乌夜啼》
  8. 因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的,可能会使你的系统遭受攻击。 你的系统需要SMB2或更高版本。
  9. ARM核心板为电力边缘物联代理系统助力
  10. 英语面试试题及答案中英文对照30题