深度学习实战人脸识别

news2024/12/26 23:49:11

在这里插入图片描述

文章目录

  • 前言
  • 一、人脸识别一般过程
  • 二、人脸检测主流算法
    • 1. MTCNN
    • 2. RetinaFace
    • 3. CenterFace
    • 4. BlazeFace
    • 5. YOLO
    • 6. SSD
    • 7. CascadeCNN
  • 三、人脸识别主流算法
    • 1.deepface
    • 2.FaceNet
    • 3.ArcFace
    • 4.VGGFace
    • 5.DeepID
  • 四、人脸识别系统实现
    • 0.安装教程与资源说明
    • 1. 界面采用PyQt5框架
    • 2.人脸定位
    • 3. 人脸注册
    • 4.人脸删除
    • 5.单人脸匹配识别
    • 6.多人脸匹配识别
    • 7.未注册人脸匹配识别
    • 8.代码实现
  • 五、总结
  • 结束语


深度学习实战人脸检测与识别

前言

人脸识别技术的研究意义是多方面的,它涉及到社会生活的各个领域,并为社会发展和人民生活带来便利和安全。以下是人脸识别研究的几个主要意义:

  1. 安全领域:人脸识别技术可以应用于门禁系统、监控系统等,实现人员身份的快速识别和记录,提高安全性。

  2. 社会管理:在公安、边检、人口普查等社会管理领域,人脸识别技术可以进行人员身份的准确核验,确保社会管理工作的效率和准确性。

  3. 商业领域:在金融、零售、旅游等行业,人脸识别技术可以实现快速的身份识别和安全支付,提高用户体验。

  4. 医疗领域:在医院门诊、护理等医疗领域,人脸识别技术可以快速识别患者身份,提高医疗服务的质量和效率。

  5. 技术创新:人脸识别技术的发展推动了计算机视觉和人工智能领域的技术进步,尤其是在深度学习的应用上,人脸识别技术取得了显著的成就。

  6. 跨领域应用:人脸识别技术与其他技术领域如物联网、移动计算等的融合,创造出新的应用场景和业务模式。

综上所述,人脸识别技术的研究意义不仅在于技术层面的创新,也包括对社会、法律和伦理方面问题的深入思考,以实现技术的健康发展和应用。


一、人脸识别一般过程

人脸识别的一般过程可以分为以下几个步骤:

  1. 人脸检测

    • 图像采集:首先需要获取图像数据,这可以是静态图像或视频流。
    • 人脸定位:在图像中定位人脸的位置,这通常通过人脸检测算法实现,如Haar特征、HOG+SVM、MTCNN等。
  2. 预处理

    • 图像预处理:包括灰度化、直方图均衡化、噪声去除等,以提高后续处理的准确性。
    • 人脸对齐:将检测到的人脸调整到标准位置和大小,通常涉及到旋转、缩放和裁剪等操作。
  3. 特征提取

    • 特征表示:从预处理后的人脸图像中提取特征,这些特征可以是几何特征、纹理特征或基于深度学习的特征。
    • 特征选择:选择最有代表性的特征用于识别,以减少计算量并提高识别率。
  4. 特征匹配

    • 特征编码:将提取的特征转换为一种可以比较的形式,如特征向量。
    • 相似度计算:计算待识别人脸的特征向量与数据库中已知人脸的特征向量的相似度。
  5. 分类决策

    • 分类器训练:使用已知的人脸数据训练分类器,如支持向量机(SVM)、神经网络、决策树等。
    • 分类预测:将待识别人脸的特征向量输入分类器,得到识别结果。
  6. 结果输出

    • 输出识别结果:将识别结果输出给用户,可以是人脸的身份信息、相似度分数等。
    • 反馈学习:根据识别结果的准确性,对模型进行调整和优化。
  7. 活体检测

    • 防止欺骗:为了提高安全性,人脸识别系统通常会加入活体检测步骤,以区分真实人脸和照片、视频等伪造人脸。

二、人脸检测主流算法

1. MTCNN

MTCNN (Multi-task Cascaded Convolutional Networks)是由中国科学院提出的一种多任务级联卷积神经网络,它可以同时进行人脸检测、关键点定位和姿态估计等任务,具有精度高、速度快、能够处理多个尺度的人脸等优点。


具体说明与代码实现可参考博主写的教程MTCNN人脸检测算法实现(python)

2. RetinaFace

RetinaFace 是由中国香港城市大学提出的一种准确率更高的人脸检测与关键点定位算法,其使用了可变形卷积网络(Deformable Convolutional Network)来实现更加准确的定位,RetinaFace 特别适用于小尺度人脸的定位。

3. CenterFace

CenterFace 是由华为提出的一种轻量级人脸检测与关键点定位算法,该算法只需要 1.5MB 的模型大小,可以在移动端实时运行,CenterFace 采用了 Hourglass 模型和特征金字塔网络(Feature Pyramid Network)来实现高精度的人脸定位。

4. BlazeFace

BlazeFace 是由 Google 提出的一种极其轻量级的人脸检测算法,它的模型大小只有 2MB 左右,可以在移动端实时运行,BlazeFace 采用了创新的 anchor-free 检测方式,可以实现更快速度的人脸定位。

5. YOLO

YOLO 是一种端到端的实时目标检测算法,可以同时对多个目标进行检测和定位。由于 YOLO 可以将整张图像划分为网格,并在每个网格上预测目标的类别和边界框,因此它通常比其他基于区域的目标检测算法更快。

6. SSD

SSD 是一种基于卷积神经网络的单步目标检测算法,可以在一次前向传播中完成对多个目标的检测,相对于 Faster R-CNN 等基于区域的检测算法,SSD 更加简单与高效。

7. CascadeCNN

CascadeCNN 是由微软亚洲研究院提出的级联卷积神经网络,能够在不牺牲性能的情况下大幅减小网络规模和计算量。CascadeCNN 的结构是由多个级联阶段组成,每个阶段包含多个级联卷积层和池化层,可以有效地提高人脸定位的精确度和稳定性。

三、人脸识别主流算法

深度学习在人脸识别领域的主流算法主要包括以下几种:

1.deepface

DeepFace:由Facebook开发,使用深度神经网络来识别人脸,达到了接近人类水平的识别准确率。

2.FaceNet

FaceNet:由Google开发,使用三元组损失函数(triplet loss)将人脸映射到欧几里得空间中,使得相似的人脸在空间中的距离更近。

3.ArcFace

ArcFace:在之前模型的基础上引入了角度边际损失(angular margin loss),使得学习到的特征更具区分性。

4.VGGFace

VGGFace:这是一个深度网络,使用大型数据集进行训练,以提供高精度的人脸识别任务。

5.DeepID

DeepID系列:一系列深度学习模型,用于人脸识别任务,以逐步提高识别性能而闻名。

这些算法在设计、训练/测试数据集、应用场景以及评估协议等方面都取得了显著的进展,并且它们在处理RGB-D、视频和异构人脸数据方面也表现出色。这些主流算法的发展,极大地推动了人脸识别技术的进步,并在多个方面重塑了人脸识别的研究格局。

四、人脸识别系统实现

0.安装教程与资源说明

离线安装配置文件说明
在这里插入图片描述
在这里插入图片描述

1. 界面采用PyQt5框架

在这里插入图片描述

2.人脸定位

在这里插入图片描述

3. 人脸注册

在这里插入图片描述

4.人脸删除

在这里插入图片描述

5.单人脸匹配识别

在这里插入图片描述

6.多人脸匹配识别

在这里插入图片描述

7.未注册人脸匹配识别

在这里插入图片描述

8.代码实现

class QThreadFaceModel(QThread):
    cnn_predict_finish_sig = pyqtSignal(object)
    face_recog_record_insert_sig = pyqtSignal(list)
    face_recog_warning_sig = pyqtSignal(str)

    def __init__(self):
        super(QThreadFaceModel, self).__init__()
        self.run_flag = False
        self.mode = 0
        self.last_pid_list = []

        self.cap = cv2.VideoCapture(0)
    def __del__(self):
        print('__del__')
        self.cap.release()

    def set_run_flag(self, flag):
        self.run_flag = flag
    def set_face_model(self, model):
        self.face_model = model

    def set_model(self, mode):
        self.mode = mode

    def set_face_features(self, face_features):
        self.face_features = face_features

    def set_face_names(self, face_name_dict):
        self.face_name_dict = face_name_dict

    def query_face_id(self, query_feature, sim_thresh=0.65):
        id ='unknown'
        for key in self.face_features:
            face_sim = self.face_model.CalculateSimilarity(query_feature, self.face_features[key])
            # print(face_sim)
            if face_sim >= sim_thresh:
                id = key
                break
        return id

    def run(self):
        """
            线程启动后执行的函数入口,
            采用run_flag控制流程的运行状态
        """
        while True:
            if self.run_flag:
                ok, frame = self.cap.read()  # 读取一帧数据
                # print(frame.shape)
                if not ok:
                    self.cap = cv2.VideoCapture(0)
                    continue
                try:
                    detect_result = self.face_model.Detect(frame)
                    # print(detect_result)
                    for i in range(detect_result.size):
                        face = detect_result.data[i].pos
                        if self.mode == 1:

                            face_points = self.face_model.mark5(frame, face)
                            face_crop_image = self.face_model.CropFace(frame, face_points)
                            face_crop_image_feature = self.face_model.ExtractCroppedFace(face_crop_image)
                            face_id = self.query_face_id(face_crop_image_feature)

                            if face_id == 'unknown':
                                cv2.rectangle(frame, (face.x, face.y), (face.x + face.width, face.y + face.height),
                                              (0, 0, 255), 2)
                                frame = cv2ImgAddText(frame, self.face_name_dict[face_id], face.x - 30, face.y -30,
                                                      textColor=(255, 0, 0), textSize=30)
                            else:
                                cv2.rectangle(frame, (face.x, face.y), (face.x + face.width, face.y + face.height),
                                              (255, 0, 0), 2)
                                frame = cv2ImgAddText(frame, self.face_name_dict[face_id], face.x - 30, face.y - 30,
                                                      textColor=(0, 255, 0), textSize=30)


                        elif self.mode == 0:
                            cv2.rectangle(frame, (face.x, face.y), (face.x + face.width, face.y + face.height),
                                          (255, 0, 0), 2)
                            # cv2.putText(frame, f"pid:{PID}", (face.x, face.y), 0, 1, (0, 255, 0))

                    self.cnn_predict_finish_sig.emit(frame)
                except Exception as e:
                    self.cap = cv2.VideoCapture(0)
                    print(e)


五、总结

深度学习人脸定位算法已经取得了非常显著的进展,已经被广泛应用于人脸识别、人脸表情分析、虚拟换脸等应用场景中,这些算法在不断地优化和改进中,未来还有很大的发展空间。

结束语

由于博主能力有限,本篇文章中提及的方法,也难免会有疏漏之处,希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。

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

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

相关文章

51c自动驾驶~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12121357 #大语言模型会成为自动驾驶的灵丹妙药吗 人工智能(AI)在自动驾驶(AD)研究中起着至关重要的作用,推动其向智能化和高效化发展。目前AD技术的发展主要遵循…

2023年3月GESPC++一级真题解析

一、单选题(每题2分,共30分) 题目123456789101112131415答案BAACBDDAADBCDBC 1.以下不属于计算机输入设备的有( )。 A .键盘 B .音箱 C .鼠标 D .传感器 【答案】 …

深度学习实验十二 卷积神经网络(3)——基于残差网络实现手写体数字识别实验

目录 一、模型构建 1.1残差单元 1.2 残差网络的整体结构 二、统计模型的参数量和计算量 三、数据预处理 四、没有残差连接的ResNet18 五、带残差连接的ResNet18 附:完整的可运行代码 实验大体步骤: 先前说明: 上次LeNet实验用到的那…

第10章JavaScript的应用

10.1 JavaScript概述 10.1.1 JavaScript简介 10.1.1.1 简单性 10.1.1.2 动态性 10.1.1.3 跨平台性 10.1.1.4 安全性 10.1.1.5 基于对象的语言 10.1.2 JavaScript入门案例 10.1.3 JavaScript放置的位置 10.1.3.1 head标记中的脚本 代码 <!DOCTYPE html> <ht…

Linux操作系统:进程控制_进程的创建、终止、等待

一、进程创建 这一块我们在前篇都已经讲过&#xff0c;第一部分就简单带大家回顾一下之前的知识。 1.1 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include<unistd.h>…

MySQL数据库学习(持续更新ing)

1. 什么是数据库&#xff1f;什么是数据库管理系统&#xff1f;什么是SQL&#xff1f;他们之间的关系是什么&#xff1f; 数据库&#xff1a;Database&#xff0c; 简称DB。按照一定格式存储数据&#xff0c;一些文件的组合。 数据库管理系统&#xff1a;DataBaseManagement&…

电脑自动关机时间如何定?Wise Auto Shutdown 设置关机教程

在日常使用电脑的过程中&#xff0c;有时我们需要让电脑在特定的时间自动关机&#xff0c;比如在下载大文件完成后、执行长时间的任务结束时&#xff0c;或者只是单纯想在某个预定时间让电脑自动关闭以节省能源。这时候&#xff0c;Wise Auto Shutdown 这款软件就能派上大用场了…

【LeetCode热题100】队列+宽搜

这篇博客是关于队列宽搜的几道题&#xff0c;主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …

【数据结构】二叉树(2)

目录 1. 二叉树的遍历 前序遍历 中序遍历 后序遍历 2. 计算二叉树中的节点个数 3. 计算二叉树中叶子节点个数 4. 计算二叉树的深度 5. 计算二叉树第k层节点个数 6. 二叉树基础练习 7. 二叉树的创建 8. 二叉树的销毁 9. 层序遍历 10. 判断二叉树是否为完全二叉树 1…

mysql | limit X, -1 早已不可使用,本身也是一个错误

一、背景 需求&#xff1a;使用 mysql 时&#xff0c;需要获取第 X 条数据之后的所有数据。 这时&#xff0c;首先想到的就是利用 limit 来实现。 早期的部分文章或者资料中&#xff0c;提到可以使用&#xff1a; limit X,-1 例如&#xff0c;获取第一条后的所有数据&…

C++:探索AVL树旋转的奥秘

文章目录 前言 AVL树为什么要旋转&#xff1f;一、插入一个值的大概过程1. 插入一个值的大致过程2. 平衡因子更新原则3. 旋转处理的目的 二、左单旋1. 左单旋旋转方式总处理图2. 左单旋具体会遇到的情况3. 左单旋代码总结 三、右单旋1. 右单旋旋转方式总处理图2. 右单旋具体会遇…

开发一套ERP 第二弹

前后端分离 一起做,发现会有点问题,有时候分不太清楚 可以使用 naive ui admin 作为前端 menu 的配置在mock 中,在mock 中修改为自己需要的选项即可,mock 中返回的是前端需要测试的数据接口 同理自己需要的API也可以定义到 api 中&#xff0c;然后在mock 中配置返回的结果;然后…

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版&#xff0c;不用申请。目前版本&#xff1a;0.53.13 &#xff0c;选择不同平台压缩包下载解压到任意位置即可 补充下载&#xff0c;vscode插件解压后&#xff0c;在vscode扩展中选择从vsix安装&#xff0c;安装后新增名为…

ES6 、ESNext 规范、编译工具babel

ES6 、ESNext 规范、编译工具简介 ES6ES&#xff08;ECMAScript&#xff09; vs JS常量进一步探讨 obj对象的扩展面试&#xff1a;使对象属性也不能更改——Object.freeze(obj) 解构deconstruction变量的解构赋值&#xff1a;数组解构赋值&#xff1a;对象解构赋值&#xff1a;…

SQL 语句执行计划中的连接方式

SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类&#xff1a;外连接&#xff08;细分为&#xff1a;左连接&#xff08;Left outer join/ left join&#xff09;、右连接&#xff08;right outer join/ right join&#xff09;、全连接&#xff08;full outer …

数据结构第一讲

数据结构定义 算法的定义 什么是好算法&#xff1f; 空间复杂度 时间复杂度 例子1 打印1到N之间的正整数 有递归和循环两种方法实现。 但是在数字变大后&#xff0c;递归的方法会导致内存占用过多而崩溃。 而循环则不会 例子2 写程序给定多项式在X处的值 从里往外算的算…

--- 文件IO java ---

文本文件和二进制文件 文件再底层其实就是以一段二进制数据的形式储存的&#xff0c;当我用记事本打开文件时&#xff0c;有些文件会出现乱码&#xff0c;这就是二进制文件&#xff0c;而有一些文件是特殊的&#xff0c;他以特定的编码方式&#xff08;比如ascll&#xff09;可…

洛谷 P1616 疯狂的采药 C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/P1616?contestId215526 完全背包问题&#xff0c;最后一个超出空间了。完全背包和就是无限次的拿&#xff0c;公式跟01背包差不多。 但是&#xff0c;只有当前能拿和拿不下&#xff0c;换下一个。注意要处理好边界条件。…

java基础概念37:正则表达式2-爬虫

一、定义 【回顾】正则表达式的作用 作用一&#xff1a;校验字符串是否满足规则作用二&#xff1a;在一段文本中查找满足要求的内容——爬虫 二、本地爬虫VS网络爬虫 2-1、本地爬虫 示例&#xff1a; 代码优化&#xff1a; public static void main(String[] args) {// 大…

多目标跟踪算法

文章目录 一、传统方法1. 基于卡尔曼滤波器的方法1.1 Kalman Filter(卡尔曼滤波器) 2. 基于数据关联的方法2.1 匈牙利算法 二、深度学习方法1. 基于检测的多目标跟踪1.1 SORT算法1.2 DeepSort1.3 BoT-SORT 2. 基于特征关联和增强的方法2.1 ByteTrack 3. 基于Transformer的方法3…