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

news2024/11/18 9:09:57

前言

在上一章课程【课程总结】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.coloradmin.cn/o/1900270.html

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

相关文章

WPF UI 3D 多轴 机械臂 stl 模型UI交互

1、三维插件环境调整 2、动态模型材质处理 3、动态模型鼠标交互 4、模型旋转基本思路 5、六轴机械臂节点旋转处理 6、更多HelixToolkit插件处理案例 7、快速对接Blender模型 鼠标交互(没有强调场景的变换) 鼠标命中测试(HitTest 不推荐&…

uni-app x 跨平台开发框架

目录 uni-app x 是什么 和Flutter对比 uts语言 uvue渲染引擎 组合式API的写法 选项式API写法 页面生命周期 API pages.json全局配置文件 总结 uni-app x 是什么 uni-app x,是下一代 uni-app,是一个跨平台应用开发引擎。 uni-app x 是一个庞…

基于STM32与ESP8266的智能电表设计与实现:实时监测,远程管理(附代码实例)

一、项目背景 随着物联网技术的快速发展,传统电表已经无法满足智能电网对用电信息采集、分析和管理的需求。智能电表作为新一代电能计量设备,具有实时监测、远程抄表、用电分析等功能,是实现智能电网的重要基础设施。 本项目旨在设计并实现…

Exploting an API endpoiint using documentation

HTTP request methods https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods 第一步:burp抓包刷新页面 httphistory中只能看到两个记录,可以看下Response,是HTML页面,说明这里有HTML页面 ,但是没有发现特定的API接口。 第二步:用户登录 转到用户登录的功能点处…

kubernetes集群部署:环境准备及master节点部署(二)

主机名IPv4地址IPv6地址角色安装组件操作系统k8s130-node190192.168.XX.190240a:XX::190masterkubeadm、kubelet、containerdAnolis OS 8.94.19.91-28.1.an8.x86_64k8s130-node191192.168.XX.191240a:XX::191nodekubeadm、kubelet、cri-oAnolis OS 8.94.19.91-28.1.an8.x86_64k…

Rust作用域和遮蔽

作用域和遮蔽 变量绑定有一个作用域(scope),它被限定只在一个代码块(block)中生存(live)。 代码块是一个被 {} 包围的语句集合。另外也允许[变量遮蔽][variable-shadow](variable s…

SwiftUI 6.0(iOS 18.0)滚动视图新增的滚动阶段(Scroll Phase)监听功能趣谈

何曾几时,在 SwiftUI 开发中的秃头小码农们迫切需要一种能够读取当前滚动状态的方法。 在过去,他们往往需要借助于 UIKit 的神秘力量。不过这一切在 SwiftUI 6.0 中已成“沧海桑田”。 在本篇博文中,您将学到如下内容: 1. Scroll…

Python入门 2024/7/6

目录 数据容器入门 列表的定义语法 基本语法 嵌套列表 ​编辑 列表的下表索引 ​编辑 列表的常用操作 列表的常见方法 查找元素的下标 修改下标索引的值 插入元素 追加元素 追加一批元素 删除元素 删除某元素在列表中的第一个匹配项 清空列表内容 统计元素在…

【Unity URP】通过代码动态添加URP渲染通道RendererFeature

URP的渲染通道RendererFeature可以很方便的实现一些渲染问题,比如渲染顺序问题,遮挡后的材质替换等等。 那么我们如何通过代码来动态添加和修改呢? 首先我们需要获取到当前的URP配置文件,在对配置文件进行添加 1.通过反射获取当前UniversalRendererData 我们通过Graphic…

Day05-03-Nexus仓库

Day05-03-Nexus仓库 05-nexus-仓库1. 概述2. 极速部署指南2.1 下载2.2 部署2.3 配置2.4 连接使用nexus2.4 编译与测试 3. 总结 05-nexus-仓库 1. 概述 背景: maven编译的时候,npm/cnpm编译,需要下载大量的依赖包。这些依赖包在每一次构建的时候都需要使…

解决Docker Desktop启动异常 Docker Desktop- WSL distro terminated abruptly

异常 当打开Docker Desktop时候,启动docker引擎时,提示 加粗样式文本信息 Docker Desktop - WSL distro terminated abruptly A WSL distro Docker Desktop relies on has exited unexpectedly. This usually happensas a result of an external entit…

.net 调用海康SDK的跨平台解决方案

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 上2篇海康SDK使用以及常见的坑…

C++11 shared_ptr---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权,当最后⼀个指涉到该对象的shared_ptr不再指向他时,shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个?《引⽤计数》 shared_ptr构造函数,使引⽤计数析构函数&…

【docker nvidia/cuda】ubuntu20.04安装docker踩坑记录

docker nvidia 1.遇到这个错误,直接上魔法(科学上网) OpenSSL SSL_connect: Could not connect to nvidia.github.io:443 这个error是运行 NVIDIA官方docker安装教程 第一个 curl 命令是遇到的 2. apt-get 更新 sudo apt update遇到 error https://download.do…

横截面交易策略:概念与示例

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

考CFA ESG踩过的坑,想考CFA ESG的同学,可以收藏

考CFA ESG踩过的坑 考证也是蹭热点, 2020年,那时是云,阿里云,腾讯云,华为云竞相绽放, 再过点时间,好像安全方面的证书,如油炸爆米花一样,噼里啪啦地蹦了出来&#xff0…

matlab 抛物线图像绘制

抛物线图像绘制 x^2y4绘制结果 x^2y4 clc,clear,close all; length10; % 创建一个范围内的 x 和 y 值 x linspace(-length, length, 1000); y linspace(-length, length, 1000);% 创建一个网格来表示 x 和 y 值的组合 [X, Y] meshgrid(x, y);% 计算方程的左边和右边的值 LH…

AIGC | 在机器学习工作站安装NVIDIA CUDA® 并行计算平台和编程模型

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x02.初识与安装 CUDA 并行计算平台和编程模型 什么是 CUDA? CUDA(Compute Unified Device Architecture)是英伟达(NVIDIA)推出的并行计算平台和编…

Docker 部署 Nacos v2.3.2 版本

文章目录 Github官网文档Nacos 生态图Nacos Dockerdocker-compose.ymlapplication.propertiesNacos 官方示例 Github https://github.com/alibaba/nacos 官网 https://nacos.io/ 文档 https://nacos.io/docs/latest/what-is-nacos/ Nacos 生态图 Nacos Docker 镜像&…

基于java+springboot+vue实现的图书商城管理系统(文末源码+Lw)283

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信…