Python人脸识别签到考勤系统

前言

本项目为IOT实验室人员签到考勤设计,系统实现功能:

◦人员人脸识别并完成签到/签退

◦考勤时间计算

◦保存考勤数据为CSV格式(Excel表格)

PS:本系统2D人脸识别,节约了繁琐的人脸识别训练部分,简洁快捷

该项目为测试版,正式版会加入更多的功能,持续更新中… 测试版项目地址我会放到结尾

; 项目效果图

登陆界面

; 主界面展示图:

签到功能展示

; 签退功能展示

后台签到数据记录

; 是否签到/退判断

项目环境

核心环境:

◦OpenCV-Python     4.5.5.64

◦face_recognition 1.30

◦face_recognition_model   0.3.0

◦dlib 19.23.1

UI窗体界面:

◦PyQt5                        5.15.4

◦pyqt5-plugins                5.15.4.2.2

◦PyQt5-Qt5                    5.15.2

◦PyQt5-sip                    12.10.1

◦pyqt5-tools                  5.15.4.3.2

编译器

Pycham 2021.1.3
**Python版本 3.9.12**

Anaconda

; 辅助开发QT-designer

项目配置

; 代码部分

核心代码

python学习交流Q群:906715085####
「MainWindow.py」UI文件加载:
class Ui_Dialog(QDialog):
    def __init__(self):
        super(Ui_Dialog, self).__init__()
        loadUi("mainwindow.ui", self)       ##加载QTUI文件

        self.runButton.clicked.connect(self.runSlot)

        self._new_window = None
        self.Videocapture_ = None

摄像头调用:

def refreshAll(self):
    print("当前调用人俩检测摄像头编号(0为笔记本内置摄像头,1为USB外置摄像头):")
    self.Videocapture_ = "0"

「OutWindow.py」获取当前系统时间
class Ui_OutputDialog(QDialog):
    def __init__(self):
        super(Ui_OutputDialog, self).__init__()
        loadUi("./outputwindow.ui", self)   ##加载输出窗体UI

        ##datetime 时间模块
        now = QDate.currentDate()
        current_date = now.toString('ddd dd MMMM yyyy')  ##时间格式
        current_time = datetime.datetime.now().strftime("%I:%M %p")
        self.Date_Label.setText(current_date)
        self.Time_Label.setText(current_time)

        self.image = None
def ElapseList(self,name):
        with open('Attendance.csv', "r") as csv_file:
            csv_reader = csv.reader(csv_file, delimiter=',')
            line_count = 2

            Time1 = datetime.datetime.now()
            Time2 = datetime.datetime.now()
            for row in csv_reader:
                for field in row:
                    if field in row:
                        if field == 'Clock In':
                            if row[0] == name:
                                Time1 = (datetime.datetime.strptime(row[1], '%y/%m/%d %H:%M:%S'))
                                self.TimeList1.append(Time1)
                        if field == 'Clock Out':
                            if row[0] == name:
                                Time2 = (datetime.datetime.strptime(row[1], '%y/%m/%d %H:%M:%S'))
                                self.TimeList2.append(Time2)

人脸识别部分

python学习交流Q群:906715085####
## 人脸识别部分
        faces_cur_frame = face_recognition.face_locations(frame)
        encodes_cur_frame = face_recognition.face_encodings(frame, faces_cur_frame)

        for encodeFace, faceLoc in zip(encodes_cur_frame, faces_cur_frame):
            match = face_recognition.compare_faces(encode_list_known, encodeFace, tolerance=0.50)
            face_dis = face_recognition.face_distance(encode_list_known, encodeFace)
            name = "unknown"    ##未知人脸识别为unknown
            best_match_index = np.argmin(face_dis)
            if match[best_match_index]:
                name = class_names[best_match_index].upper()
                y1, x2, y2, x1 = faceLoc
                cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
                cv2.rectangle(frame, (x1, y2 - 20), (x2, y2), (0, 255, 0), cv2.FILLED)
                cv2.putText(frame, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255), 1)
            mark_attendance(name)

        return frame

签到数据保存与判断

csv表格保存数据
        def mark_attendance(name):
"""
            :param name: 人脸识别部分
            :return:
"""
            if self.ClockInButton.isChecked():
                self.ClockInButton.setEnabled(False)
                with open('Attendance.csv', 'a') as f:
                        if (name != 'unknown'):         ##签到判断:是否为已经识别人脸
                            buttonReply = QMessageBox.question(self, '欢迎 ' + name, '开始签到' ,
                                                               QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
                            if buttonReply == QMessageBox.Yes:

                                date_time_string = datetime.datetime.now().strftime("%y/%m/%d %H:%M:%S")
                                f.writelines(f'\n{name},{date_time_string},Clock In')
                                self.ClockInButton.setChecked(False)

                                self.NameLabel.setText(name)
                                self.StatusLabel.setText('签到')
                                self.HoursLabel.setText('开始签到计时中')
                                self.MinLabel.setText('')

                                self.Time1 = datetime.datetime.now()
                                self.ClockInButton.setEnabled(True)
                            else:
                                print('签到操作失败')
                                self.ClockInButton.setEnabled(True)
            elif self.ClockOutButton.isChecked():
                self.ClockOutButton.setEnabled(False)
                with open('Attendance.csv', 'a') as f:
                        if (name != 'unknown'):
                            buttonReply = QMessageBox.question(self, '嗨呀 ' + name, '确认签退?',
                                                              QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
                            if buttonReply == QMessageBox.Yes:
                                date_time_string = datetime.datetime.now().strftime("%y/%m/%d %H:%M:%S")
                                f.writelines(f'\n{name},{date_time_string},Clock Out')
                                self.ClockOutButton.setChecked(False)

                                self.NameLabel.setText(name)
                                self.StatusLabel.setText('签退')
                                self.Time2 = datetime.datetime.now()

                                self.ElapseList(name)
                                self.TimeList2.append(datetime.datetime.now())
                                CheckInTime = self.TimeList1[-1]
                                CheckOutTime = self.TimeList2[-1]
                                self.ElapseHours = (CheckOutTime - CheckInTime)
                                self.MinLabel.setText("{:.0f}".format(abs(self.ElapseHours.total_seconds() / 60)%60) + 'm')
                                self.HoursLabel.setText("{:.0f}".format(abs(self.ElapseHours.total_seconds() / 60**2)) + 'h')
                                self.ClockOutButton.setEnabled(True)
                            else:
                                print('签退操作失败')
                                self.ClockOutButton.setEnabled(True)

项目目录结构

; 后记

◦因为本系统没有进行人脸训练建立模型,系统误识别率较高,安全性较低

◦系统优化较差,摄像头捕捉帧数较低(8-9),后台占有高,CPU利用率较高

◦数据保存CSV格式,安全性较低

Original: https://www.cnblogs.com/1234567FENG/p/16376000.html
Author: 蚂蚁爱Python
Title: Python人脸识别签到考勤系统

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/810234/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Django中app的model相互引用问题

    Django有俩个 app ———-在 Course 的models.py中: from Shopping.models import Coup…

    Python 2023年8月4日
    0108
  • 在matplotlib中设置中文字体

    在matplotlib中设置中文字体 matplotlib库中默认使用的字体是不支持中文的,所以如果需要中文的标签或标题则我们手动去重新设置一个支持中文格式的字体。因为之前我在设置…

    Python 2023年9月1日
    066
  • 32.HttpRequest对象的学习

    引言——在前面你也跟着本博主编写了那么多的视图函数,但是每个视图函数它都会接收一个名为request的参数。是不是很好奇:视图函数接收到的request到底是个什么对象!!! Ht…

    Python 2023年8月3日
    069
  • mysql范式

    mysql范式: mysql建表的规范格式 第一范式:保证每列的原子性(字段不能再分解) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足…

    Python 2023年6月16日
    062
  • 使用python的pygame做的小游戏项目:小船打鱼

    python小游戏项目:小船打鱼 成果展示 代码解析 * go_fishing.py game_function.py game_stats.py scoreboard.py al…

    Python 2023年9月19日
    048
  • Pytest学习-使用fixture返回数据

    Pytest学习-使用fixture返回数据 原创 我的事说来话长2022-08-05 19:43:15博主文章分类:Pytest ©著作权 文章标签 Pytest 文章分类 Py…

    Python 2023年5月24日
    082
  • 大数据之HBase集群搭建

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年11月7日
    049
  • ArcGIS换行公式

    Function FindLabel ( [bridge_name] ) ss=len([bridge_name] ) if (ss >4) then FindLabel =…

    Python 2023年6月3日
    0118
  • Pygame实现小笨鸟,到小飞鸟

    在B站学习UP主: 趣派编程,” 99%相似度!手把手教你用Python制作Flappy Bird像素鸟游戏!” 后有感而发。 在UP主: 趣派编程,做的项…

    Python 2023年9月18日
    067
  • PyTorch 基础

    import torch import numpy as np 定义一个三行两列给定元素的矩阵,并且显示出矩阵的元素和大小 torch.Tensor默认的是torch.FloatT…

    Python 2023年8月26日
    047
  • PyTorch、CUDA Toolkit 及显卡驱动版本对应关系

    CUDA驱动及CUDA Toolkit最高对应版本如下: 如果上述没有你想要的,参考官方文档注:驱动是向下兼容的,其决定了可安装的CUDA Toolkit的最高版本。CUDA To…

    Python 2023年8月1日
    080
  • Django在Python中安装及创建项目

    Django在Python中应用 Pycharm中创建Django项目 * 安装第三方库Django 创建应用 MVT模式 请求与响应 参考教程:Django3.2 快速入门(四小…

    Python 2023年8月4日
    051
  • Python 科学计算库 Numpy (二) —— 索引及切片

    目录 1. 索引及切片 (1)通过下标以及内置函数进行索引切片 (2)使用冒号分隔参数进行切片索引 (3)对部分元素进行索引并切片 (4)对多维数组进行索引切片 2. 高级索引 (…

    Python 2023年8月29日
    055
  • python之项目依赖管理

    生成所有依赖清单 requirements.txt pipreqs 工具 安装) pip install pipreqs 执行生成依赖列表命令) pipreqs ./ 完善版本: …

    Python 2023年8月6日
    052
  • 【Python时间序列】01-将数据按照日期分组统计,导出csv文件

    Python时间序列01 需求:将数据按照日期分组统计,导出csv文件 import pandas as pd data = pd.read_excel("TimeSer…

    Python 2023年8月18日
    036
  • [WPF] 使用 HandyControl 的 CirclePanel 画出表盘刻度

    1. 前言 最近需要一个 WPF 的表盘控件,之前 Cyril-hcj 写过一篇不错的博客 《WPF在圆上画出刻度线》,里面介绍了一些原理及详细实现的代码: double radi…

    Python 2023年10月23日
    040
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球