基于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 results
        return []

    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 datetime

class AttendanceSystem:
    def __init__(self, db_manager):
        self.db_manager = db_manager
        self.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_DUPLEX
                cv2.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'):
                break

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

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

相关推荐
2401_8984106924 分钟前
Bash语言的文件操作
开发语言·后端·golang
m0_7482574634 分钟前
【MySQL系列文章】Linux环境下安装部署MySQL
linux·mysql·adb
Want59543 分钟前
《Python趣味编程》专栏介绍与专栏目录
开发语言·python
qq19783663081 小时前
Python 批量生成Word 合同
开发语言·python·自动化·word
等一场春雨1 小时前
linux 使用 MySQL Performance Schema 和 Prometheus + Grafana 来监控 MySQL 性能
linux·mysql·prometheus
棋丶1 小时前
VUE2和VUE3的区别
开发语言·前端·javascript
Pandaconda1 小时前
【Golang 面试题】每日 3 题(二十三)
开发语言·后端·面试·golang·go·channel
等一场春雨1 小时前
linux 查看 MySQL 在 Linux 或 WSL 上的运行状态
linux·mysql·adb
sun0077001 小时前
C++中,typename
开发语言·c++
C++小厨神2 小时前
Go语言的数据库交互
开发语言·后端·golang