【课程总结】Day13(下):人脸识别和MTCNN模型

前言

在上一章课程【课程总结】Day13(上):使用YOLO进行目标检测,我们了解到目标检测有两种策略,一种是以YOLO为代表的策略:特征提取→切片→分类回归;另外一种是以MTCNN为代表的策略:先图像切片→特征提取→分类和回归。因此,本章内容将深入了解MTCNN模型,包括:MTCNN的模型组成、模型训练过程、模型预测过程等。

人脸识别

在展开了解MTCNN之前,我们对人脸检测先做一个初步的梳理和了解。人脸识别细分有两种:人脸检测和人脸身份识别。

人脸检测

简述

人脸检测是一个重要的应用领域,它通常用于识别图像或视频中的人脸,并定位其位置。

识别过程
  1. 输入图像:首先,将包含人脸的图像输入到人脸检测模型中。
  2. 特征提取:深度学习模型将学习提取图像中的特征,以便识别人脸。
  3. 人脸定位:模型通过在图像中定位人脸的位置,通常使用矩形边界框来框定人脸区域。
  4. 输出结果:最终输出包含人脸位置信息的结果,可以是边界框的坐标或其他形式的标注。
输入输出
  • 输入:一张图像
  • 输出:所有人脸的坐标框
应用场景
  • 表情识别:识别人脸的表情,如快乐、悲伤等。
  • 年龄识别:根据人脸特征推断出人的年龄段。
  • 人脸表情生成:通过检测到的人脸生成不同的表情。

人脸检测特点

人脸检测是目标检测中最简单的任务

  • 类别少
  • 人脸形状比较固定
  • 人脸特征比较固定
  • 周围环境一般比较好

人脸身份识别

简述

人脸身份识别是指通过识别人脸上的独特特征来确定一个人的身份。

识别过程

人脸录入流程

  1. 数据采集:采集包含人脸的图像数据集。
  2. 人脸检测:使用人脸检测算法定位图像中的人脸区域。
  3. 人脸特征提取:通过深度学习模型提取人脸图像的特征向量。
  4. 特征向量存储:将提取到的特征向量存储在向量数据库中。

人脸验证流程

  1. 人脸检测:使用人脸检测算法定位图像中的人脸区域。
  2. 人脸特征提取:通过深度学习模型提取人脸图像的特征向量。
  3. 人脸特征匹配:将输入人脸的特征向量与向量数据库中的特征向量进行匹配。
  4. 身份识别:根据匹配结果确定输入人脸的身份信息。
应用领域
  • 安防监控:用于门禁系统、监控系统等,实现人脸识别进出控制。
  • 移动支付:通过人脸识别来进行身份验证,实现安全的移动支付功能。
  • 社交媒体:用于自动标记照片中的人物,方便用户管理照片。
  • 人机交互:实现人脸识别登录、人脸解锁等功能。

一般来说,一切目标检测算法都可以做人脸检测,但是由于通用目标检测算法做人脸检测太重了,所以会使用专门的人脸识别算法,而MTCNN就是这样一个轻量级和专业级的人脸检测网络。

MTCNN模型

简介

MTCNN(Multi-Task Cascaded Convolutional Neural Networks)是一种用于人脸检测和面部对齐的神经网络模型。

论文地址:https://arxiv.org/abs/1604.02878v1

模型结构
  • MTCNN采用了级联结构,包括三个阶段的深度卷积网络,分别用于人脸检测和面部对齐。
  • 每个阶段都有不同的任务,包括人脸边界框回归、人脸关键点定位等。

这个级联过程,相当于海选→淘汰赛→决赛的过程。

整体流程

上图是论文中对于MTCNN整体过程的图示,我们换一种较为容易易懂的图示来理解整体过程:

  1. 先将图片生成不同尺寸的图像金字塔,以便识别不同大小的人脸。
  2. 将图片输入到P-net中,识别出可能包含人脸的候选窗口。
  3. 将P-net中识别的可能人脸的候选窗口输入到R-net中,识别出更精确的人脸位置。
  4. 将R-net中识别的人脸位置输入到O-net中,进行更加精细化识别,从而找到人脸区域。

备注:上图引用自科普:什么是mtcnn人脸检测算法

P-net:人脸检测
  • 名称:提议网络(proposal network)
  • 作用:P网络通过卷积神经网络(CNN)对输入图像进行处理,识别出可能包含人脸的候选窗口,并对这些候选窗口进行边界框的回归,以更准确地定位人脸位置。
  • 特点
    • 纯卷积网络,无全链接(精髓所在
R-net:人脸对齐
  • 名称:精修网络(refine network)
  • 作用:R网络通过分类器和回归器对P网络生成的候选窗口进行处理,进一步筛选出包含人脸的区域,并对人脸位置进行修正,以提高人脸检测的准确性。
O-net:人脸识别
  • 名称:输出网络(output network)
  • 作用:O网络通过更深层次的卷积神经网络处理人脸区域,优化人脸位置和姿态,并输出面部关键点信息,为后续的面部对齐提供重要参考。
MTCNN用到的主要模块
图像金字塔

MTCNN的P网络使用的检测方式是:设置建议框,用建议框在图片上滑动检测人脸

由于P网络的建议框的大小是固定的,只能检测12*12范围内的人脸,所以其不断缩小图片以适应于建议框的大小,当下一次图像的最小边长小于12时,停止缩放。

IOU

定义:IOU(Intersection over Union)是指交并比,是目标检测领域常用的一种评估指标,用于衡量两个边界框(Bounding Box)之间的重叠程度。
两种方式:

  • 交集比并集
  • 交集比最小集

O网络iou值大于阈值的框被认为是重复的框会丢弃,留下iou值小的框,但是如果出现了下图中大框套小框的情况,则iou值偏小也会被保留,是我们不想看到的,因此我们在O网络采用了第二种方式的iou以提高误检率。

NMS(Non-Maximum Suppression,非极大值抑制)

定义
NMS是一种目标检测中常用的技术,旨在消除重叠较多的候选框,保留最具代表性的边界框,以提高检测的准确性和效率。

工作原理
NMS的工作原理是通过设置一个阈值,比如IOU(交并比)阈值,对所有候选框按照置信度进行排序,然后从置信度最高的候选框开始,将与其重叠度高于阈值的候选框剔除,保留置信度最高的候选框。

  • 如上图所示框出了五个人脸,置信度分别为0.98,0.83,0.75,0.81,0.67,前三个置信度对应左侧的Rose,后两个对应右侧的Jack。
  • NMS将这五个框根据置信度排序,取出最大的置信度(0.98)的框分别和剩下的框做iou保留iou小于阈值的框(代码中阈值设置的是0.3),这样就剩下0.81和0.67这两个框了。
  • 重复上面的过程,取出置信度(0.81)大的框和剩下的框做iou,保留iou小于阈值的框。这样最后只剩下0.98和0.81这两个人脸框了。
代码实现

P-Net

import torch
from torch import nn"""P-Net
"""class PNet(nn.Module):def __init__(self):super().__init__()self.features_extractor = nn.Sequential(# 第一层卷积nn.Conv2d(in_channels=3, out_channels=10, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=10),nn.ReLU(),# 第一层池化nn.MaxPool2d(kernel_size=3,stride=2, padding=1),# 第二层卷积nn.Conv2d(in_channels=10, out_channels=16, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=16),nn.ReLU(),# 第三层卷积nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=32),nn.ReLU())# 概率输出self.cls_out = nn.Conv2d(in_channels=32, out_channels=2, kernel_size=1, stride=1, padding=0)# 回归量输出self.reg_out = nn.Conv2d(in_channels=32, out_channels=4, kernel_size=1, stride=1, padding=0)def forward(self, x):print(x.shape)x = self.features_extractor(x)cls_out = self.cls_out(x)reg_out = self.reg_out(x)return cls_out, reg_out

R-Net

import torch
from torch import nnclass RNet(nn.Module):def __init__(self):super().__init__()self.feature_extractor = nn.Sequential(# 第一层卷积 24 x 24nn.Conv2d(in_channels=3, out_channels=28, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=28),nn.ReLU(),# 第一层池化 11 x 11nn.MaxPool2d(kernel_size=3, stride=2, padding=1, ceil_mode=False),# 第二层卷积 9 x 9nn.Conv2d(in_channels=28, out_channels=48, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=48),nn.ReLU(),# 第二层池化 (没有补零) 4 x 4nn.MaxPool2d(kernel_size=3, stride=2, padding=0, ceil_mode=False),# 第三层卷积 3 x 3nn.Conv2d(in_channels=48, out_channels=64, kernel_size=2, stride=1, padding=0),nn.BatchNorm2d(num_features=64),nn.ReLU(),# 展平nn.Flatten(),# 全连接层 [batch_size, 128]nn.Linear(in_features=3 * 3 * 64, out_features=128))# 概率输出self.cls_out = nn.Linear(in_features=128, out_features=1)# 回归量输出self.reg_out = nn.Linear(in_features=128, out_features=4)def forward(self, x):x = self.feature_extractor(x)cls = self.cls_out(x)reg = self.reg_out(x)return cls, reg   

O-Net

import torch
from torch import nnclass ONet(nn.Module):def __init__(self):super().__init__()self.feature_extractor = nn.Sequential(# 第1层卷积 48 x 48nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=32),nn.ReLU(),# 第1层池化 11 x 11nn.MaxPool2d(kernel_size=3, stride=2, padding=1, ceil_mode=False),# 第2层卷积 9 x 9nn.Conv2d(in_channels=32, out_channels=64, kernel_size=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473338.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32F407ZG的FreeRTOS移植

1.从FreeRTOS官网中下载源码 2、简单分析FreeRTOS源码目录结构 2.1、简单分析FreeRTOS源码根目录 (1)Demo:是官方为一些单片机移植FreeRTOS的例程 (2)License:许可信息 (3)Sourc…

电脑f盘的数据回收站清空了能恢复吗

随着信息技术的飞速发展,电脑已成为我们日常生活和工作中不可或缺的设备。然而,数据的丢失或误删往往会给人们带来极大的困扰。尤其是当F盘的数据在回收站被清空后,许多人会陷入绝望,认为这些数据已无法挽回。但事实真的如此吗&am…

Python 学习中什么是元组,如何使用元组?

什么是元组 元组(Tuple)是Python内置的一种数据结构,用于存储多个数据项。与列表类似,元组也可以存储不同类型的数据,但它们之间存在一个重要区别:元组是不可变的,也就是说,一旦创建…

怀念旧的Windows声音?以下是如何在Windows 11中恢复它们

如果你渴望旧的Windows声音,希望能在Windows 11上再次听到,那你就很幸运了。我们将向你展示如何下载必要的声音包并创建复古的声音方案。 如何获取旧Windows声音的声音包 你需要做的第一件事是下载一个包含旧Windows版本声音的声音包。此外,请确保它包含的每个声音都是WAV…

ctfshow web入门 nodejs

web334 有个文件下载之后改后缀为zip加压就可以得到两个文件 一个文件类似于index.php 还有一个就是登录密码登录成功就有flag username:ctfshow password:123456因为 return name!CTFSHOW && item.username name.toUpperCase() && item.password passwor…

软件运维服务方案(Word原件2024)

软件运维服务方案(Word原件) 1. 服务简述 我们提供全面的软件运维服务,确保软件系统的稳定运行。 1.1 服务内容 包括监控、维护、故障排查与优化。 1.2 服务方式 结合远程与现场服务,灵活响应客户需求。 1.3 服务要求 高效响应&am…

自动驾驶AVM环视算法--相机的联合标定算法实现和exe测试demo

更新:测试的exe程序,无需解压码就可以体验算法测试效果 链接:https://pan.baidu.com/s/1OfuslVNcTXAZWvwiqflWsA 提取码:zoef 1、压缩包解压后显示如下所示 测试文件包括:可执行的exe文件、测试的图片等。 2.双击ex…

C++|哈希应用->布隆过滤器

目录 一、概念 二、模拟实现 三、布隆过滤器扩展应用 上一篇章学习了位图的使用,但它只适用于整数,对于要查询字符串是否在不在,位图并不能解决。所以针对这一问题,布隆过滤器可以派上用场,至于布隆过滤器是什么&am…

8种方案解决移动端1px边框的问题

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 8 种方案解决移动端1px边框的问题 造成边框变粗的原因 css中的1px并不等于移动设备的1px,这是由不同手机由不同像素密度,在window对象中有一个devic…

Nginx-http_auth_basic_module使用

文章目录 前言一、ngx_http_auth_basic_module二、指令1.auth_basic1.auth_basic_user_file 示例生成密码文件配置basic认证浏览器验证 总结 前言 nginx可以通过HTTP Basic Authutication协议进行用户名和密码的认证。 一、ngx_http_auth_basic_module 生效阶段: …

压测工具---Ultron

压测工具:Ultron 类型:接口级和全链路 接口级 对于接口级别的压测我们可以进行 http接口压测、thrift压测、redis压测、kafka压测、DDMQ压测、MySQL压测等,选对对应的业务线、选择好压测执行的时间和轮数就可以执行压测操作了 全链路 对…

SAP PS学习笔记01 - PS概述,创建Project和WBS

本章开始学习PS(Project System)。 1,PS的概述 PS(Project System)是SAP企业资源规划系统中的一个关键模块,主要用于项目管理。 它提供了一个全面的框架来规划、控制和执行项目,涵盖了从项目启…

阿秒光脉冲(阿秒脉冲)持续时间在阿秒量级 科学研究是其目前主要应用方向

阿秒光脉冲(阿秒脉冲)持续时间在阿秒量级 科学研究是其目前主要应用方向 阿秒光脉冲简称阿秒脉冲,由超级短暂的激光脉冲构成,单个脉冲的持续时间仅为百万亿分之一秒(10-18秒)。   根据新思界产业研究中心…

【JavaWeb程序设计】JSP内置对象

目录 一、通过测试以下代码,了解各种隐含对象与作用域变量的使用 1. request隐含对象的使用(request.jsp) 2. out隐含对象的使用(out.jsp) 3. application隐含对象的使用(application.jsp) …

MySQL数据库树状结构查询

一、树状结构 MySQL数据库本身并不直接支持树状结构的存储,但它提供了足够的灵活性,允许我们通过不同的方法来模拟和实现树状数据结构。具体方法看下文。 数据库表结构: 实现效果 查询的结果像树一样 二、使用 以Catalog数据表&#xff0c…

Vite: 近几个版本的更新

概述 在 2021 年 2 月,尤大正式推出了 Vite 2.0 版本,可以说是 Vite 的一个重要转折点,自此之后 Vite 的用户量发生了非常迅速的增长,很快达到了每周 100 万的 npm 下载量。同时,Vite 的社区也越来越活跃,…

HTTP协议格式

目录 正文: 1.概述 2.主要特点 3.请求协议格式 4.响应协议格式 5.响应状态码 总结: 正文: 1.概述 HTTP 协议是用于传输超文本数据(如 HTML)的应用层协议,它建立在传输层协议 TCP/IP 之上。当我们在…

stm32定时器与pwm波

文章目录 4 TIM4.1 SysTick系统定时器4.2 TIM定时器中断与微秒级延时4.3 TIM使用PWM波4.3.1 PWM介绍4.3.2 无源蜂鸣器实现 4.4 TIM ,PWM常用函数 4 TIM 4.1 SysTick系统定时器 ​ Systick系统滴答,(同时他有属于自己的中断,可以利用它来做看…

Unity 使用AVProMovieCapture实现Game视图屏幕录制

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity 使用AVProMovieCapture实现Game视图屏幕录制 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心…

【二】Ubuntu24虚拟机在Mac OS的VMware Fusion下无法联网问题

文章目录 1.环境背景2. 需求背景3. 解决方法3.1 在mac的终端查看虚拟机NAT网络3.2 查看unbuntu节点2的网络配置3.3 问题定位与解决3.3.1 检查是否有冲突3.3.2 冲突解决方法 4. 总结4.1 NAT 网关的原理4.2 VMware Fusion 的 NAT 模式4.3 为什么网关冲突会引起问题4.4 理解配置冲…