Python人脸识别签到考勤系统

举报
Python小二 发表于 2022/06/14 22:06:36 2022/06/14
【摘要】 前言 本项目为IOT实验室人员签到考勤设计,系统实现功能: 人员人脸识别并完成签到/签退考勤时间计算保存考勤数据为CSV格式(Excel表格) PS:本系统2D人脸识别,节约了繁琐的人脸识别训练部分,简洁快捷 该项目为测试版,正式版会加入更多的功能,持续更新中..... 测试版项目地址我会放到结尾 项目效果图 登陆界面...

前言

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

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

  • 考勤时间计算

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

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

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

项目效果图

登陆界面
582d3282afab6f7af7c515ce936de829.png
主界面展示图:
ff69a86be2caea0541b60eb0bb848bfe.png
签到功能展示

a91a16a41fd8b163b52a9c4353dc486b.png8361772531169f8bffb4b7c6141d924f.png

签退功能展示
c4e45ee97199abb09aa8323227b09153.png
后台签到数据记录
f55ddbab805d9b4b7c7c15b0cff42eef.png
是否签到/退判断
7606dc2df7ae977a1dc644706611b24f.png

项目环境

核心环境:

  • 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.3b07c9a28f77dea8ca273baefcc5b392d.png

**Python版本 3.9.12**
  

0cbc663eea323cbe129d8a764aaa5961.pngAnaconda7f428bdb07a5bf2639af9ff1c32d0747.png

辅助开发QT-designer

0a6b4be1b8c07e24e498b60c3a457589.png39595fd5809ec8bc15220841a7157a83.png

项目配置
08e1dce64f7d869a0d9aa72273d4319f.png

代码部分

核心代码

「MainWindow.py」UI文件加载:


   
  1. class Ui_Dialog(QDialog):
  2.     def __init__(self):
  3.         super(Ui_Dialog, self).__init__()
  4.         loadUi("mainwindow.ui", self)       ##加载QTUI文件
  5.         self.runButton.clicked.connect(self.runSlot)
  6.         self._new_window = None
  7.         self.Videocapture_ = None

摄像头调用:


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

「OutWindow.py」获取当前系统时间


   
  1. class Ui_OutputDialog(QDialog):
  2.     def __init__(self):
  3.         super(Ui_OutputDialog, self).__init__()
  4.         loadUi("./outputwindow.ui", self)   ##加载输出窗体UI
  5.         ##datetime 时间模块
  6.         now = QDate.currentDate()
  7.         current_date = now.toString('ddd dd MMMM yyyy')  ##时间格式
  8.         current_time = datetime.datetime.now().strftime("%I:%M %p")
  9.         self.Date_Label.setText(current_date)
  10.         self.Time_Label.setText(current_time)
  11.         self.image = None

签到时间计算


   
  1. def ElapseList(self,name):
  2.         with open('Attendance.csv'"r") as csv_file:
  3.             csv_reader = csv.reader(csv_file, delimiter=',')
  4.             line_count = 2
  5.             Time1 = datetime.datetime.now()
  6.             Time2 = datetime.datetime.now()
  7.             for row in csv_reader:
  8.                 for field in row:
  9.                     if field in row:
  10.                         if field == 'Clock In':
  11.                             if row[0] == name:
  12.                                 Time1 = (datetime.datetime.strptime(row[1], '%y/%m/%d %H:%M:%S'))
  13.                                 self.TimeList1.append(Time1)
  14.                         if field == 'Clock Out':
  15.                             if row[0] == name:
  16.                                 Time2 = (datetime.datetime.strptime(row[1], '%y/%m/%d %H:%M:%S'))
  17.                                 self.TimeList2.append(Time2)

人脸识别部分


   
  1. ## 人脸识别部分
  2.         faces_cur_frame = face_recognition.face_locations(frame)
  3.         encodes_cur_frame = face_recognition.face_encodings(frame, faces_cur_frame)
  4.         for encodeFace, faceLoc in zip(encodes_cur_frame, faces_cur_frame):
  5.             match = face_recognition.compare_faces(encode_list_known, encodeFace, tolerance=0.50)
  6.             face_dis = face_recognition.face_distance(encode_list_known, encodeFace)
  7.             name = "unknown"    ##未知人脸识别为unknown
  8.             best_match_index = np.argmin(face_dis)
  9.             if match[best_match_index]:
  10.                 name = class_names[best_match_index].upper()
  11.                 y1, x2, y2, x1 = faceLoc
  12.                 cv2.rectangle(frame, (x1, y1), (x2, y2), (02550), 2)
  13.                 cv2.rectangle(frame, (x1, y2 - 20), (x2, y2), (02550), cv2.FILLED)
  14.                 cv2.putText(frame, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255255255), 1)
  15.             mark_attendance(name)
  16.         return frame

签到数据保存与判断


   
  1. ## csv表格保存数据
  2.         def mark_attendance(name):
  3.             """
  4.             :param name: 人脸识别部分
  5.             :return:
  6.             """
  7.             if self.ClockInButton.isChecked():
  8.                 self.ClockInButton.setEnabled(False)
  9.                 with open('Attendance.csv''a') as f:
  10.                         if (name != 'unknown'):         ##签到判断:是否为已经识别人脸
  11.                             buttonReply = QMessageBox.question(self, '欢迎 ' + name, '开始签到' ,
  12.                                                                QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
  13.                             if buttonReply == QMessageBox.Yes:
  14.                                 date_time_string = datetime.datetime.now().strftime("%y/%m/%d %H:%M:%S")
  15.                                 f.writelines(f'\n{name},{date_time_string},Clock In')
  16.                                 self.ClockInButton.setChecked(False)
  17.                                 self.NameLabel.setText(name)
  18.                                 self.StatusLabel.setText('签到')
  19.                                 self.HoursLabel.setText('开始签到计时中')
  20.                                 self.MinLabel.setText('')
  21.                                 self.Time1 = datetime.datetime.now()
  22.                                 self.ClockInButton.setEnabled(True)
  23.                             else:
  24.                                 print('签到操作失败')
  25.                                 self.ClockInButton.setEnabled(True)
  26.             elif self.ClockOutButton.isChecked():
  27.                 self.ClockOutButton.setEnabled(False)
  28.                 with open('Attendance.csv''a') as f:
  29.                         if (name != 'unknown'):
  30.                             buttonReply = QMessageBox.question(self, '嗨呀 ' + name, '确认签退?',
  31.                                                               QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
  32.                             if buttonReply == QMessageBox.Yes:
  33.                                 date_time_string = datetime.datetime.now().strftime("%y/%m/%d %H:%M:%S")
  34.                                 f.writelines(f'\n{name},{date_time_string},Clock Out')
  35.                                 self.ClockOutButton.setChecked(False)
  36.                                 self.NameLabel.setText(name)
  37.                                 self.StatusLabel.setText('签退')
  38.                                 self.Time2 = datetime.datetime.now()
  39.                                 self.ElapseList(name)
  40.                                 self.TimeList2.append(datetime.datetime.now())
  41.                                 CheckInTime = self.TimeList1[-1]
  42.                                 CheckOutTime = self.TimeList2[-1]
  43.                                 self.ElapseHours = (CheckOutTime - CheckInTime)
  44.                                 self.MinLabel.setText("{:.0f}".format(abs(self.ElapseHours.total_seconds() / 60)%60) + 'm')
  45.                                 self.HoursLabel.setText("{:.0f}".format(abs(self.ElapseHours.total_seconds() / 60**2)) + 'h')
  46.                                 self.ClockOutButton.setEnabled(True)
  47.                             else:
  48.                                 print('签退操作失败')
  49.                                 self.ClockOutButton.setEnabled(True)
项目目录结构
9f961f205d00a9096df4e7aa0da686cd.png

后记

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

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

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

正式版改进

  • 加入TensorFlow深度学习,提高系统人脸识别安全性与准确性

  • 加入MySQL数据库,对签到数据进行更安全保护,不易被修改

  • 美化优化UI设计

源码在公众号Python小二后台回复考勤签到获取~

推荐阅读  点击标题可跳转


   
  1. 点分享
  2. 点点赞
  3. 点在看

文章来源: ityard.blog.csdn.net,作者:Python小二,版权归原作者所有,如需转载,请联系作者。

原文链接:ityard.blog.csdn.net/article/details/125270360

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。