当前位置: 首页 > news >正文

基于CNN的人脸识别考勤管理系统实现

        随着技术的不断进步,人脸识别技术已经在各行各业得到了广泛的应用,尤其在 考勤管理 上,它提供了更加智能、便捷、精准的解决方案。本篇博客将介绍如何基于 PyQt5MySQL 实现一个 人脸识别考勤系统,并通过具体代码展示如何通过图形界面管理人员考勤数据,结合人脸识别模块,使得考勤系统更加高效和自动化。

完整代码:利用CNN实现人脸识别考勤系统

项目背景

        本项目的目标是构建一个基于 人脸识别技术 的考勤系统,其中使用 PyQt5 创建图形用户界面(GUI),MySQL 作为数据存储,利用 人脸识别 实现人员身份验证,并根据验证结果进行考勤记录。系统功能主要包括:

  1. 人员信息管理:可以添加、删除、修改员工信息。
  2. 考勤记录管理:员工考勤数据的自动记录与查询。
  3. 人脸识别验证:通过摄像头对员工进行人脸识别,自动打卡。

技术栈

  • PyQt5:构建桌面应用的界面,负责用户与系统的交互。
  • MySQL:存储员工信息和考勤数据。
  • 人脸识别库(如 OpenCV 和 face_recognition):用于识别人脸并进行考勤打卡。
  • Python:处理系统逻辑,控制整个应用的运行。

核心功能

  1. 用户管理功能(增、删、改、查)
  2. 考勤记录功能(自动打卡与查询)
  3. 人脸识别功能(打卡验证)


1. 数据库管理:连接与操作

        首先,我们需要一个数据库管理类 DatabaseManager 来封装与 MySQL 数据库的交互。我们存储员工信息(如姓名、员工ID、人脸数据)以及考勤记录(考勤时间和员工ID)。

关键代码:数据库管理
class DatabaseManager:def __init__(self, host='localhost', database='face_attendance', user='root', password='rootyang'):"""初始化数据库连接"""try:self.conn = mysql.connector.connect(host=host, database=database, user=user, password=password)if self.conn.is_connected():print("Database connection successful")except Error as e:QMessageBox.critical(None, "数据库连接", f"连接MySQL数据库时发生错误: {e}")def fetch_data(self, keyword=''):"""从数据库获取数据,支持关键词搜索"""if self.conn and self.conn.is_connected():cursor = self.conn.cursor()query = "SELECT id, name, employee_id, gender FROM people WHERE name LIKE %s OR employee_id LIKE %s"cursor.execute(query, ('%' + keyword + '%', '%' + keyword + '%'))results = cursor.fetchall()cursor.close()return resultsreturn []def insert_person(self, name, employee_id, gender, face_encoding):"""向数据库中添加一个新用户"""try:cursor = self.conn.cursor()query = "INSERT INTO people (name, employee_id, gender, face_encoding) VALUES (%s, %s, %s, %s)"cursor.execute(query, (name, employee_id, gender, face_encoding))self.conn.commit()cursor.close()except mysql.connector.IntegrityError as e:raise e  # 将异常向上抛出,由调用者处理def update_person(self, id, name, employee_id, gender, face_encoding):"""更新数据库中的一个用户的信息"""if self.conn and self.conn.is_connected():cursor = self.conn.cursor()query = "UPDATE people SET name=%s, employee_id=%s, gender=%s, face_encoding=%s WHERE id=%s"cursor.execute(query, (name, employee_id, gender, face_encoding, id))self.conn.commit()cursor.close()
解释
  • face_encoding:我们将人脸数据(如人脸特征向量)存储在数据库中,供后续的识别验证使用。
  • insert_person:将员工信息与人脸特征数据插入到数据库中。
  • update_person:更新员工信息,特别是员工的人脸数据(当员工更新照片时)。

2. 人脸识别与考勤打卡

        为了实现人脸识别功能,我们使用 OpenCVface_recognition 库。通过摄像头捕捉员工的面部图像,与数据库中存储的人脸特征进行匹配,从而进行考勤打卡。

关键代码:人脸识别与考勤打卡
import face_recognition
import cv2
import numpy as np
from datetime import datetimeclass AttendanceSystem:def __init__(self, db_manager):self.db_manager = db_managerself.known_faces = []  # 存储所有已知员工的人脸特征self.known_face_names = []  # 存储员工姓名self.load_known_faces()def load_known_faces(self):"""加载数据库中所有员工的人脸数据"""data = self.db_manager.fetch_data()for row in data:face_encoding = np.frombuffer(row[4], dtype=np.float64)  # 假设face_encoding存储为二进制数据self.known_faces.append(face_encoding)self.known_face_names.append(row[1])  # 员工姓名def recognize_face(self):"""通过摄像头进行人脸识别并记录考勤"""video_capture = cv2.VideoCapture(0)while True:ret, frame = video_capture.read()rgb_frame = frame[:, :, ::-1]  # 转换为RGB格式# 查找所有人脸和对应的面部特征face_locations = face_recognition.face_locations(rgb_frame)face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):matches = face_recognition.compare_faces(self.known_faces, face_encoding)name = "未知员工"if True in matches:first_match_index = matches.index(True)name = self.known_face_names[first_match_index]self.record_attendance(name)# 在图像上画出人脸的位置并标注员工姓名cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)font = cv2.FONT_HERSHEY_DUPLEXcv2.putText(frame, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)# 显示图像cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakvideo_capture.release()cv2.destroyAllWindows()def record_attendance(self, name):"""记录考勤信息"""time_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"{name} 打卡成功,时间:{time_now}")# 记录考勤到数据库cursor = self.db_manager.conn.cursor()cursor.execute("INSERT INTO attendance_records (employee_name, time) VALUES (%s, %s)", (name, time_now))self.db_manager.conn.commit()cursor.close()
解释
  • 人脸识别:通过 face_recognition 库识别员工的面部特征,并与数据库中的已知员工数据进行比对。
  • record_attendance:如果人脸识别成功,系统会记录当前时间和员工姓名,自动生成考勤记录。
  • load_known_faces:从数据库加载所有员工的人脸特征数据到内存中,以便进行比对。

3. 用户管理界面:图形界面的设计

        为了提供便捷的管理功能,我们使用 PyQt5 构建了一个用户管理界面,支持员工信息的增删改查。

关键代码:管理界面
class AdminUI(QMainWindow):def __init__(self, db_manager, attendance_system):"""初始化界面和组件"""super().__init__()self.db_manager = db_managerself.attendance_system = attendance_systemself.init_ui()def init_ui(self):"""设置UI界面的布局和组件"""self.setWindowTitle("管理员管理界面")self.setGeometry(100, 100, 800, 600)main_widget = QWidget()self.setCentralWidget(main_widget)main_layout = QVBoxLayout()main_widget.setLayout(main_layout)# 添加用户按钮self.add_button = QPushButton("添加新员工")self.add_button.clicked.connect(self.add_user)# 开始考勤按钮self.attendance_button = QPushButton("开始考勤")self.attendance_button.clicked.connect(self.attendance_system.recognize_face)main_layout.addWidget(self.add_button)main_layout.addWidget(self.attendance_button)def add_user(self):"""添加新用户的函数"""dialog = UserDialog(self)if dialog.exec_() == QDialog.Accepted:user_data = dialog.get_data()face_encoding = self.attendance_system.get_face_encoding(user_data['employee_id'])self.db_manager.insert_person(user_data['name'], user_data['employee_id'], user_data['gender'], face_encoding)
解释
  • add_user:通过弹出对话框添加员工,并将员工的面部特征存储到数据库中。
  • attendance_button:点击该按钮启动人脸识别功能进行考勤打卡。

总结

        通过结合 PyQt5MySQL人脸识别技术,我们实现了一个智能化的 考勤管理系统。该系统不仅能通过图形界面进行员工信息管理,还能通过人脸识别自动打卡,大大提高了考勤管理的效率。

        未来,我们可以进一步拓展系统功能,如员工权限管理、数据分析与报告生成等,使其更加完备和智能化。

相关文章:

基于CNN的人脸识别考勤管理系统实现

随着技术的不断进步,人脸识别技术已经在各行各业得到了广泛的应用,尤其在 考勤管理 上,它提供了更加智能、便捷、精准的解决方案。本篇博客将介绍如何基于 PyQt5 和 MySQL 实现一个 人脸识别考勤系统,并通过具体代码展示如何通过图…...

Android基于回调的事件处理

Android 中的回调机制:基于回调的事件处理详解 在 Android 开发中,回调(Callback)是一种常见的事件处理机制,主要用于异步操作和事件通知。与传统的基于监听器的事件处理相比,回调机制更加灵活、通用&…...

postgis和地理围栏

postgis postgis是pg数据库的一个插件,除原数据类型外(int varchar)、新增了空间数据类型(geography和geometry)。比如我们新建一张道路表road(字段有名称varchar、建设时间timestamp、地理位置geometry),可以将道路名字、建设时间存进去,同…...

《鸿蒙系统AI技术:筑牢复杂网络环境下的安全防线》

在当今数字化时代,复杂网络环境给智能系统带来了诸多安全挑战,而鸿蒙系统中的人工智能技术却展现出强大的安全保障能力,为用户在复杂网络环境中的安全保驾护航。 微内核架构:安全基石 鸿蒙系统采用微内核架构,将核心…...

SQL SERVER__RSN 恢复的深入解析

1. RSN 的工作原理 RSN 是 SQL Server 内部用于跟踪和管理备份和恢复操作顺序的编号。每次数据库备份(包括完整备份、差异备份和事务日志备份)都会生成一个唯一的 RSN。SQL Server 在恢复过程中使用 RSN 来确保备份文件按正确的顺序应用,从而…...

面试加分项:Android Framework PMS 全面概述和知识要点

在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:PMS 基础知识 1.1 PMS 定义与工作原理 1.2 PMS 的主要任务 1.3 PMS 与相关组件的交互 第二章:PMS 的核心功能 2.1 应用安装与卸载机制 2.2 应用更新与版本管理 2.3 组件管理 第…...

Http协议封装

Myhttp封装http协议 源代码 #include <iostream> #include <cstring> #include <string> #include <thread> #include <atomic> #include <fstream> // 添加文件操作头文件#ifdef _WIN32 #include <winsock2.h> #include <ws2t…...

el-date-picker 禁用一个月前、一个月后(当天之后)的时间 datetimerange

文章目录 功能需求今天是 2025-01-09示例1示例2 代码 Vue2 功能需求 时间范围选择器&#xff0c;最大时间选择尺度为一个月。 今天是 2025-01-09 示例1 选择 2025-01-02 日 禁用未来日期&#xff08;2025-01-09之后日期&#xff09; 禁用上月2号&#xff08;31日之前&#…...

【C】编译与链接

在本文章里面&#xff0c;我们讲会讲解C语言程序是如何从我们写的代码一步步变成计算机可以执行的二进制指令&#xff0c;并最终执行的。C语言程序运行主要包括两大步骤 -- 编译和链接&#xff0c;接下来我们就来一一讲解。 目录 1 翻译环境和运行环境 2 翻译环境 1&#…...

Github上传项目

写在前面&#xff1a; 本次博客仅仅是个人学习记录&#xff0c;不具备教学作用。内容整理来自网络&#xff0c;太多了&#xff0c;所以就不放来源了。 在github页面的准备&#xff1a; 输入标题。 往下滑&#xff0c;创建 创建后会跳出下面的页面 进入home就可以看到我们刚…...

webrtc之rtc::ArrayView<const uint8_t>

rtc::ArrayView<const uint8_t> 是 WebRTC&#xff08;或其他基于 rtc 命名空间的库&#xff09;中常见的一个类型&#xff0c;它通常用于表示一块 只读的内存区域&#xff0c;该内存区域由一系列 uint8_t 类型&#xff08;无符号 8 位整数&#xff09;元素组成。 1. rt…...

Zemax 序列模式下的扩束器

扩束器结构原理 扩束器用于增加准直光束&#xff08;例如激光束&#xff09;的直径&#xff0c;同时保持其准直。它通常用于激光光学和其他需要修改光束大小或发散度的应用。 在典型的扩束器中&#xff0c;输入光束是准直激光器&#xff0c;或光束进入第一个光学元件。当光束开…...

Flink系统知识讲解之:如何识别反压的源头

Flink系统知识之&#xff1a;如何识别反压的源头 什么是反压 Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念&#xff0c;强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理&#xff0c;这里有…...

RK3568平台(USB篇)禁用USB端口

一.linux中怎样查看usb的端口号 在USB口插入U盘: [ 198.141319][ T106] usb 3-1.3: new SuperSpeed Gen 1 USB device number 5 using xhci-hcd [ 198.161695][ T106] usb 3-1.3: New USB device found, idVendor=0781, idProduct=5591, bcdDevice= 1.00 [ 198.161721]…...

洛谷 P3000 [USACO10DEC] Cow Calisthenics G

思路 题目要求断若干条边后形成的连通块中&#xff0c;最大的直径最小&#xff0c;很明显的二分。关键就在于如何写 c h e c k check check 函数了。 可以用 d f s dfs dfs 来判断要断哪条边。 一、 d [ u ] d[u] d[u] 定义 设 d [ u ] d[u] d[u] 为从 u u u 出发到子树…...

Web渗透测试之XSS跨站脚本攻击 盲打 详解

目录 XSS盲打 什么是盲打: 盲打主要目的 XSS盲打 什么是盲打: 发现某个页面有xss漏洞 但是注入后没看到效果 而是在其它页面进行xss显示的效果 这种就叫盲打. 我注册了一个网站的用户 注册页面存在xss漏洞跳转到首页 看不到注册信息的输出 当管理员打开页面查看什么用户…...

经典编程题:服务器广播

题目描述&#xff1a; 服务器连接方式包括直接相连&#xff0c;间接连接。A 和 B 直接连接&#xff0c;B 和 C 直接连接&#xff0c;则 A 和 C 间接连接。直接连接和间接连接都可以发送广播。 给出一个 N*N 数组&#xff0c;代表 N 个服务器&#xff0c;matrix[i][j]1&#xf…...

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络&#xff1a; 静态配置路由动态路由协议 在本文&#xff0c;我们将学习关于静态路由的各种概念&#xff0c;例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…...

朝天椒USB服务器在银泰证券虚拟化超融合场景的应用案例

在数字化浪潮席卷金融行业的今天&#xff0c;银泰证券作为业内知名的金融机构&#xff0c;始终致力于提升业务运营效率与数据安全性。面对虚拟化超融合场景下各种认证U盾的管理挑战&#xff0c;银泰证券选择了朝天椒USB服务器作为其解决方案&#xff0c;成功实现了U盾在虚拟机中…...

.NET framework、Core和Standard都是什么?

对于这些概念一直没有深入去理解&#xff0c;以至于经过.net这几年的发展进化&#xff0c;概念越来越多&#xff0c;越来越梳理不容易理解了。内心深处存在思想上的懒惰&#xff0c;以为自己专注于Unity开发就好&#xff0c;这些并不属于核心范畴&#xff0c;所以对这些概念总是…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...