رؤية الكمبيوتر | رؤية الآلة | التعلم الآلي | التعلم العميق
توصية المحرر
التعرف على الوجوه تشترك المقالة في مشروع عملي للتعرف على الوجوه: نظام الحضور ، ويمكن للطلاب المهتمين قراءته بعناية.
أعيد طبعه من 丨 باحثي بايثون
مقدمة
تم تصميم هذا المشروع لتسجيل وصول وحضور موظفي مختبر IOT. يحقق النظام الوظائف التالية:
-
التعرف على وجوه الموظفين وإتمام إجراءات الوصول / المغادرة -
حساب وقت الحضور -
حفظ بيانات الحضور بتنسيق CSV (جدول Excel)
ملاحظة: هذا النظام ثنائي الأبعاد للتعرف على الوجوه يحفظ جزء التدريب الشاق للتعرف على الوجوه ، وهو بسيط وسريع
الاداءات المشروع
واجهة تسجيل الدخول
مخطط عرض الواجهة الرئيسية:
عرض وظيفة تسجيل الدخول
عرض وظيفة تسجيل الخروج
سجل بيانات تسجيل الوصول في الخلفية
تحقق في / خارج
بيئة المشروع
البيئة الأساسية:
-
برنامج OpenCV-Python 4.5.5.64 -
face_recognition 1.30.0 تحديث -
face_recognition_model 0.3.0 -
dlib 19.23.1
واجهة شكل واجهة المستخدم:
-
PyQt5 5.15.4 -
ملحقات pyqt5 5.15.4.2.2 -
PyQt5-Qt5 5.15.2 -
PyQt5-sip 12.10.1 -
أدوات pyqt5 5.15.4.3.2
مترجم
بيكهام 2021.1.3
**Python版本 3.9.12**
اناكوندا
بمساعدة تطوير مصمم QT
تكوين المشروع
قسم الكود
الكود الأساسي
تحميل ملف واجهة المستخدم "MainWindow.py" :
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)
جزء التعرف على الوجه
## 人脸识别部分
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格式,安全性较低
正式版改进
-
加入TensorFlow深度学习,提高系统人脸识别安全性与准确性 -
加入MySQL数据库,对签到数据进行更安全保护,不易被修改 -
美化优化UI设计
链接:https://github.com/BIGBOSS-dedsec/Python-Face-recognition-Attendance
不方便下载的同学可以在公众号后台回复考勤签到获取百度云链接。
—THE END—
专注于计算机视觉与机器学习,想要将分享变成一种习惯!
后台回复「加群」加入互助群。
回复「目标检测」打包下载目标检测相关资料。
回复:图像处理丨计算机视觉丨机器学习丨深度学习丨C/C++丨Python丨PyTorch丨CVPR2022丨ECCV2022丨数据集 获取相应资料(不定时更新)。