【课程总结】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.mzph.cn/web/42629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用jdk11运行javafx程序和jdk11打包jre包含javafx模块

我们都知道jdk11是移除了javafx的,如果需要使用javafx,需要单独下载。 这就导致我们使用javafx开发的桌面程序使用jdk11时提示缺少javafx依赖。但这是可以通过下面的方法解决。 一,使用jdk11运行javafx程序 我们可以通过设置vmOptions来使用jdk11运行javafx程序 1,添加j…

【RAG KG】GraphRAG开源:查询聚焦摘要的图RAG方法

前言 传统的 RAG 方法在处理针对整个文本语料库的全局性问题时存在不足,例如查询:“数据中的前 5 个主题是什么?” 对于此类问题,是因为这类问题本质上是查询聚焦的摘要(Query-Focused Summarization, QFS&#xff09…

嵌入式单片机,两者有什么关联又有什么区别?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!使用单片机是嵌入式系统的…

CurrentHashMap巧妙利用位运算获取数组指定下标元素

先来了解一下数组对象在堆中的存储形式【数组长度,数组元素类型信息等】 【存放元素对象的空间】 Ma 基础信息实例数据内存填充Mark Word,ClassPointer,数组长度第一个元素第二个元素固定的填充内容 所以我们想要获取某个下标的元素首先要获取这个元素的起始位置…

Sorted Set 类型命令(命令语法、操作演示、命令返回值、时间复杂度、注意事项)

Sorted Set 类型 文章目录 Sorted Set 类型zadd 命令zrange 命令zcard 命令zcount 命令zrevrange 命令zrangebyscore 命令zpopmax 命令bzpopmax 命令zpopmin 命令bzpopmin 命令zrank 命令zscore 命令zrem 命令zremrangebyrank 命令zremrangebyscore 命令zincrby 命令zinterstor…

线程池案例

秒杀 需求 10个礼物20个客户抢随机10个客户获取礼物&#xff0c;另外10无法获取礼物 任务类 记得给共享资源加锁 public class MyTask implements Runnable{// 礼物列表private ArrayList<String> gifts ;// 用户名private String username;public MyTask( String user…

android Dialog全屏沉浸式状态栏实现

在Android中&#xff0c;创建沉浸式状态栏通常意味着让状态栏背景与应用的主题颜色一致&#xff0c;并且让对话框在状态栏下面显示&#xff0c;而不是浮动。为了实现这一点&#xff0c;你可以使用以下代码片段&#xff1a; 1、实际效果图&#xff1a; 2、代码实现&#xff1a;…

揭秘GPT-4o:未来智能的曙光

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;的发展突飞猛进&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;领域的进步&#xff0c;更是引人注目。在这一背景下&#xff0c;OpenAI发布的GPT系列模型成为了焦点。本文将详细探讨最新的模型GPT-4o&a…

Unity海面效果——6、反射和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿赵。 上一篇的结束时&#xff0c;海面效果已经做成这样了&#xff1a; 这个Shader的复杂程度已经比较高了&#xff1a; 不过还有一些美中不足的地方。 1、 海平面没有反射到天空球 2、 在近岸边看得到水底的部分&#xff0c;水…

一些关于C++的基础知识

引言&#xff1a;C兼容C的大部分内容&#xff0c;但其中仍有许多小细节的东西需要大家注意 一.C的第一个程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看这个是否感觉一头雾水…

数据挖掘——matplotlib

matplotlib概述 Mat指的是Matlab&#xff0c;plot指的是画图&#xff0c;lib即library&#xff0c;顾名思义&#xff0c;matplotlib是python专门用于开发2D图表的第三方库&#xff0c;使用之前需要下载该库&#xff0c;使用pip命令即可下载。 pip install matplotlib1、matpl…

elasticsearch SQL:在Elasticsearch中启用和使用SQL功能

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

服务注册Eureka

目录 一、背景 1、概念 2、CAP 理论 3、常见的注册中心 二、Eureka 三、搭建 Eureka Server 1、搭建注册中心 四、服务注册 五、服务发现 六、Eureka 和 Zooper 的区别 一、背景 1、概念 远程调用就类似于一种通信 例如&#xff1a;当游客与景区之间进行通信&…

Xubuntu24.04之设置高性能模式两种方式(二百六十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

苍穹外卖--新增员工

代码开发 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.entity.Employee; import com.sky.properties.JwtProperties; import com.sky.result.Result…

Springboot各个版本维护时间

Springboot各个版本维护时间

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备…

jmeter持续学习之----性能初级一些概念和指标

服务端为什么要进行性能测试 大量用户下&#xff0c;系统能否稳定运行&#xff08;比较多&#xff09; 用于硬件服务器的选型 用于软件技术的选型 性能测试关注的点 用户角度:响应时间 资源占用:并发用户数,TPS,资源占用(cpu,内存,JVM) 性能测试策略 基准测试:单用户测试,对…

去了字节跳动,才知道年薪40W的测试有这么多?

最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的测试都这么有钱了吗&#xff1f; 前几天还有朋友说&#xff0c;从腾讯跳槽去了字节&…

8.8.8.8 IP地址的作用

在跟着韦东山老师的学习手册中看见了关于8.8.8.8 IP用于检测网络状态&#xff0c;然后搜索了关于此IP的相关作用如下&#xff1a; 公共DNS服务&#xff1a;8.8.8.8是Google提供的两个公共DNS服务器地址之一&#xff08;另一个是8.8.4.4&#xff09;。DNS&#xff08;域名系统&a…