点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:opencv学堂

MTCNN模型概述

多任务卷积神经网络(MTCNN)实现人脸检测与对齐是在一个网络里实现了人脸检测与五点标定的模型,主要是通过CNN模型级联实现了多任务学习网络。整个模型分为三个阶段,第一阶段通过一个浅层的CNN网络快速产生一系列的候选窗口;第二阶段通过一个能力更强的CNN网络过滤掉绝大部分非人脸候选窗口;第三阶段通过一个能力更加强的网络找到人脸上面的五个标记点;完整的MTCNN模型级联如下:

该模型的特征跟HAAR级联检测在某些程度上有一定的相通之处,都是采用了级联方式,都是在初期就拒绝了绝大多数的图像区域,有效的降低了后期CNN网络的计算量与计算时间。MTCNN模型主要贡献在于:
1.提供一种基于CNN方式的级联检测方法,基于轻量级的CNN模型就实现了人 脸检测与点位标定,而且性能实时。
2.实现了对难样本挖掘在线训练提升性能
3.一次可以完成多个任务。

阶段方法详解

第一阶段
网络是全卷积神经网络是一个推荐网络简称 P-Net, 主要功能是获得脸部区域的窗口与边界Box回归,获得的脸部区域窗口会通过BB回归的结果进行校正,然后使用非最大压制(NMS)合并重叠窗口。
第二阶段
网络模型称为优化网络R-Net,大量过滤非人脸区域候选窗口,然后继续校正BB回归的结果,使用NMS进行合并。
第三阶段
网络模型称为O-Net,输入第二阶段数据进行更进一步的提取,最终输出人脸标定的5个点位置。

网络架构与训练

对CNN网络架构,论文作者发现影响网络性能的因素主要原因有两个:

1.样本的多样性缺乏会影响网络的鉴别能力
2.相比其它的多类别的分类与检测任务来说,人脸检测是一个二分类,每一层不需要太多filters,也就是说每层网络的feature maps个数不需要太多。

根据上述两个因素,作者设计网络每层的filter个数有限,但是它增加了整个网络的深度,这样做的好处是可以显著减少计算量,提升整个网络性能,同时全部改用3x3的filter更进一步降低计算量,在卷积层与全连接层使用PReLU作为非线性激活函数(输出层除外)整个网络架构如下:

训练这个网络需要如下三任务得到收敛

1.人脸二元分类
2.BB回归(bounding box regression)
3.标记定位(Landmark localization)

训练时候对于人脸采用交叉熵损失:

BB回归损失:
对每个候选窗口,计算它与标注框之间的offset,目标是进行位置回归,计算其平方差损失如下:

脸部landmark位置损失:

总计有五个点位坐标分别为左眼、右眼、鼻子、左嘴角、右嘴角
因为每个CNN网络完成不同的训练任务,所以在网络学习/训练阶段需要不同类型的训练数据。所以在计算损失的时候需要区别对待,对待背景区域,在R-Net与O-Net中的训练损失为0,因为它没有包含人脸区域,通过参数beta=0来表示这种类型。总的训练损失可以表示如下:

在P-Net中对人脸进行二元分类时候就可以在线进行难样本挖掘,在网络前向传播时候对每个样本计算得到的损失进行排序(从高到低)然后选择70%进行反向传播,原因在于好的样本对网络的性能提升有限,只有那些难样本才能更加有效训练,进行反向传播之后才会更好的提升整个网络的人脸检测准确率。作者的对比实验数据表明这样做可以有效提升准确率。在训练阶段数据被分为四种类型

负样本:并交比小于0.3
正样本:并交比大于0.65
部分脸:并交比在0.4~0.65之间
Landmark脸:能够找到五个landmark位置的

其中在负样本与部分脸之间并没有明显的差异鸿沟,作者选择0.3与0.4作为区间。

正负样本被用来实现人脸分类任务训练
正样本与部分脸样本训练BB回归
Landmark脸用来训练人脸五个点位置定位

整个训练数的比例如下:

负样本:正样本:部分脸:landmark脸=3:1:1:2

测试代码

加载网络

print('Creating networks and loading parameters')
with tf.Graph().as_default():gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction)sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))with sess.as_default():pnet, rnet, onet = align.detect_face.create_mtcnn(sess, None)

人脸检测

def detection(image):minsize = 20  # minimum size of facethreshold = [0.6, 0.7, 0.7]  # three steps's thresholdfactor = 0.709  # scale factor# detect with RGB imageh, w = image.shape[:2]bounding_boxes, _ = align.detect_face.detect_face(image, minsize, pnet, rnet, onet, threshold, factor)if len(bounding_boxes) < 1:print("can't detect face in the frame")return Noneprint("num %d faces detected"% len(bounding_boxes))bgr = cv.cvtColor(image, cv.COLOR_RGB2BGR)for i in range(len(bounding_boxes)):det = np.squeeze(bounding_boxes[i, 0:4])bb = np.zeros(4, dtype=np.int32)# x1, y1, x2, y2bb[0] = np.maximum(det[0] - margin / 2, 0)bb[1] = np.maximum(det[1] - margin / 2, 0)bb[2] = np.minimum(det[2] + margin / 2, w)bb[3] = np.minimum(det[3] + margin / 2, h)cv.rectangle(bgr, (bb[0], bb[1]), (bb[2], bb[3]), (0, 0, 255), 2, 8, 0)cv.imshow("detected faces", bgr)return bgr

实时摄像头检测

capture = cv.VideoCapture(0)
height = capture.get(cv.CAP_PROP_FRAME_HEIGHT)
width = capture.get(cv.CAP_PROP_FRAME_WIDTH)
out = cv.VideoWriter("D:/mtcnn_demo.mp4", cv.VideoWriter_fourcc('D', 'I', 'V', 'X'), 15,(np.int(width), np.int(height)), True)
while True:ret, frame = capture.read()if ret is True:frame = cv.flip(frame, 1)cv.imshow("frame", frame)rgb = cv.cvtColor(frame, cv.COLOR_BGR2RGB)result = detection(rgb)out.write(result)c = cv.waitKey(10)if c == 27:breakelse:breakcv.destroyAllWindows()

运行演示:

本来想上传视频的发现上传不了了,所以就把视频写成多张连续的图像,截屏显示各种效果,其实视频十分流畅,效果也非常的好。

有遮挡、部分脸检测

侧脸检测

角度俯仰脸检测

总结一下
整个模型的运行速度极快,即使在CPU上也可以完全达到实时性能,关键是其检测准确率与稳定性跟HAAR/LBP的方式相比,你就会感觉HAAR/LBP的方式就是渣,完全凉啦!

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

干货 | MTCNN实时人脸检测网络详解与代码演示相关推荐

  1. JDA人脸检测算法详解

    JDA人脸检测算法详解: 第一步: JDA算法原理详解: 作者建立了一个叫post classifier的分类器,方法如下: 1.样本准备:首先作者调用OpenCV的Viola-Jones分类器,将r ...

  2. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

  3. MGN网络详解以及代码分析

    MGN网络详解以及代码分析 最近阅读了云从科技最新的关于REID的论文以及相关的博客和代码,算法是基于MGN,关于网络的部分,这里记录一些自己的学习笔记. 以下是我参考的博客和代码的网址 博客: ht ...

  4. 干货 | OpenCV中KLT光流跟踪原理详解与代码演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 稀疏光流跟踪(KLT)详解 在视频移动 ...

  5. Linux下线程池概念详解以及代码演示

    线程池 概念 多个线程的组合,但是总数量不会超出池子的限制.是多执行流并发/并行处理,每当任务到来都会从池子里取出一个空闲的线程去进行处理. 产生原因 线程若是不限制数量的创建,在峰值的压力下,线程创 ...

  6. go语言结构体详解与代码演示

    目录 golang结构体定义 结构体的访问属性 结构体的初始化.赋值 方式1: 方式2: 方式3: 方式4: 全部代码 匿名结构体 结构体的匿名字段 结构体的构造函数 构造函数 指针构造与对象构造 给 ...

  7. 操作系统:FIFO算法详解及代码演示

    FIFO算法 FIFO算法是最简单的页面置换算法.FIFO算法为每个页面记录了调到内存的时间.当必须置换页面的时候,选择最旧的页面. 通俗来说,每次进入主存的时候 如果主存中不存在这个页面,那么最先进 ...

  8. CPU实时人脸检测,各种朝向、侧脸都检出来

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 鉴于一般的 CNN 难以处理旋转的图像,中国科学院计算技术研究所的研究者采用一种渐进的方法校准 ...

  9. IFM网络详解及torch复现

    文章目录 IFM网络详解 网络结构代码 训练代码 main IFM网络详解 https://mp.weixin.qq.com/s?__biz=Mzk0MzIzODM5MA==&mid=2247 ...

最新文章

  1. 15个Android通用流行框架大全
  2. WebLogic Server的Identity Assertion--转载
  3. 报告!我还有几个阿里同事也去了亚运会
  4. xshell MySQL表备份_shell mysql数据迁移/备份
  5. js 函数实参列表arguments和形参的那点事儿
  6. 哈啰单车突发网络故障 网友上班迟到狂吐槽
  7. 王道训练营作业 C++
  8. 智能插帧,打造丝滑视频体验
  9. 管理多个java版本,OS X中使用jEnv管理多个Java版本
  10. java静态代码块,构造代码块,构造函数,mian()代码执行顺序详细分析
  11. 廊坊金彩教育:店铺装修怎么更吸引客户
  12. matlab调制变声,MATLAB变声程序代码
  13. Java~大厂面试八股文~强烈推荐视频
  14. python求和1到100_python求1到100的和的几种方法
  15. Mac 直接在word 中使用latex编辑公式
  16. 游戏技能效果与buff设定
  17. C++动态分配内存new delete
  18. 2019年安徽省大学生网络攻防赛赛前培训——Day2
  19. Pytorch的优化器总结归纳
  20. “机器学习就是现代统计学”

热门文章

  1. 2018 中国AI人才大调查:14张图表解读他们来自何处,又将去往何方?
  2. 2018年 IEEE Fellow出炉!清华、上交、北大、中科大...看看名单里还有谁?
  3. 如何凭本事搞砸公司的重大项目?
  4. Slf4j 包老冲突,每次排查半天,是什么原因?怎么解决?
  5. 分布式存储 Ceph 的演进经验 · SOSP 2019
  6. 面试官:你说熟悉MySQL事务,那来谈谈事务的实现原理吧!
  7. 一位后端妹纸的面试总结(美团+阿里+携程+58+贝贝+招银+华为+....)
  8. 当我们在说微服务治理的时候究竟在说什么
  9. 会刷编程竞赛题的AlphaCode来了!
  10. 20W奖金+实习机会:阿里巴巴达摩院最新时间序列赛事来了!