当前位置: 首页 > 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人脸识别技术,我们实现了一个智能化的 考勤管理系统。该系统不仅能通过图形界面进行员工信息管理,还能通过人脸识别自动打卡,大大提高了考勤管理的效率。

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

http://www.lryc.cn/news/518334.html

相关文章:

  • Android基于回调的事件处理
  • postgis和地理围栏
  • 《鸿蒙系统AI技术:筑牢复杂网络环境下的安全防线》
  • SQL SERVER__RSN 恢复的深入解析
  • 面试加分项:Android Framework PMS 全面概述和知识要点
  • Http协议封装
  • el-date-picker 禁用一个月前、一个月后(当天之后)的时间 datetimerange
  • 【C】编译与链接
  • Github上传项目
  • webrtc之rtc::ArrayView<const uint8_t>
  • Zemax 序列模式下的扩束器
  • Flink系统知识讲解之:如何识别反压的源头
  • RK3568平台(USB篇)禁用USB端口
  • 洛谷 P3000 [USACO10DEC] Cow Calisthenics G
  • Web渗透测试之XSS跨站脚本攻击 盲打 详解
  • 经典编程题:服务器广播
  • 【网络协议】静态路由详解
  • 朝天椒USB服务器在银泰证券虚拟化超融合场景的应用案例
  • .NET framework、Core和Standard都是什么?
  • FairGuard游戏安全2024年度报告
  • JetBrains IDEs和Visual Studio Code的对比
  • 文件剪切走:深度解析与高效恢复策略
  • Win32汇编学习笔记09.SEH和反调试
  • [人工智能]CSDN创作助手体验
  • vue3中el-table实现多表头并表格合并行或列
  • HTML+CSS+JS制作中国传统节日主题网站(内附源码,含5个页面)
  • 时空笔记:CBEngine(微观交通模拟引擎)
  • 【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)
  • 【C++】字符串的 += 和 + 运算详解
  • 多模态大模型部署:结合dify