精华内容
下载资源
问答
  • 基于window的人脸识别考勤系统, 人脸识别模块使用python的Face_recognition模块,后台基于Django和SQLite数据库,前端主要使用layui。作为本科毕设,内容较为简单。
  • 基于matlab的人脸识别考勤系统,gui界面,可直接运行
  • 基于树莓派的在线人脸识别考勤系统
  • 人脸识别考勤系统解决方案 一 人脸识别行业背景 严格规范的员工考勤管理是现代企事业单位提高管理效益的重要保证 , 而传统的以打卡刷卡为代表的考勤产品存在着替代打卡效率低下不易统计管理和使用维护成本高等弊端 ...
  • 人脸识别考勤系统解决方案 一 人脸识别行业背景 严格规范的员工考勤管理是现代企事业单位提高管理效益的重要保证, 而 传统的以打卡刷卡为代表的考勤产品存在着替代打卡效率低下不易统 计管理和使用维护成本高等弊端 ...
  • 6该系统分为员工打卡系统(Armface)和管理员管理系统(AdminFace)员工打卡系统:1、实时显示时间(show_time()2、管理员发布的通知(通过定时器访问通知表,run_message())3、人脸识别进行打卡(通过按钮打开摄像头进行...
  • 基于dlib库的人脸识别考勤系统设计与实现.pdf
  • 人脸识别考情系统,很有帮助,作为网上学习参考资料!
  • 人脸识别考勤系统 软件商用说明 逐步学习交流及一切非盈利用途,禁止商用。 说明 软件的话从去年到现在,一直完美支持100人以上考勤,如果在编译过程中遇到了任何报错,可以给我留言,如果看到的话,我会免费提供...
  • 介绍基于嵌入式的煤矿人脸识别考勤系统,结合RFID技术,主动感知人员接近;选用天敏追踪王摄像头,自动搜索人脸进行拍照,提高了系统反应速度;采用简单高效的PCA人脸识别算法进行识别,增强了系统的准确性;同时用VC++6.0...
  • 人脸识别考勤系统可能由于用户化妆等原因发生错误。基于树莓派的在线人脸识别考勤系统使用OpenCV集成的LBPH算法,当发生识别错误时,管理员可以远程登录系统对用户采集新的样本以更新其人脸模型。对系统进行测试,...
  • 基于Opencv的人脸识别考勤系统.pdf
  • 大学课堂人脸识别考勤系统 应用解决方案 广东铂亚信息技术股份有限公司 2013 年 12 月 word 教育资料 . . 目 录 1 系统应用背景 . 3 2 系统建设意义 . 4 3 人脸识别技术介绍 5 3.1 人脸识别技术的特点 6 3.2 人脸...
  • 6该系统分为员工打卡系统(Armface)和管理员管理系统(AdminFace)员工打卡系统:1、实时显示时间(show_time()2、管理员发布的通知(通过定时器访问通知表,run_message())3、人脸识别进行打卡(通过按钮打开摄像头进行...
  • 人脸识别考勤系统的设计与实现,赵玲,姚文斌,针对当前考勤系统存在的代替考勤、考勤效率低的问题,设计并实现了一种人脸识别考勤系统FRAS(Face Recognition Attendance System),并基于反��
  • 关于人脸识别考勤的相关...4中夜班考勤混乱等为规范公司考勤管理特规定如下 一考勤机适用范围公司全体职工 二人脸识别考勤系统使用方法及注意事项 1考勤机全天开机所有员工上下班都必须采集考勤信息 考勤时将面部置于
  • 基于RFID和人脸识别考勤系统的设计与实现.pdf
  • 基于MTCNN的FaceNet架构的人脸识别考勤系统设计与实现.pdf
  • 基于eclipse与mysql的人脸识别,百度ai存储人脸库。非常实用,简介不能说明什么,实例运行告诉你效果。
  • 基于人脸识别考勤系统的设计与实现 非常详细的人脸识别技术介绍
  • 人脸识别考勤系统 使用Python 3.6和OpenCV 3.4的人脸识别考勤系统 遵循的步骤: 从firstpage.py开始此项目 通过单击创建数据集按钮创建数据集。 通过单击数据集按钮进行训练 单击识别+出勤按钮以开始识别和标记...
  • 一个基于Opencv,dlib人脸识别的员工考勤系统,作者某双一流A类大学里的一流学生,写于2018/09 /,Python学习期间。 作者 QQ交流群 个人博客 开源版及商业版说明 开源版 商业版 人脸录入 支持 支持 上班刷脸签到 ...
  • 基于OpenCV的人脸识别考勤系统

    千次阅读 多人点赞 2020-03-01 16:03:36
    考勤系统设计 人脸数据库的建立 图像采集 图像预处理及模型训练 人脸检测 人脸特征识别 数据库与OpenCV通信 显示签到结果

    考勤系统设计

    学生上课考勤系统最初的方式是采用的人工纸质点名,目前仍旧有一部分学校依旧采用此种方法点名,这种方法也一直是被认为最有效的签到点名方式。但由于课程繁多加上学生人数众多, 代替点名现象普遍存在, 而且传统的现场点名签到方式费时费力, 直接影响到授课质量。人脸签到系统解决了这一问题,可以实时监测所到的成员数量和质量。
    其整体结构图为

    在这里插入图片描述

    1. 人脸数据库的建立
      系统采集成员的人脸图像,将这些人脸分类标号保存,并建立人脸库。

    2. 图像采集
      摄像头采集人脸图像,前期用于训练模型,后期用于对人脸的预测。

    3. 图像预处理
      由于摄像头设备存在采集图像方法、提取人脸角度、图像背景以及光照变化等干扰信号,使得识别正确率出现不同程度的降低。所以,需将采集到的图像以及检测出来的人脸通过图像处理算法处理。其中处理方法有尺度归一化、图像灰度化、灰度变换、图像增强、以及图像降噪等。

    4. 人脸特征提取及模型训练
      图像特征提取和特征描述是图像目标识别的关键技术,特征提取结果的好坏,直接影响模型训练结果,进而影响了目标识别的效果,在图像检索系统中,特征描述的好坏也会直接影响目标匹配和图像检索的精度。图像处理中特征点的检测与匹配是机器视觉最重要的部分。
      特征提取指的是使用计算机提取视频中的图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。特征的好坏对泛化性能有至关重要的影响。
      图像的模型训练即是通过对所提取的人脸特征,不断调整模型参数使人脸图像针对于模型之间的误差值达到最小。用于之后对人脸的预测。

    5. 人脸识别
      提取的人脸图像的特征数据与数据库中存储的特征模板进行搜索匹配,通过设定一个阈值,当相似度超过这一阈值,则把匹配得到的结果输出。人脸识别就是将待识别的人脸特征与已得到的人脸特征模板进行比较,根据相似程度对人脸的身份信息进行判断。这一过程又分为两类:一类是确认,是一对一进行图像比较的过程,另一类是辨认,是一对多进行图像匹配对比的过程。在图像匹配过程中有一个重要特征是:每个识别匹配都具有转置信(confidence)评分,因此可在实际应用中通过对其设置阈值来进行筛选。
      人脸识别是利用提取好的特征,进行身份确认或在人脸库中比对搜索最巧似者。因此,需要选择合适的算法进行识别匹配。在OpenCV中有三种人脸识别的方法,它们分别基于三种不同的算法:Eigenfaces、FisherFaces和Local Binary Pattern Histogram(LBPH)。
      (1)Eigenfaces算法是通过PCA来处理。PCA的本质是识别某个训练集上的主成分,并计算出训练集(图像或帧中的检测到的人脸)相对于数据库的发散程度,并输出一个值。该值越小,表明人脸数据库和检测到的人脸之间的差别就越小;0值表示完全匹配。
      (2)Fisherfaces算法是从PCA中衍生发展出来的,采用更复杂的逻辑;尽管计算更加密集,但比Eigenfaces更容易得到准确效果。
      (3)LBPH算法将检测到的人脸分为小单元,并将其与模型中的对应单元比较,对每个区域匹配值产生一个直方图。
      predict()函数返回含有两个元素的数组:第一个元素是所识别个体的标签,第二个是信度评分。所有的算法都有一个置信度评分阈值,置信度评分用来衡量所识别人脸与原模型的差距,0表示完全匹配。

      可能有时不想保留所有的识别结果,则需进一步处理,因此可用自己的算法来估算识别的置信度评分;例如,如果正在试图识别视频中的人,则可能要分析后续帧的置信度评分来估计识别是否成功。在这种情况下,可通过算法来检查得到的置信度评分,然后得出自己的结论。

    6. 显示签到结果
      分析人脸的特征通过所训练的模型与数据库中进行对比,得到具体人的具体信息,进行签到记入数据库

    功能实现

    UI界面设计

    人脸识别考勤系统共有三个界面:人脸识别考勤系统主界面、人脸数据采集及训练界面和进入考勤系统三部分。具体见下图:人脸识别考勤系统界面整体设计。
    在这里插入图片描述

    (1)人脸识别考勤系统主界面

    人脸识别考勤系统主界面(具体见下图)包含三个按钮,分别是“人脸数据采集及训练”、“进入考勤系统”和“退出考勤”。点击“人脸数据采集及训练”即可进入“人脸数据采集及训练”界面。

    在这里插入图片描述

    (2)人脸数据采集及训练界面

    人脸数据采集及训练界面(具体见下图)包含三个按钮分别是“开始采集”、“人脸采集训练”和“信息采集”(信息采集指text文本框中学生基本信息的输入)。在这一界面首先要输入信息采集框内的具体信息,然后点击“开始采集”按钮即可打开摄像头采集人脸信息并保存至人脸信息数据集;点击“人脸采集训练”按钮即进行人脸数据集信息模型训练;

    在这里插入图片描述

    (3) 进入人脸识别考勤界面

    进入人脸识别考勤界面(具体见下图)包含三个按钮分别是“显示审核信息”(显示审核信息指text文本框中学生基本信息的输出)、“考勤”和“考勤表”。在课前考勤是需先打开本系统,点击“考勤”即可加载摄像头进行人脸识别,人脸识别成功后“显示审核信息”栏内会输出学生基本信息,即代表签到成功。“考勤表”是为方便老师上课时清点签到人数而设置,点击“考勤表”。即显示已签到人人数和具体人员基本信息。

    在这里插入图片描述

    数据库设计

    数据库设计主要分为学生信息和考勤信息两部分。

    (1)学生信息

    学生信息总表(具体见下表)录入信息时将学号sid和姓名name录入并设置考勤总次数times为0。当进行考勤时,考勤一次将对应人的总次数times增加1。

    在这里插入图片描述

    (2)考勤表

    考勤表(具体见表2)记录考勤人员名单,当进行考勤时,后台将视频识别到的考勤人员信息插入此表,老师可根据查询考勤名单查看考勤人员。
    在这里插入图片描述

    系统具体功能

    1. 人脸信息采集及存储

    首先,需要录入班级所有同学基本信息:姓名、学号并进行对应的人脸信息采集,并保存人脸图像信息,以便后期进行模型训练与人脸识别,具体人脸信息采集及存储流程图见图8.

    人脸信息采集首先需要输入被采集学生的基本信息,打开摄像头进行图像采集,如果此学生已存在则会提示已经存在,如若没有则会对此学生进行过人脸采集。人脸采集是在摄像头采集的图片的基础上进行的,由于采集的图片信息周围环境嘈杂,需要进行专门的人脸检测采集人脸信息,在本系统中采用Cascade级联分类器进行人脸检测,主要步骤为先加载OpenCV自带人脸检测器,使用cvtColor函数对图片灰度化处理,在人脸检测中,有效图像的预处理不仅可以提高人脸检测正确率,还可以极大地缩减检测时间,再使用detectMultiScale函数进行人脸识别检测人脸,如若检测到人脸信息,则裁剪灰度帧的区域,大小为200*200像素。整个采集过程中,人脸信息会自动编号保存,采集200张。然后将采集到的人脸信息保存到以此人名称命名的文件夹下,文件名后缀为.pgm,具体如下图所示。
    在这里插入图片描述
    在这里插入图片描述

    1. 人脸数据集模型训练处理

    由于基础的人脸图像无法完成人脸识别匹配,因此需要对采集到的人脸信息图像进行特征分析与统计建立分类模型并进行模型训练。具体人脸数据集模型训练处理流程图见图10。

    首先需要从上一步保存的人脸信息数据集中进行图像检索,如若没有图像文件信息则会提示文件不存在并跳出训练过程,若检测到文件存在则会创建特征检测器;使用IMREAD_GRAYSCALE将原始图像转化为灰度化图像打开;然后resize调整大小;返回图像和标签列表;并对其进行人脸特征提取,特征提取结果的好坏,直接影响模型训练结果,进而影响了目标识别的效果;此时我们对获取得人脸信息进行模型训练,并将训练结果保存,具体结果见图11。

    在这里插入图片描述
    在这里插入图片描述

    1. 人脸识别

    人脸识别是整个系统的关键,本系统中采用LBPH进行人脸识别,需要在课前打开摄像头进行人脸考勤,具体人脸识别流程图见图12。

    在打开人脸考勤系统时,后台会首先调取数据库中学生基本信息;初始化LBPH人脸识别模型;导入上一步训练好的人脸信息模型训练集;然后调用摄像头,对考勤学生进行人脸信息采集时相同步骤的人脸检测,对摄像头中检测到的人脸进行对比分析和算法比对;预测读取到的人脸信息,返回label和置信度评分。人脸识别中通过置信度评分来丢弃结果,LBPH算法中好的识别参考值要低于50,任何高于80的参考值都会被认为是低的置信度评分。根据置信度评分低于50和label返回数据库中学生信息,人脸识别结束。

    在这里插入图片描述

    1. 人脸识别信息与数据库连接,签到表反馈

    在上一步的人脸识别出考勤学生后,会将考勤学生的基本学生信息通过数据库插入考勤表中,通过点击考勤表按钮,直观的给教师反馈出实时到的考勤人员信息,具体考勤表、点击考勤表后控制台反馈信息见下图。

    在这里插入图片描述
    在这里插入图片描述

    主要代码

    主函数

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from MainWindow0 import MyWindow
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        w = MyWindow()
        w.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowCloseButtonHint)
        w.setFixedSize(w.width(), w.height())
        w.show()
        sys.exit(app.exec_())
    
    
    

    功能函数

    import sys
    import cv2
    import os
    import numpy as np
    from PyQt5.QtCore import QCoreApplication
    from PyQt5 import QtWidgets,QtMultimediaWidgets
    from MainWindow import Ui_MainWindow
    from kaoqin_list import Ui_kaoqin_list
    from face_data_collect import Ui_face_data_collect
    from face_recognition_sys import Ui_face_recognition_sys
    import face_data_collect
    import kaoqin_list
    import face_recognition_sys
    import pymysql
    import re
    
    #from collect import *
    #from training import *
    #from recognition import *
    #这是考勤导出窗体
    class Mykaoqin(QtWidgets.QWidget, Ui_kaoqin_list):
        def __init__(self, parent=None):
            super(Mykaoqin, self).__init__(parent)
            self.setupUi(self)
        def ButtonEvenbinding(self):
            self.Button.clicked.connect(self.pushButtonclick)
        def pushButton1click(self):
            print('kaoqin')
            #这里面写功能
    
    class mysqloper():
    
    
        def __init__(self, parent=None):
    
            # super(mysqloper, self).__init__(parent)
            self.db = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="199808", db="sa")
            # 得到一个可以执行SQL语句的光标对象
            self.cursor = self.db.cursor()  # 使用 execute() 方法执行 SQL 查询
            self.cursor.execute('SELECT VERSION()')
            self.data = self.cursor.fetchone()
            print("Database version : %s " % self.data)
            # 关闭光标对象
            self.cursor.close()
    
        # 链接数据库
        def mysqlconnect(host="127.0.0.1", port=3306, user="root", passwd="199808", db="sa"):
            db = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db)
            return db
    
        # 执行语句
        def executeCreate(self,con, sql):
            cursor = con.cursor()  # 使用 execute() 方法执行 SQL 查询
            ret = cursor.execute(sql)
            cursor.close()
            return ret
    
        # 执行插入和更新
        def executeInsertAndUpdate(self,con, sql, listParams):
            try:
                cursor = con.cursor()  # 使用 execute() 方法执行 SQL 查询
                print("前")
                ret = cursor.execute(sql, listParams)
                print("hou")
                # 提交事务
                self.db.commit()
                cursor.close()
                return ret
            except:
                print("跳出")
                return 0
    
    
    
    
        # 执行查询
        def executeQuery(self,con, sql, listParams):
            cursor = con.cursor()  # 使用 execute() 方法执行 SQL 查询
            cursor.execute(sql, listParams)
            results = cursor.fetchall()
            cursor.close()
            return results
    
        def table_exists(self,con, table_name):  # 这个函数用来判断表是否存在
            sql = "show tables;"
            cursor = con.cursor()
            cursor.execute(sql)
            tables = [cursor.fetchall()]
            table_list = re.findall('(\'.*?\')', str(tables))
            table_list = [re.sub("'", '', each) for each in table_list]
            cursor.close()
            if table_name in table_list:
                return 1  # 存在返回1
            else:
                return 0  # 不存在返回0
    
        # 插入函数
        def Insert(self,table, sid, name):
            times = 0
            # 判断是否存在表user1
            existflag = self.table_exists(self.db, table)
            if existflag == 0:  # 不存在
                # 创建表 # 定义要执行的SQL语句
                sql = """CREATE TABLE {0}(
                sid INT(15) PRIMARY KEY ,
                name CHAR(10) NOT NULL UNIQUE,
                times TINYINT 
                );
                """
                # 执行SQL语句
                ret = self.executeCreate(self.db, sql.format(table))
                if ret:
                    print('执行成功')
                else:
                    print('执行失败')
    
            # 插入 更新、删除
            sql = "INSERT INTO {0}(name,sid,times) VALUES (%s,%s, %s);"
            # 执行SQL语句
            # print(sql.format(table))
            ret = self.executeInsertAndUpdate(self.db, sql.format(table), [name, sid, times])
            if ret:
                print('执行成功')
            else:
                print('执行失败')
    
            # 关闭数据库连接
            self.db.close()
    
        def InsertOnly(self,table,sid,name):
            existflag = self.table_exists(self.db, table)
            # print(existflag)
            if existflag == 0:  # 不存在
                # 创建表 # 定义要执行的SQL语句
                sql = """CREATE TABLE {0}(
                        sid INT PRIMARY KEY,
                        name CHAR(10) NOT NULL UNIQUE
                        );
                        """
                # 执行SQL语句
                ret = self.executeCreate(self.db, sql.format(table))
                if ret:
                    print('考勤表创建成功')
                else:
                    print('考勤表shibai')
            # 插入 更新、删除
    
            sql = "INSERT INTO {0}(sid,name) VALUES (%s,%s);"
            # 执行SQL语句
            print(sql.format(table))
            ret = self.executeInsertAndUpdate(self.db, sql.format(table), [sid,name])
            print("AAA")
            if ret:
                print('考勤成功')
            else:
                print('已考勤')
    
    
            # 关闭数据库连接
            self.db.close()
    
        #
        def QueryID(self,table, name):
            # 查询
            sql = "select sid from %s where name={0}"
            results = self.executeQuery(self.db, sql.format(name), table)
            print(results)
            # 关闭数据库连接
            self.db.close()
            return results
    
        # 查询表中的名字
        def Query(self,table):
            # 查询
            sql = "select * from {0}"
            results = self.executeQuery(self.db, sql.format(table), [])
            names = []
            sids=[]
            # 遍历结果
            for row in results:
                sids.append(row[0])
                names.append(row[1])
            # 关闭数据库连接
            self.db.close()
            return names,sids
    
        def Increase(self,table,face_ID):
            sql = "update {0} set times=times+1 where sid={1}"
            ret = self.executeInsertAndUpdate(self.db, sql.format(table,face_ID), [])
            if ret:
                print('总表插入成功')
            else:
                print('总表插入失败')
    
            # 关闭数据库连接
            self.db.close()
    
    
    #这是识别窗体
    class myrecognition(QtWidgets.QWidget, Ui_face_recognition_sys):
    
        def __init__(self, parent=None):
            super(myrecognition, self).__init__(parent)
            self.setupUi(self)
        def ButtonEvenbinding(self):
            self.Button1.clicked.connect(self.pushButton1click)
            self.Button2.clicked.connect(self.pushButton2click)
    
        def NameList(self):
            # 查询数据库中的名字
            self.mysql=mysqloper()
            names,sid=self.mysql.Query('student')
            return names,sid
    
        def cognize(self):
            names,sid = self.NameList()
            recognizer = cv2.face.LBPHFaceRecognizer_create()
            # 读模型
            recognizer.read('./trainer/trainer.yml')
            cascadePath = "./haarcascade_frontalface_default.xml"
            faceCascade = cv2.CascadeClassifier(cascadePath)
            font = cv2.FONT_HERSHEY_SIMPLEX
    
            # 窗口
            self.cap = cv2.VideoCapture(0)
            minW = 0.1 * self.cap.get(3)
            minH = 0.1 * self.cap.get(4)
            count=0
            while True:
                count=count+1
                ret, img = self.cap.read()
                gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                faces = faceCascade.detectMultiScale(
                    gray,
                    scaleFactor=1.2,
                    minNeighbors=5,
                    minSize=(int(minW), int(minH))
                )
    
                for (x, y, w, h) in faces:
                    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    
                    label, confidence = recognizer.predict(gray[y:y + h, x:x + w])
                    confidence = "{0}%".format(round(confidence))
                    print(names[label],confidence)
                    cv2.putText(img, str(names[label]), (x + 5, y - 5), font, 1, (0, 0, 255), 1)
                    cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 0, 0), 1)
    
                    cv2.imshow('camera', img)
                k = cv2.waitKey(10)
                if k == 27:
                    break
                if k == ord('q'):
                    break
                # if count > 20:
                #     break
            self.cap.release()
            cv2.destroyAllWindows()
            return names[label],sid[label]
    
        def pushButton1click(self):
            face_name,face_ID=self.cognize()
            print("------")
            print(face_name)
            print(face_ID)
            print("------")
            self.lineEdit6.setText(str(face_name))
            self.lineEdit7.setText(str(face_ID))
            print("-------")
            face_ID=int(face_ID)
            mysqloper().InsertOnly('student1', face_ID, face_name)
            print("--")
            mysqloper().Increase('student',face_ID)
            print("考勤成功")
    
    
            #这里面写功能
        def pushButton2click(self):
            name,sid=mysqloper().Query('student1')
    
            print("考勤列表")
            print(name)
    #这是人脸数据采集及训练窗体
    class Myface_collect(QtWidgets.QWidget, Ui_face_data_collect):
        #button1开始采集,button2人脸数据采集训练
        def __init__(self, parent=None):
            super(Myface_collect, self).__init__(parent)
            self.setupUi(self)
        def ButtonEvenbinding(self):
            self.Button1.clicked.connect(self.pushButton1click)
            self.Button2.clicked.connect(self.pushButton2click)
        #点击采集后实现的功能函数
        def video_demo_collect(self):
            self.cap = cv2.VideoCapture(0)
            face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
            face_name = self.lineEdit1.text()
            # print(face_name)
            face_ID = self.lineEdit2.text()
            # print(face_ID)
            #face_name = input('请输入你要采集的人的姓名(拼音):')
            if not os.path.exists('./Facedata/%s/' % str(face_ID)):
                os.mkdir('./Facedata/%s' % str(face_ID))
                mysqloper().Insert('student', face_ID,face_name)
            else:
                print("已经存在此文件,正在重新读入数据")
            count = 0
            while (True):
                ref, frame = self.cap.read()
                gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                faces = face_detector.detectMultiScale(gray, 1.3, 5)
                if count > 200:
                    break
                for (x, y, w, h) in faces:
                    img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
                    # font = cv2.FONT_HERSHEY_TRIPLEX
                    f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))
                    # 保存到路径下
                    # 保存图像
                    cv2.imwrite('./Facedata/%s/%s.pgm' % (str(face_ID), str(count)), f)
                    print(count)
                    count += 1
                cv2.imshow('image', frame)
                # 保持画面的持续。
                k = cv2.waitKey(10) & 0xff
                if k == 27:
                    break
            print("退出")
            self.cap.release()
            cv2.destroyAllWindows()
    
        def read_images(self,path, sz=None):
            c = 0
            X, y = [], []
            for dirname, dirnames, filenames in os.walk(path):
                for subdirname in dirnames:
                    print(subdirname)
                    # subdirname指文件名即人名
                    subject_path = os.path.join(dirname, subdirname)
                    for filename in os.listdir(subject_path):
                        try:
                            if (filename == ".directory"):
                                continue
                            filepath = os.path.join(subject_path, filename)
                            im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)
                            if (im is None):
                                print("image " + filepath + " is none")
                            # resize to given size (if given)
                            if (sz is not None):
                                im = cv2.resize(im, sz)
                            X.append(np.asarray(im, dtype=np.uint8))
                            y.append(c)
                            # data[subdirname] = data.get(subdirname, []) + X
                        except IOError as e:
                            print("I/O error({0}): {1}".format(e.errno, e.strerror))
                        except:
                            print("Unexpected error:", sys.exc_info()[0])
                            raise
                    c = c + 1
            return [X, y]
    
        def video_demo_train(self):
            path = './Facedata/'
            [X, y] = self.read_images(path)
            y = np.asarray(y, dtype=np.int32)
            # 创建模型
            model = cv2.face.LBPHFaceRecognizer_create()
            # 训练模型
            model.train(np.asarray(X), np.asarray(y))
            # 模型预测
            [p_label, p_confidence] = model.predict(np.asarray(X[0]))
            # 保存模型
            model.write('./trainer/trainer.yml')
            print("训练完成")
    
        def pushButton1click(self):
            self.video_demo_collect()
            #这里面写功能
    
        def pushButton2click(self):
            self.video_demo_train()
    
    #这是主窗体
    class MyWindow(QtWidgets.QWidget, Ui_MainWindow):
        def __init__(self, parent=None):
            super(MyWindow, self).__init__(parent)
            self.setupUi(self)
            self.ButtonEvenbinding()
            self._isWinodowCreated = True
            self._shouldDrawDebugRects = True
        @property
        def isWindowCreated(self):
            return self._isWindowCreated
        # 每加一个界面就要增加一句self.模块名字.clicked.connect(lambda:self.自己定义的名字())
        # 然后在下面加
        # def 自定义名字1(self):
        # self.form1=QtWidgets.QWidget() 实例化
        # self.s = 界面Py文件名字.界面文件名字的类()
        # self.s.setupUi(self.form1)
        # self.form1.show()
        def ButtonEvenbinding(self):
            self.Button1.clicked.connect(self.pushButton1click)
            self.Button2.clicked.connect(self.pushButton2click)
            self.Button3.clicked.connect(QCoreApplication.instance().quit)
    #这个地方其实就是相当于pushButton1click的main函数
        def pushButton1click(self):
            self.form1=QtWidgets.QWidget()
            self.s = Myface_collect()
            self.s.setupUi(self.form1)
            self.s.ButtonEvenbinding()
            self.form1.show()
    #这个地方就相当于pushButton2click的main函数
        def pushButton2click(self):
            self.form2 = QtWidgets.QWidget()
            self.s = myrecognition()
            self.s.setupUi(self.form2)
            self.s.ButtonEvenbinding()
            self.form2.show()
    
    
    
    展开全文
  • matlab人脸考勤,签到系统。步骤:1、建立实际人脸库。2、人脸扫描,分割;3、识别;4、记录考勤信息:姓名,学号,时间,次数。 带界面。
  • 2、通过opencv实现人脸识别打卡;2、显示管理员发布的最新通知。管理员管理系统的功能有 1、对用户的信息进行录入; 2、查看当日考勤情况并进行统计 ;3、管理员发布和管理通知 ; 4、超级管理员添加和删除管理员
  • 手把手教你:人脸识别考勤系统

    千次阅读 2021-05-24 16:24:13
    介绍:本文主要介绍如何使用python搭建:一个基于FaceNet(TensorFlow版)和PyQt5的人脸识别考勤系统。 1.博主也参考过网上其他博主介绍FaceNet的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,...

    系列文章

    手把手教你:人脸识别考勤系统


    本文为系列第一篇


    项目简介

    本文主要介绍如何使用python搭建:一个基于FaceNet(TensorFlow版)和PyQt5的人脸识别的考勤系统。

    博主也参考过网上其他博主介绍FaceNet的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个识别系统即可。

    本文只会告诉你如何快速搭建一个人脸识别的考勤系统并运行,原理的东西可以参考其他博主

    也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。

    如果您有以上想法,那就找对地方了!


    提示:以下是本篇文章正文内容

    一、项目展示

    项目展示
    系统界面
    项目演示可以参考我在B站发的视频
    手把手教你搭建:人脸识别考勤系统

    二、环境需求

    因为本项目基于TensorFlow因此需要以下环境:

    • tensorflow==1.7
    • scipy
    • scikit-learn
    • opencv-python
    • h5py
    • matplotlib
    • Pillow
    • requests
    • psutil
    • pyqt5

    环境安装实例

    环境都可以通过pip进行安装。如果只是想要功能跑起来,这边建议tensorflow安装cpu版的。

    如果没使用过pycharm通过pip安装包的同学可以参考如下:

    环境安装方法
    点开“终端”,然后通过pip进行安装tensorflow,其他环境包也可以通过上面的方法安装。

    三、功能模块介绍

    1.人脸库图像

    人脸库图像放在项目中:data/my_data/“人名”/“图片名”.jpg。

    我这里只用了4个明星的人脸图像,可以根据你自己需要识别的人脸构建你自己的人脸库。

    如下:
    人脸库图片

    2.构建人脸库

    将图片放好后

    执行:src/align/align_dataset_mtcnn.py文件
    和:src/classifier.py文件

    执行人脸库构建
    执行上述2个文件完成后。
    在:data/my_data_160文件夹中会生成自己的人脸库图像。
    在:20170512-110547/my_classifier.pkl中会生成自己的人脸库图像分类。

    3.启动人脸识别功能

    确保上述文件执行完成并成功后。

    执行:contributed/my_view.py,即可启动上面的人脸识别界面。

    下面附一部分界面功能代码:

    class GUI(QtWidgets.QWidget):
    
        def __init__(self):
    
            # 初始化————init__
    
            super().__init__()
    
            # 实例化人脸识别线程
            self.thread = Thread()
            self.initGUI()
            # 定义消息链接
            self.thread.signal.connect(self.show_success_box)
    
        def initGUI(self):
    
            # 设置窗口大小
    
            self.resize(500, 600)
    
            # 设置窗口位置(下面配置的是居于屏幕中间)
    
            qr = self.frameGeometry()
    
            cp = QtWidgets.QDesktopWidget().availableGeometry().center()
    
            qr.moveCenter(cp)
    
            self.move(qr.topLeft())
    
            # 设置窗口标题和图标
    
            self.setWindowTitle('人脸识别门禁系统')
    
            self.setWindowIcon(QtGui.QIcon('../data/images/icon.png'))
    
            # 设置窗口提示
    
            self.setToolTip('窗口提示')
    
            # 设置label信息
    
            self.label = QtWidgets.QLabel(self)
    
            self.label.setGeometry(QtCore.QRect(150, 50, 200, 100))
    
            self.label.setText('请点击下方按钮进行人脸认证!')
            # 设置自动换行
            self.label.setWordWrap(True)
            # 设置文字居中
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.label.setObjectName('label')
            self.label.setStyleSheet("font: 75 18pt \"微软雅黑\";"
                                     "color: rgb(0, 0, 0);")
            # 设置label提示
            self.label.setToolTip('认证')
    
            '''
            设置打卡按钮
            '''
            self.btn = QtWidgets.QPushButton('开始认证!', self)
            self.btn.resize(200, 180)
            self.btn.move(150, 150)
            # 设置按钮样式
            self.btn.setStyleSheet("background-color: rgb(130, 60, 140);"
                                   "border-color: rgb(255, 255, 255);"
                                   "font: 75 24pt \"微软雅黑\";"
                                   "color: rgb(255, 255, 255);")
            # 设置按钮提示
            self.btn.setToolTip('按钮提示')
            # 点击鼠标触发事件
            self.btn.clicked.connect(self.clickbtn)
    
            '''
            设置统计查看按钮
            '''
            self.btn_checked = QtWidgets.QPushButton('查看通过信息', self)
            self.btn_checked.resize(200, 50)
            self.btn_checked.move(150, 380)
            # 设置按钮样式
            self.btn_checked.setStyleSheet("background-color: rgb(130, 60, 140);"
                                           "border-color: rgb(255, 255, 255);"
                                           "font: 75 18pt \"微软雅黑\";"
                                           "color: rgb(255, 255, 255);")
            # 设置按钮提示
            self.btn_checked.setToolTip('按钮提示')
            # 点击鼠标触发事件
            self.btn_checked.clicked.connect(self.checked_show)
    
            '''
            设置统计查看按钮
            '''
            self.btn_file = QtWidgets.QPushButton('查看通过文件', self)
            self.btn_file.resize(200, 50)
            self.btn_file.move(150, 480)
            # 设置按钮样式
            self.btn_file.setStyleSheet("background-color: rgb(130, 60, 140);"
                                        "border-color: rgb(255, 255, 255);"
                                        "font: 75 18pt \"微软雅黑\";"
                                        "color: rgb(255, 255, 255);")
            # 设置按钮提示
            self.btn_file.setToolTip('按钮提示')
            # 点击鼠标触发事件
            self.btn_file.clicked.connect(self.csv_show)
            # 展示窗口
            self.show()
    
    

    因为项目中启动人脸识别存在一定延迟,所以项目中还使用了多线程。

    完整代码地址

    感兴趣的同学可以下载完整代码,使用过程中如遇到任何问题可以私信我,我都会一一解答。

    【代码分享】手把手教你:人脸识别考勤系统

    展开全文
  • 基于深度学习的人脸识别考勤系统设计

    千次阅读 多人点赞 2020-06-03 22:34:43
    基于深度学习的人脸识别考勤系统

    写在前面:本文是本科阶段参加的第三次科创比赛项目,当时只有一个人做,能力精力有限,很多预期的功能都没有实现。最后的可展示程度不高,没有走得很远。本文是申报书部分,可以为除此参加科创的同学提供思路,可以继续做下去,也可以参考某部分功能完善自己的作品。个人水平有限,仅供参考,如果有好的建议也希望能在本文评论区或者私信提出,谢谢。


    相关代码已经在去年的一篇文章中发布了,具体请访问:点击此处

    在这里插入图片描述

    在这里插入图片描述



    立项依据

    一.研究意义

    课堂是学生学习的主要场所,课堂学习是学生获取知识、培养能力、提高素质的主要渠道。系统科学的课堂考勤是保证各项教学计划有效落实和顺利执行的重要条件。有效的课堂考勤是创造良好学习氛围,形成良好班风、学风及增强学生的组织性和纪律性的必要条件,同时也是保证学校教学秩序的稳定、提高教学质量的重要措施。

    研究基于人脸识别的课堂考勤系统,借助信息技术,以人脸识别为手段,彻底摒弃传统课堂考勤中人工统计管理的落后方式,克服不规范的考勤行为,解决学校以往考勤管理工作中出现的问题,为学校的考勤制度实施提供科学的依据。

    大学课堂出勤率低,一直是各大高校面临的问题。相比各行各业陆续出现的各类考勤系统,高校课堂目前比较多的仍然是传统的点名方式,而近年来,也曾有一些新兴方式在某些高校出现:如手机APP签到、指纹识别、校园一卡通刷卡等。虽然这些新的方式较传统点名来说,是一种进步且日趋成熟,但是仍然有不少人为漏洞。比如手机或者校园卡有遗失与忘带的情况,学生也可以携带同学的手机与校园卡帮忙考勤;另外有少部分人群指纹较浅极难识别,甚至还有指纹膜作假的情况出现。针对这些现象,首先建立人脸数据库,其次通过深度学习技术训练一个自动提取人脸特征关键点并生成面纹编码的模型。之后,利用摄像工具获取当前人员的面部图像,接着进行几何校正与图像预处理,通过多种算法排除掉光线、背景、色调、表情、眼镜及神态等的干扰,再通过模型进行特征提取以及数据库人脸图像比对,并进行活体检测防止作弊,最终精确辨认出个体。这种人脸识别考勤系统更加能够适应高校课堂,易于被大众接受,且快速响应提高了时间效率。

    二.现状分析

    1.人脸识别发展历程

    早在 20 世纪 50 年代,认知科学家就已着手对人脸识别展开研究。20 世纪 60 年代,人脸识别工程化应用研究正式开启。当时的方法主要利用了人脸的几何结构,通过分析人脸器官特征点及其之间的拓扑关系进行辨识。这种方法简单直观,但是一旦人脸姿态、表情发生变化,精度则严重下降。

    20世纪90年代
    1991 年,著名的“特征脸”(Eigenface)方法第一次将主成分分析和统计特征技术引入人脸识别,在实用效果上取得了长足的进步。这一思路也在后续研究中得到进一步发扬光大,例如,Belhumer 成功将Fisher判别准则应用于人脸分类,提出了基于线性判别分析的Fisherface方法。

    2000-2012年
    21 世纪的前十年,随着机器学习理论的发展,学者们相继探索出了基于遗传算法、支持向量机(Support Vector Machine,SVM)、boosting、流形学习以及核方法等进行人脸识别。2009 年至 2012 年,稀疏表达(Sparse Representation)因为其优美的理论和对遮挡因素的鲁棒性成为当时的研究热点。与此同时,业界也基本达成共识:基于人工精心设计的局部描述子进行特征提取和子空间方法进行特征选择能够取得最好的识别效果。

    2013年
    2013年,微软亚洲研究院的研究者首度尝试了10万规模的大训练数据,并基于高维LBP特征和Joint Bayesian方法在LFW上获得了95.17%的精度。这一结果表明:大训练数据集对于有效提升非受限环境下的人脸识别很重要。然而,以上所有这些经典方法,都难以处理大规模数据集的训练场景。

    2014年
    2014 年前后,随着大数据和深度学习的发展,神经网络重受瞩目,并在图像分类、手写体识别、语音识别等应用中获得了远超经典方法的结果。香港中文大学的Sun Yi等人提出将卷积神经网络应用到人脸识别上,用20万训练数据,在LFW上第一次得到超过人类水平的识别精度,这是人脸识别发展历史上的一座里程碑。自此之后,研究者们不断改进网络结构,同时扩大训练样本规模,将LFW上的识别精度推到99.5%以上。人脸识别发展过程中一些经典的方法及其在LFW上的精度,都有一个基本的趋势:训练数据规模越来越大,识别精度越来越高。

    2.人脸识别行业发展特点分析

    随着人脸识别技术的不断改进,其应用领域从最开始的门禁/考勤领域,到目前应用于金融、安防反恐、教育、社交娱乐、设备、门禁/考勤、交通、智能商业等领域,应用范围逐渐扩大。起初,人脸识别技术仅限于2D识别,但由于2D人脸识别容易受到姿态、光照、表情等因素影响,识别率不够理想,因此3D人脸识别应运而生。相比较而言,3D人脸识别技术不仅识别率高,且在使用方便性上也远远高于2D人脸识别。

    3.人脸识别行业市场规模分析

    根据中国报告网发布《2018年中国生物识别市场分析报告-行业深度分析与发展前景预测》中内容,2017年生物识别技术全球市场规模上升到了172亿美元,到2020年,预计全世界的生物识别市场规模有可能达到 240亿美元。自2015年到2020年,人脸识别市场规模增长了166.6%, 在众多生物识别技术中增幅居于首位,预计到2020年人脸识别技术市场规模将上升至24亿美元。

    4.人脸识别行业主要应用分析

    目前,国内的人脸识别技术已经相对发展成熟,主要应用于三大范围;1)实名制验证,证明人与系统证件信息是否统一;2)进行身份判断,即判断某个人是否为特定群体中的一员,用于人员出入管理和城市安防等,有利于治安维护;3)是用户意愿确认,确保是真人在操作业务,进而做账户许可授权,涉及资产类行业运用较多。

    5.人脸识别行业前景预测

    从技术发展趋势来看,越来越多研究机构开始对人脸识别技术进行更深入的研究,以寻求更好、更新的人脸识别技术。其中,远距离人脸识别技术与3D人脸识别技术是研究的主要方向之一,虽然现在这些技术在实际运用过程中还存在一定的难度,但是,随着研究的深入,远距离人脸识别技术与3D人脸识别技术的应用将是未来一段时间的发展方向。
    从市场趋势来看,随着高科技信息技术的快速发展,未来人脸识别技术将逐渐向市场化、产品化的方向发展。此外,人脸识别技术的产品类型也将越来越多,例如基于肤色的人脸识别技术、基于点位的人脸识别技术、基于几何特征的人脸识别技术等。可以预见,随着人脸识别技术应用范围的扩大,具有针对性的人脸识别产品将越来越多。

    6.课堂考勤常用手段分析

    常见的考勤方式主要采用以下几种手段来完成:

    • 1)人工签到方式考勤
      这是最早的考勤方法,在信息技术及计算机还没有被广泛运用时,考勤管理工作主要依靠工人点名或签到的方式来完成。人工签到方式考勤最大的缺点是必须采用人工完成,效率低,特别是学生课堂考勤,如果学生人数多,会占据很大一部分的教学时间,影响了正常的教学计划。
    • 2)键盘输入密码方式考勤
      通过键盘输入每个人对应的密码,达到考勤的目的。但常常因忘记密码而发生人已到却无法完成考勤的情形。
    • 3)卡式考勤
      卡式考勤系统按卡介质类型不同可分为磁码卡、铁码卡、IC 卡等。卡式考勤管理系统最大的优势是,考勤工作不再需要过多的人为干预,一般只需工作开始时(或工作结束时)刷卡完成考勤操作,卡式考勤结合了计算机相关技术,把形成的刷卡数据保存到数据库中,然后由计算机进行统计分析,解决了采用人工方式中效率比较低的弊端。卡式考勤系统具有使用非常方便、快捷、不易损坏的特点,使其成为应用最广泛的考勤方式。但卡式考勤系统采用“物”代替“人”进行考勤,不能解决非本“人”进行考勤的本质问题。这也是卡式考勤系统存在的最大弊端,此外由于磁卡一般很容易被复制,寿命不长,磁卡丢失的情况时有发生,这些也都限制了卡式考勤的推广。
    • 4)人脸识别考勤
      随着科技的发展,出现了一种新的考勤方式,即生物识别考勤。它是通过计算机,利用人的生理特性进行考勤,包括人脸识别考勤、虹膜考勤、指纹考勤等。通过利用人身体的部位特征来实现信息的登记。在众多的生物识别考勤系统当中,最能体现考勤本身实际意义的应该是基于人脸识别考勤方式。与传统人工考勤方式和卡式考勤系统相比,人脸识别考勤系统基于人的生理特征,验证具有唯一性,并且实用性更好。

    7.人脸识别考勤的技术手段分析

    人脸考勤主要有三种应用形式:

    • 1)移动考勤:将考勤服务内置于手机或pad的APP中,无需单独购买摄像头、抓拍机,以较低的成本实现刷脸考勤。员工随时、随地打卡,无需排队等待。同时有活体检测功能。有效抵御视频、彩照、3D模型等活体作弊手段。
    • 2)摄像头无感知考勤:将网络摄像头或人脸抓拍摄像头,安装在学生、员工进出的必经之路,即可轻松实现无感知考勤。由于无需用户主动签到,因此减少了排队的过程;且摄像头可以同时抓拍多张人脸,实现多人同时考勤,显著提高考勤效率。
    • 3)一体机考勤:将摄像头、人脸比对SDK集成至考勤一体机中,学生、员工只需到前台进行刷脸,即可快速完成考勤,且可有效防止替考勤等作弊行为。

    三.主要参考文献及出处

    [1] 前瞻研究院.2018-2023年中国生物识别技术行业投资预测分析报告.2017
    [2] 清华大学.人脸识别研究报告.2018
    [3] 潘芬兰.基于人脸识别技术的职能考勤系统研究.浙江大学,2014
    [4] 杨高波,李实英.计算机视觉特征提取与图像处理[M]. 北京: 电子工业出版社,2014
    [5] 孙雅琪.基于人脸识别的课堂考勤系统设计与实现[硕士学位论文].桂林:桂林理工大学,2013
    [6] 林逸峰.基于计算机视觉的人体检测和人脸识别[博士学位论文].吉林:吉林大学,2012
    [7] 齐礼成.基于人脸识别考勤系统的设计与实现[硕士学位论文].西安:西安电子科技大学,2012
    [8] 苏秀梅.基于人脸识别的考勤系统设计实现[硕士学位论文].厦门:厦门大学,2015
    [9] 赵伟彬.基于人脸识别的考勤系统设计实现[硕士学位论文].广东:广东工业大学,2016
    [10] 黄伟前.基于人脸识别的考勤软件系统研究与设计[硕士学位论文].南京:南京理工大学,2015
    [11] 焦李成,赵进,杨淑媛,刘芳. 深度学习、优化与识别. 北京:清华大学出版社,2017


    项目实施方案及实施计划

    一. 实施方案

    1.系统的物理结构

    系统的前台硬件包括1080P摄像头、电脑,后台硬件包括应用服务器和数据库服务器,前后台之间通过无线wifi或者以太网连接,系统内的数据通过以太网传输。通过1080P摄像头进行人脸图像的采集,通过网络传送至应用服务器上,应用服务器通过图像处理后和数据库服务器交互进行比对,比对的结果会通过网络显示到客户端上提供查询和统计。系统物理结构如图3-1所示。
    在这里插入图片描述

    2.系统的功能模块

    本作品划分为四个主要模块:基本信息管理模块、考勤管理模块、班级管理模块、系统管理模块。为了保证系统的可用性和稳定性,还设置了综合查询、报表生成和设备管理等功能。本文主要针对系统的四个主要功能模块进行分析和介绍。系统功能模块划分如图3-2所示。
    在这里插入图片描述

    3.数据库设计

    本作品的数据表包括学生信息表、教师信息表、样本图像信息表、班级信息表、课程信息表、考勤记录表。根据以上对数据库的分析,基于人脸识别的课堂考勤系统数据库中表的设计结果如下:

    • 1)学生信息表
      此表通过系统管理员添加或导入学生基本信息,记录学生的基本信息如学号、姓名、年龄、班级等情况。
    • 2)图像信息表
      此表通过人脸图像收集,记录收集图象样本、大小和在存储中保存路径等。
    • 3)教师信息表
      此表通过教师自行添加教师基本信息,记录教师的基本信息如工号、姓名、年龄、部门等情况。
    • 4)班级信息表
      对班级信息的记录,不同专业、不同年级的班级对应不同的班级编号,由管理员设置。
    • 5)课程信息表
      此表记录班级课程基本情况,学生考勤安排与它相关联。
    • 6)考勤记录表
      此表是对考勤情况的详细记录,包含学生个人基本信息、考勤时间、考勤课程。

    4.系统功能设计

    课堂考勤系统主要功能为两个部分。第一部分是通过移动终端采集学生人脸图像样本,第二部分是通过后台管理考勤记录。具体应用时,对学生人脸进行注册,采集样本人脸信息保存于数据库,使用深度学习算法,对数据库中注册学生的人脸数据集进行训练,其次在考勤管理过程中使用训练好的模型识别个人的人脸信息,确认身份,将识别结果生成考勤结果储存到数据库中。

    进行考勤记录的过程是:教师在电脑客户端,选择当前课程,进入考勤界面,点击开始考勤进行人脸识别,不管失败和成功都会有语音提醒;如果未录入信息,则提醒同学进行信息的录入;如果考勤成功则会写入数据库;如果考勤失败则可以向老师申请,手动添加。考勤管理模块主要是针对学生考勤进行等级,统计班级学生出勤情况。其中包括,考勤设置,考勤记录统计和出勤状况调整。

    (1)学生信息采集
    该功能是指,按照相关要求采集学生个人的人脸图像,进行注册,在不同环境、不同角度下采集15张图片样本,作为个人信息库,系统会对这些图像首先进行人脸对齐,光照归一等预处理,之后使用深度学习算法进行训练,得到的模型用于提取特征。

    (2)考勤管理
    该功能主要是针对考勤记录进行审核,针对考勤规定,通过考勤记录生成统计报表。具体流程是由教师设置考勤模式,默认为固定考勤模式,比如上课前10分钟完成考勤;另一种是随机考勤,比如课后60分钟,临下课前10分钟考勤。考勤结束后,教师可以通过电脑端应用查看考勤结果,其中没有考勤的同学会显示出来,教师可以根据实际情况调整(其中考勤异常、请假、旷课)的学生,最后教师可以通过考勤结果生成报表,查看班级学生考勤情况。

    (3)人脸识别技术流程
    人脸识别技术原理简单来讲主要是三大步骤:一是建立一个包含大批量人脸图像的数据库;二是通过各种方式来获得当前要进行识别的目标人脸图像;三是将目标人脸图像与数据库中既有的人脸图像进行比对和筛选。 根据人脸识别技术原理具体实施起来的技术流程则主要包含以下四个部分,即人脸图像的采集与预处理、人脸检测、人脸特征提取、人脸识别和活体鉴别。人脸识别技术流程如图3-3所示。
    在这里插入图片描述
    (4) 考勤结果申报
    在检测和识别了人脸特征信息获取了考勤记录后,系统对考勤结果进行记录。系统内的考勤结果由正常、请假、缺勤、异常。其中请假需要核实情况后,由教师手动添加。如果有学生来到教室,却考勤异常,需要由教师手动调整,以保证考勤结果的公平性。

    二. 实施办法

    1.系统界面

    (1)基本信息管理
    系统管理员可以实现班级管理,人员管理和课程管理,数据查询统计和数据库备份等功能,系统管理具有最高的权限。
    在选择人员管理中有添加人员、删除人员和人员权限设置三个功能。如果发现添加的人员信息有误,可以直接进行修改学生信息。

    (2)课程管理
    在选择需要考勤的班级后,进入课程添加页面,在该页面可以添加课程名称和上课时间,并可以再次页面上设定固定的考勤时间段。

    (3)学生考勤管理
    教师到教室后打开电脑端应用,学生进行人脸识别签到,可以单人次可以多人次同时进行考勤。初次使用时,可以先查询个人信息是否录入错误,如果错误可以联系老师修改。考勤时段限制在课前,上课之后,自动退出考勤系统,并生成考勤结果,输出签到、迟到、未到的同学名单。待老师确认情况后(如果有同学请假或者特殊情况,说明原因后,由老师修改考勤记录),生成考勤结果,提交到数据库服务器保存。

    (4)教师考勤管理
    教师通过工号及密码登陆系统,系统会根据录入的信息,显示当前时段的上课情况。开始考勤之后,系统会根据老师之前设置的考勤方式进行考勤。教师可以实时查看考勤结果,如果有漏考勤或人脸识别不通过的同学,教师可以手动调整考勤结果,并可以通过学号或名字添加请假同学。

    管理员或教师可以使用自己的账号登陆系统,在固定周期的每个考勤统计日期,系统会自动将上月的考勤记录进统计和分析,按照班级和课程等将考勤记录统计出来,统计内容包括班级、考勤记录、考勤结果、请假、缺勤信息等。管理员或教师也可以查询某一位同学的出勤记录。

    2.系统调试

    (1)测试管理员和教师的各项功能是否完善,例如:添加删除功能,以及系统是否正常运转。
    (2)监测系统录入的信息是否与学生信息匹配,是否可进行人脸识别,查看自己的考勤记录。
    (3)测试人脸识别模型在实际应用过程中是否准确,比如识别人数达到一千人。
    (4)测试在windows10系统下的应用是否运行稳定,运行流畅,比如是否存在卡死的情况。
    (5)系统的各项功能是否完善,是否可以实现后台的管理,数据库的读写是否存在问题。

    3.人脸识别算法的部署和实施:

    1.人脸图像的采集与预处理

    (1)人脸图像的采集
    采集人脸图像通常情况下有两种途径,分别是既有人脸图像的批量导入和人脸图像的实时采集。我们首先使用1080P摄像头集中采集每个人20张在不同角度、不同光照条件下的照片,构建人脸数据库。之后在进行人脸识别过程中,保存每次识别的照片。并过滤掉不符合人脸识别质量要求或者是清晰度质量较低的人脸图像,尽可能的做到清晰精准的采集。

    (2)人脸图像的预处理
    人脸图像的预处理的目的是在系统对人脸图像的检测基础之上,对人脸图像做出进一步的处理以利于人脸图像的特征提取。 人脸图像的预处理具体而言是指对系统采集到的人脸图像进行光线、旋转、切割、过滤、 降噪、放大缩小等一系列的复杂处理过程来使得该人脸图像无论是从光线、角度、距离、大小等任何方面来看,均能够符合人脸图像的特征提取的标准要求。 在现实环境下采集图像,由于图像受到光线明暗不同、脸部表情变化、阴影遮挡等众多外在因素的干扰,导致采集图像质量不理想,那就需要先对采集到的图像预处理,如果图像预处理不好,将会严重影响后续的人脸检测与识别。本作品使用了三种图像预处理手段,即灰度调整、图像滤波、图像尺寸归一化。

    2.人脸检测

    一张包含人脸图像的图片通常情况下可能还会包含其他内容,这时候就需要进行必要的人脸检测。也就是在一张人脸图像之中,系统会精准的定位出人脸的位置和大小,在挑选出有用的图像信息的同时,自动剔除掉其他多余的图像信息来进一步的保证人脸图像的精准采集。人脸检测是人脸识别中的重要组成部分。本作品使用基于Harr特征的级联分类器在进行人脸的检测,它把弱分类器串联成强分类器,这样就能做到速度和精度的双提高。

    3.人脸特征提取

    目前主流的人脸识别系统可支持使用的特征通常可分为人脸视觉特征、人脸图像像素统计特征等,而人脸图像的特征提取就是针对人脸上的一些具体特征来提取的。特征简单,匹配算法则简单,适用于大规模的建库;反之,则适用于小规模库。特征提取的方法一般包括基于知识的提取方法或者基于代数特征的提取方法。 以基于知识的人脸识别提取方法中的一种为例,因为人脸主要是由眼睛、额头、鼻子、 耳朵、下巴、嘴巴等部位组成,对这些部位以及它们之间的结构关系都是可以用几何形状特征来进行描述的,也就是说每一个人的人脸图像都可以有一个对应的几何形状特征,它可以帮助我们作为识别人脸的重要差异特征。

    4.人脸识别

    我们可以在人脸识别系统中设定一个人脸的相似程度的数值,再将对应的人脸图像与系统数据库中的所有人脸图像进行比对,若超过了预设的相似数值,那么系统将会把超过的人脸图像逐个输出,此时我们就需要根据人脸图像的相似程度高低和人脸本身的身份信息来进行精确筛选,这一精确筛选的过程又可以分为两类:其一是一对一的筛选,即对人脸身份进行确认过程;其二是一对多的筛选,即根据人脸相似程度进行匹配比对的过程。本作品是一对多的识别过程,基于ResNet-34网络架构进行训练,但层数较少,滤波器减少一半;它包含一个triplet训练步骤。triplet包含三种不同的脸,其中两张是一个人。该神经网络为人脸图像生成128维向量。如果是同一个人的脸,就调整神经网络权重,让矢量距离更接近。网络量化人脸,为每张人脸构建了128维嵌入(量化)。之后调整神经网络的权重,以使两个相同人脸的128维的度量更接近,并远离不同的人脸。

    5.活体鉴别

    生物特征识别的共同问题之一就是要区别该信号是否来自于真正的生物体,比如,指纹识别系统需要区别带识别的指纹是来自于人的手指还是指纹手套,人脸识别系统所采集到的人脸图像,是来自于真实的人脸还是含有人脸的照片。因此,实际的人脸识别系统一般需要增加活体鉴别环节,例如,要求人左右转头,眨眼睛,开开口说句话等。本作品将综合使用这三种方法进行活体鉴别。

    三.具体实施计划及可行性分析

    1.具体实施计划

    2018年11月—2018年12月,完成小批量人脸图像的采集,同时编写人脸识别程序;
    2018年12月—2019年1月,研究对比多种人脸识别算法,在业内公认的数据集上进行训练,从中选取最优算法进行部署测试,同时开始前端应用的设计开发,其中包括数据库编程、图像预处理相关程序的编写;
    2019年1月—2019年2月,采集本班人脸图像,使用选出的最优算法进行训练,进行测试;开始研究实现活体检测技术;并开始完善前端应用的功能;
    2019年2月—2019年3月,完成人脸识别考勤前端应用的基本功能和其它功能的设计;
    2019年3月—2019年4月,进行系统最后的集成,并逐步优化运行速度和模型识别效率,测试整体框架的功能完整性和稳定性,并进行修复和改进。如果再有时间,则扩展其他功能。

    2.可行性分析

    人脸识别的优势在于:

    • 1)非侵扰性
      人脸识别无需干扰人们的正常行为就能较好地达到识别效果,无需担心被识别者是否愿意将手放在指纹采集设备上,他们的眼睛是否能够对准虹膜扫描装置等等。只要在摄像机前自然地停留片刻,用户的身份就会被正确识别。
    • 2)便捷性
      采集设备简单,使用快捷。一般来说,常见的摄像头就可以用来进行人脸图像的采集,不需特别复杂的专用设备。图像采集在数秒内即可完成。
    • 3)友好性
      通过人脸识别身份的方法与人类的习惯一致,人和机器都可以使用人脸图片进行识别。 而指纹,虹膜等方法没有这个特点,一个没有经过特殊训练的人,无法利用指纹和虹膜图像对其他人进行身份识别。
    • 4)非接触性
      人脸图像信息的采集不同于指纹信息的采集,利用指纹采集信息需要用手指接触到采集设备,既不卫生,也容易引起使用者的反感,而人脸图像采集,用户不需要与设备直接接触。
    • 5)可扩展性
      在人脸识别后,下一步数据的处理和应用,决定着人脸识别设备的实际应用,如应用在出入门禁控制、人脸图片搜索、上下班刷卡、恐怖分子识别等各个领域,可扩展性强。正是因为人脸识别拥有这些良好的特性,使其具有非常广泛的应用前景,也正引起学术界和商业界越来越多的关注。人脸识别已经广泛应用于身份识别、活体检测、唇语识别、创意相机、人脸美化、社交平台等场景中。

    经过以上的优势可以看出,人脸识别应用在课堂考勤中,是当前最佳的考勤方式。


    预期成果

    本作品最终的成果展示形式是包含摄像头和电脑端的应用程序。它具有以下四个指标:

    • 1)模型可识别人脸数量达到1000位以上;
    • 2)2秒内完成单人身份的确认和签到,支持多人同时签到;
    • 3)具有活体检测功能,防止照片、视频作弊;
    • 4)数据库可以成功读取写入,整个系统的功能运行流畅。

    本项目的特点与创新之处

    本作品的特点是使用2D成像摄像头,辅以数据库编程、电脑端程序开发、深度学习人脸识别、活体检测等技术手段,设计了功能完善的电脑应用程序,来完成身份信息的录入和身份的验证,当完成人脸识别后,会将考勤信息自动统计出来,并将考勤结果写入数据库,方便管理员和老师的查询。本作品的创新之处是:

    • 1)使用人脸识别代替传统点名方式,提高点名效率,高效快速便捷;
    • 2)使用深度学习人脸识别技术,识别准确率和可识别数量大大提升;
    • 3)设计编写了功能完善的电脑端的应用程序,具有自动统计出勤率,自动输出考勤信息,考勤结果一目了然;
    • 4)将个人信息、考勤记录等数据储存到MySQL数据库中,方便管理者管理。

    研究基础

    • 1)指导教师在新能源科学与工程专业任教,负责《自动控制理论》、《动力工程计算机控制》等课程的教学,研究方向为无人驾驶车辆相关技术,在软硬件开发方面有较丰富的实际经验,多次指导学生参加各类科技创新竞赛并取得了良好成绩。
    • 2)负责人从2017年8月开始学习机器学习相关知识,作品一参加国家级创新创业训练计划;作品二获得学校第四届科技创新大赛三等奖;作品三参加SRT和科技立项并顺利结题,并获得学校节能减排大赛二等奖;作品四还在开发中;经过一年多的学习和研究,对深度学习中的目标检测算法具有浓厚兴趣,有比较深的理解。获得校三好学生、校优秀团员,二等奖学金。
    • 3)目前实验室已经具备可供本作品使用的深度学习算法训练的主机GTX1080主机两台,GTX1060主机一台。已购置OpenCV、机器学习、深度学习、Python编程的相关书籍数本,为项目研究打下坚实的基础。

    展开全文
  • 基于Python的人脸识别考勤系统

    万次阅读 2019-04-08 12:55:16
    基于Python的人脸识别考勤系统 Python源文件: 基于Python3.7编程环境开发 需要安装 tkinter pil face_recognition OpenCV2 库来实现人脸识别 需要安装jpush库和手机上的jpush APP来实现向手机推送考勤信息 ...

    基于Python的人脸识别考勤系统
    Python源文件:
    基于Python3.7编程环境开发
    需要安装 tkinter pil face_recognition OpenCV2 库来实现人脸识别
    需要安装jpush库和手机上的jpush APP来实现向手机推送考勤信息

    在这里插入图片描述
    源代码链接:
    链接: https://pan.baidu.com/s/16uyAqdUbCNbBwR45q1Zoag 提取码: pb4c

    展开全文
  • 基于百度AI人脸识别考勤系统设计与实现.pdf
  • 基于人脸识别考勤系统的设计与实现 非常详细的人脸识别技术介绍

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,586
精华内容 1,034
关键字:

人脸识别考勤系统