【课程总结】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 nn

class RNet(nn.Module):
    def __init__(self):
        super().__init__()
        
        self.feature_extractor = nn.Sequential(
            # 第一层卷积 24 x 24
            nn.Conv2d(in_channels=3, out_channels=28, kernel_size=3, stride=1, padding=0),
            nn.BatchNorm2d(num_features=28),
            nn.ReLU(),

            # 第一层池化 11 x 11
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1, ceil_mode=False),
            
            # 第二层卷积 9 x 9
            nn.Conv2d(in_channels=28, out_channels=48, kernel_size=3, stride=1, padding=0),
            nn.BatchNorm2d(num_features=48),
            nn.ReLU(),

            # 第二层池化 (没有补零) 4 x 4
            nn.MaxPool2d(kernel_size=3, stride=2, padding=0, ceil_mode=False),
            
            # 第三层卷积 3 x 3
            nn.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 nn


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 11文件资源管理器选项卡的4个高级用法,肯定有你喜欢的

作为一个每天使用文件资源管理器来管理我的工作流程的人,选项卡帮助我为处于不同完成阶段的工作创建了不同的文件夹。以下是我使用选项卡提高工作效率的最佳技巧。 打开和关闭选项卡 假设你的计算机上安装了Windows 11的最新更新,请按Ctrl+E打开文件资源管理器。在我发现“…

STM32智能家居掌上屏实战:从WiFi连接到MQTT通信,打造你的家庭物联网网关

摘要: 本文深入探讨一种基于STM32的智能家居掌上屏设计方案,详细阐述其硬件架构、软件设计以及通信协议等关键技术细节。该方案利用WiFi构建局域网,实现与各类传感器、执行器的便捷交互,并通过TFT彩屏提供直观的控制和数据展示,旨…

五、保存数据到Excel、sqlite(爬虫及数据可视化)

五、保存数据到Excel、sqlite(爬虫及数据可视化) 1,保存数据到excel1.1 保存九九乘法表到excel(1)代码testXwlt.py(2)excel保存结果 1.2 爬取电影详情并保存到excel(1)代…

大模型周报|15 篇必读的大模型论文

大家好,今日必读的大模型论文来啦! 1.谷歌推出风格感知拖放新方法 Magic Insert 来自谷歌的研究团队提出了 Magic Insert,用于以物理上可信的方式将用户提供的图像中的对象拖放到不同风格的目标图像中,同时与目标图像的风格相匹…

基于CLIP特征的多模态大模型中的视觉短板问题

【论文极速读】 基于CLIP特征的多模态大模型中的视觉短板问题 FesianXu 20240706 at Tencent WeChat search team 前言 今天读到篇CVPR 24’的论文 [1],讨论了常见的多模态大模型(大多都基于CLIP语义特征,以下简称为MLLM)中的视觉…

Git错误分析

错误案例1: 原因:TortoiseGit多次安装导致,会记录首次安装路径,若安装路径改变,需要配置最后安装的路径。

HTML5使用<details>标签:展开/收缩信息

details 标签提供了一种替代 JavaScript 的方法,它主要是提供了一个展开/收缩区域。details 标签中可以使用 summary 标签从属于 details 标签,单击 summary 标签中的内容文字时,details 标签中的其他所有从属元素将会展开或收缩。语法如下&a…

Redies基础篇(一)

Redis 是一个高性能的key-value数据库。Redies支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的&#xff…

小白必看!推荐三本高质量python书籍,让你直接原地起飞

Python是一种多功能语言。它经常用作Web应用程序的脚本语言,嵌入到软件产品中,以及人工智能和系统任务管理。它既简单又强大,非常适合初学者和专业程序员。 python的自学书籍非常多,涉及基础入门、web开发、机器学习、数据分析、…

印度第二大移动提供商 3.75 亿数据待售

一个名为“xenZen”的威胁行为者已在 BreachForums 上出售 Airtel 的数据库。 该列表包含来自 3.75 亿客户的数据。 数据详情: 手机号码 名 出生日期 父亲的名字 地址 电子邮件ID 类型 国籍 阿达尔 带照片的身份证明详细信息 地址详细信息证明等 鉴于…

003-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法,所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇,将介绍基础的线性回归方法,包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归(Regression&…

3-3 超参数

3-3 超参数 什么是超参数 超参数也是一种参数,它具有参数的特性,比如未知,也就是它不是一个已知常量。是一种手工可配置的设置,需要为它根据已有或现有的经验,指定“正确”的值,也就是人为为它设定一个值&…

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

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

AttackGen:一款基于LLM的网络安全事件响应测试工具

关于AttackGen AttackGen是一款功能强大的网络安全事件响应测试工具,该工具利用了大语言模型和MITRE ATT&CK框架的强大功能,并且能够根据研究人员选择的威胁行为组织以及自己组织的详细信息生成定制化的事件响应场景。 功能介绍 1、根据所选的威胁行…

03:Spring MVC

文章目录 一:Spring MVC简介1:说说自己对于Spring MVC的了解?1.1:流程说明: 一:Spring MVC简介 Spring MVC就是一个MVC框架,Spring MVC annotation式的开发比Struts2方便,可以直接代…

【TB作品】脉搏测量,ATMEGA8单片机,Proteus仿真,ATmega8控制脉搏测量与显示系统

硬件组成: LCD1602脉搏测量电路(带灯)蜂鸣器报警按键设置AT24C02 功能: (1)LCD1602主页显示脉搏、报警上限、报警下限; (2)五个按键:按键1:切换设…

数据库测试|Elasticsearch和ClickHouse的对决

前言 数据库作为产品架构的重要组成部分,一直是技术人员做产品选型的考虑因素之一。 ClkLog会经常遇到小伙伴问支持兼容哪几种数据库?为什么是选择ClickHouse而不是这个或那个。 由于目前市场上主流的数据库有许多,这次我们选择其中一个比较典…

(软件06)串口屏的应用,让你的产品显得高级一点(下篇)

本文目录 学习前言 单片机代码实现 学习前言 目前市面上我记得好像有IIC的屏幕、SPI的屏幕、并口屏幕、还有就是今天我们介绍的这个串口屏了,串口屏,就是用串口进行通讯的,上篇我们已经介绍了屏幕供应商提供的上位机软件进行配置好了&#…

2000-2019年各省市资源错配指数

资源错配指数(Misallocation Index)是衡量一个地区或国家资源配置效率的重要经济指标。以下是对资源错配指数相关数据的介绍: 数据简介 定义:资源错配指数是一个反映生产要素配置合理性的指标,高指数意味着资源配置效…

Science期刊政策反转:允许生成式AI用于论文写作,意味着什么?

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 关于各大top期刊和出版社对于生成式AI用于论文写作中的规定,娜姐之前写过一篇文章: 如何合理使用AI写论文?来看Top 100学术期刊和出版社的…