Sistema de asistencia de registro de reconocimiento facial Python + OpenCV (entrada para principiantes)

prefacio

Este proyecto está diseñado para el check-in y asistencia del personal del laboratorio IOT, el sistema implementa funciones:
1. Reconocimiento facial del personal y completar check-in/check-out
2. Cálculo de tiempo de asistencia
3. Guardar datos de asistencia en formato CSV (Excel mesa)

PD: este sistema de reconocimiento facial 2D ahorra la tediosa parte de entrenamiento del reconocimiento facial, que es simple y rápido

Este proyecto es una versión beta, la versión oficial agregará más funciones y se actualiza continuamente...
Pondré la dirección del proyecto de la versión beta al final

Representaciones de proyectos


inserte la descripción de la imagen aquí
Diagrama de visualización de la interfaz principal de la interfaz de inicio de sesión de inicialización del sistema :
inserte la descripción de la imagen aquí
Visualización de la función de entrada Visualización
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
de la función de salida
inserte la descripción de la imagen aquí
Registro de datos de entrada en segundo plano Registro
inserte la descripción de la imagen aquí
de entrada/salida
inserte la descripción de la imagen aquí

ambiente requerido por el proyecto

Entorno central:
OpenCV-Python 4.5.5.64
face_recognition 1.30
face_recognition_model 0.3.0
dlib 19.23.1

Interfaz de formulario de interfaz de usuario:
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

traductor

Pycham 2021.1.3
inserte la descripción de la imagen aquí
Python versión 3.9.12
inserte la descripción de la imagen aquí
Anaconda
inserte la descripción de la imagen aquí

Desarrollo asistido de QT-designer

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Configuración del proyecto

inserte la descripción de la imagen aquí

sección de código

código central

Se carga el archivo de interfaz de usuario 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

Llamada de cámara:

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

OutWindow.py
obtiene la hora actual del sistema

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

Cálculo de la hora de entrada

    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)

parte de reconocimiento facial

# 人脸识别部分
        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

Almacenamiento de datos de inicio de sesión y juicio

# 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)

Estructura del directorio del proyecto

inserte la descripción de la imagen aquí

posdata

Debido a que el sistema no realiza entrenamiento facial para establecer un modelo, el sistema tiene una alta tasa de reconocimiento falso y baja seguridad.La
optimización del sistema es deficiente, la cantidad de fotogramas capturados por la cámara es baja (8-9), la ocupación del fondo es alto, y la tasa de utilización de la CPU es alta
Formato CSV de almacenamiento de datos, menos seguro

Mejoras en la versión oficial

1. Agregue el aprendizaje profundo de TensorFlow para mejorar la seguridad y la precisión del reconocimiento facial en el sistema
2. Agregue la base de datos MySQL para proteger los datos de registro de manera más segura, y no es fácil de modificar
3. Embellecer y optimizar el diseño de la interfaz de usuario

Descarga del proyecto

Sistema de registro de reconocimiento facial IOT versión beta V0.99

Supongo que te gusta

Origin blog.csdn.net/weixin_50679163/article/details/124310679
Recomendado
Clasificación