Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

Posted 不断学习的小猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)相关的知识,希望对你有一定的参考价值。

目录

一、项目简介

二、功能展示

1.人脸识别功能测试

2.识别并录入人脸及个人信息

3.数据库保存信息

 4.考勤打卡

三、环境安装实例

1.下载python对应版本的dlib

2.安装opencv-python

3.安装face_recognition

 4.安装pyqt5

5.安装mysqlclient

四、需要源码私信并call邮箱lij867967@gmail.com


一、项目简介

本项目使用编程语言Python3.8,anaconda,开发工具pycharm,数据库mysql5.7。

技术应用:开源计算机视觉库opencv-python,开源人脸识别库face_recognition,使用PyQt5制作人脸识别以及考勤界面,dlib人脸检测技术,以及MySQLdb连接数据库。

功能介绍:

        第一步:录入,进入录入界面。调用摄像头检测识别人脸、输入姓名学号,人脸照片保存在faces文件夹中,姓名学号保存在数据库中。

        第二步:考勤,进入考勤界面。调用摄像头进行人脸识别,摄像头识别出人脸和人脸对应的名字。


二、功能展示

1.人脸识别功能测试

这是从网上随便找了一张图片识别静态人脸,成功。

调用摄像头识别动态人脸,成功

上述功能代码如下:

def a1():
    #加载图片
    img=face_recognition.load_image_file("1.jpeg")
    #检测脸部位置
    pos=face_recognition.face_locations(img)
    print("位置top,right,bottom,left",pos)
    for i in range(len(pos)):
        rect=pos[i]
        #绘制矩形
        cv2.rectangle(img,(rect[3],rect[0]),(rect[1],rect[2]),(0,0,220),2)
    #显示窗口
    cv2.imshow("",img)
    cv2.waitKey(0)
def a2():
    vd=cv2.VideoCapture(0)
    while True:
        #读取摄像头数据流
        ok,frame=vd.read()
        #矩阵子集
        facearea=frame[:,:,::-1]
        pos=face_recognition.face_locations(facearea)
        for(top,right,bottom,left) in pos:
            cv2.rectangle(frame,(left,top),(right,bottom),(0,200,0),2)
        cv2.imshow("",frame)
        cv2.waitKey(1)
    vd.release()
    cv2.destroyAllWindows()

2.识别并录入人脸及个人信息

此时人脸已经录入faces文件中,点击确定即可填写个人信息。

填写好信息,点击保存,信息即保存到数据库。

此时刚刚输入的账号和姓名已经保存到faces文件中,如下

(挡住了一点,但是能看到)

功能代码如下:

class LuruApp(UI_FaceRec):
    def __init__(self):
        super().__init__()
        self.running = True
        self.btn.setEnabled(False)
        self.face_encode = None
        self.open()
        self.face_img = None
        self.face_img_encode = ""

    def open(self):
        frame = np.zeros((500, 600, 3), np.uint8)
        img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
        draw = ImageDraw.Draw(img)
        font = ImageFont.truetype("simkai.ttf", 40, encoding="utf-8")
        draw.text((200, 200), "请正视摄像头", (200, 30, 40), font=font)
        frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB)
        frame = cv2.resize(frame, (self.img.width() - 10, self.img.height() - 10))
        h, w1, d = frame.shape
        # 从内存创建图像
        frame = QImage(frame.data, w1, h, w1 * d, QImage.Format_RGB888)
        self.img.setPixmap(QPixmap.fromImage(frame))
        # 开启子线程
        self.thread = Thread(target=self.doLuru)
        self.thread.start()

    def doLuru(self):

        fbl = FaceBoxesLocation()
        msg = ""
        self.cap = cv2.VideoCapture(0)
        # if self.cap.isOpened():
        #   ok, frame = self.cap.read()
        while self.running:
            ok, frame = self.cap.read()
            frame = cv2.flip(frame, 1)
            rawFrame = frame.copy()
            # 脸部区域
            face_pos = fbl.face_location(frame).astype(int)
            if len(face_pos) == 0:
                msg = "没有人脸"
            elif len(face_pos) > 1:
                msg = "请一个一个来!"
            else:
                msg = ""
                face_mark = face_recog.face_landmarks(frame, face_pos)
                # 脸部特征
                new_face_encode = face_recog.face_encodings(frame, face_pos)[0]
                if self.face_encode is None:
                    self.face_encode = new_face_encode
                    x1, y1, x2, y2 = face_pos[0]
                    self.face_img = frame[y1:y2, x1:x2]
                    print(self.face_img)
                    self.face_img_encode = self.face_encode.tolist()
                # else:
                #    face_distance = face_recog.face_distance(self.face_encode[np.newaxis], new_face_encode)[0]
                #   if face_distance < 0.5:
                # x1, y1, x2, y2 = face_pos[0]
                # self.face_img = frame[y1:y2, x1:x2]
                # print(self.face_img)
                # self.face_img_encode = self.face_encode.tolist()
                img = Image.fromarray(cv2.cvtColor(rawFrame, cv2.COLOR_BGR2RGB))
                draw = ImageDraw.Draw(img)
                for x1, y1, x2, y2 in face_pos:
                    draw.rectangle([(x1, y1), (x2, y2)], outline=(200, 30, 40), width=2)
                    # 绘制五官
                    if face_mark is not None:
                        for x, y in face_mark[0]:
                            draw.point((x, y), (20, 250, 25))
                font = ImageFont.truetype("simkai.ttf", 40, encoding="utf-8")
                draw.text((200, 200), msg, (200, 30, 40), font=font)
                frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB)
                frame = cv2.resize(frame, (self.img.width() - 10, self.img.height() - 10))
                h, w1, d = frame.shape
                # 从内存创建图像
                frame = QImage(frame.data, w1, h, w1 * d, QImage.Format_RGB888)
                self.img.setPixmap(QPixmap.fromImage(frame))
                self.running = False
                root = tkinter.Tk()
                root.withdraw()
                tkinter.messagebox.showinfo('系统提示', '人脸已经录入,请填写个人信息')
                self.btn.setEnabled(True)
                self.cap.release()

3.数据库保存信息

我使用的数据库可视化工具是Navicat12 for MySQL(也可以不用,mysql基本命令知道的话直接管理员cmd也可)

 4.考勤打卡

运行如下,此时摄像头一直在运行,绿色框框始终识别你的人脸(跟随你移动)

点击“请开始考勤”,开始考勤时间会直接显示在界面上

 点击“请结束考勤”,结束考勤时间会存入数据库

 功能代码如下:

class AttendanceApp(UI_FaceAttend):
    def __init__(self):
        super().__init__()
        # 摄像头开启开关
        self.running = True
        self.startattend = False
        # 摄像头看到的人的名字
        self.vnames = []
        # 存储学号+姓名+打卡时间
        self.ats = []
        self.open()

    # 打开摄像头
    def open(self):
        frame = np.zeros((500, 600, 3), np.uint8)
        # 灰化
        img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
        draw = ImageDraw.Draw(img)
        font = ImageFont.truetype("simkai.ttf", 40, encoding="utf-8")
        draw.text((200, 200), "准备考勤...", (200, 30, 40), font=font)
        frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB)
        # 调整图像大小
        frame = cv2.resize(frame, (self.video.width(), self.video.height()))
        h, w, d = frame.shape
        # 从内存创建图像
        frame = QImage(frame.data, w, h, w * d, QImage.Format_RGB888)
        self.video.setPixmap(QPixmap.fromImage(frame))
        # # 开启子线程
        self.thread = Thread(target=self.doAttend)
        self.thread.start()

    def doAttend(self):
        # 已录入的头像
        luruimgs = []
        # 头像对应人员
        lurunames = []
        path = "..\\\\faces"
        # 遍历目录下的所有文件,得到所有文件名字
        for root, dirs, files in os.walk(path):
            for file in files:
                filename = os.path.join(root, file)
                if file.endswith("jpg"):
                    kimg = face_recognition.load_image_file(filename)
                    # 把图像转为矩阵
                    kimg_encoding = face_recognition.face_encodings(kimg)
                    if len(kimg_encoding) > 0:
                        firstencoder = kimg_encoding[0]
                        luruimgs.append(firstencoder)
                        name = file.split(".")[0]
                        xuehao = filename.split("\\\\")[-2]
                        # 格式:学号,姓名
                        lurunames.append(xuehao + "," + name)
        # print("--",lurunames)
        self.vcap = cv2.VideoCapture(0)
        while self.running:
            ok, frame = self.vcap.read()
            rgbimg = frame[:, :, ::-1]
            # 检测人脸
            v_face_pos = face_recognition.face_locations(rgbimg)
            # 人脸编码生成矩阵
            v_face_encoding = face_recognition.face_encodings(rgbimg, v_face_pos)
            for face in v_face_encoding:
                # 比较摄像头人脸和已录入的人脸
                matcher = face_recognition.compare_faces(luruimgs, face, 0.6)
                # 距离
                face_dist = face_recognition.face_distance(luruimgs, face)
                # 取出最短距离
                small = np.argmin(face_dist)
                if matcher[small]:
                    facename = lurunames[small]
                    # 避免重复添加
                if facename not in self.vnames:
                    self.vnames.append(facename)
                    self.ats.append(facename + "," + str(datetime.now()))
                # print(facename)
            # 合并数组
            templist = zip(v_face_pos, self.vnames)
            # 把摄像头看到的所有人的名字显示在图像区
            for (top, right, bottom, left), name in templist:
                cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 30), 2)
                cv2.rectangle(frame, (left, bottom - 30), (right, bottom), (20, 20, 255), 2)
                img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
                draw = ImageDraw.Draw(img)
                font = ImageFont.truetype("simkai.ttf", 30, encoding="utf-8")
                # 显示人名
                draw.text((left + 20, bottom - 30), name.split(",")[1], (20, 20, 255), font=font)
                frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB)
            self.showHead(frame)
            # 点击开始打卡按钮
            if self.startattend:
                self.fillData()
        self.vcap.release()

三、环境安装实例

Anaconda!真的好用!

1.下载python对应版本的dlib

你想要的dlib版本这里都有

然后pip install dlib -........whl(install后面为你下载的dlib的文件名)

pip install Cmake

2.安装opencv-python

pip install opencv-python

3.安装face_recognition

 pip install face_recognition

 4.安装pyqt5

pip install pyqt5

5.安装mysqlclient

pip install mysqlclient

四、需要源码私信并call邮箱lij867967@gmail.com

至此,结束!

小猿写的第一篇博客,写的不好还请担待

Python基于人脸识别的智能考勤系统(Pyqt5+MySQL+Opencv) [PC端部分-已附源码]

【Python】基于人脸识别的考勤系统 [PC端部分]


一、项目简介

本项目编程语言Python3.6,编程工具pycharm,其他工具QT Designer、Navicat,表单信息保存在本地MySQL数据库中,人脸识别算法主要用的OpenCV。

目前,已实现以下功能:

--------------------------------------------------------------------
一、【管理系统主界面】
1、管理系统主界面实现相对布局。

(一)输入部分
1、考勤班级:限制输入8位考勤班级编号。
2、考勤课程:限制输入中文/数字/大写字母。
3、考勤地点:
      2.1 教学楼:限制四选一:“仁智/同和/浦江/厚学”。
      2.2 教室号:限制输入大写字母/数字/-”,最大长度6位。
4、禁止请假:
      3.1 单选框,默认不选中。
      3.2 选中且确定后,"个人请假"按钮不开放。
5"确定"按钮:
      5.1 确认班级/课程/地点的输入合法性。不合法,则清空输入框内容。
      5.1 确认该班级当天是否有该课程的教学计划。不存在,则弹出提示框。
      5.2 检测“禁止请假”复选框选中状态。
      5.2 刷新Lcd/“已签到人员”表格/“迟到/请假人员”表格。
      5.3 锁定输入框和复选框,解锁前禁止编辑。
      5.4 开放“考勤签到”“个人请假”功能。
6、“解锁”按钮:
      6.1 “确认”前,“解锁”按钮无法点击。
      6.2 “确认”后,“解锁”按钮开放。
      6.3 点击事件:--->跳转至“管理员权限验证页面”。

(二)显示部分
1、表格控件:“已签到人员”和“迟到/请假人员”。
     1.1 已签到人员:2位学号-中文姓名-签到时间。
     1.2 迟到/请假人员:状态-2位学号-姓名-签到时间。
2、Lcd控件:"应到/已到/请假"人数。

(三)按钮部分
1、“考勤签到”:
       1.1 Qlabel显示摄像头视频。
       1.2 人脸检测--->框出人脸,打印身份--->15帧人脸检测图像保存一次--->三次检测结果一致--->二次验证,用户本人确认--->通过后刷新数据库表单/界面表格/LCD控件--->关闭窗口。
       1.3 数据库:录入信息--->执行"签到状态判别"函数:判别当天该课程所有的签到时间对应的签到状态---(签到状态:未验证-0”,成功-1”,迟到-2”,请假-3”)
2、“个人请假”:
       1.1 Qlabel显示摄像头视频。
       1.2 人脸检测--->框出人脸,打印身份--->15帧人脸检测图像保存一次--->三次检测结果一致--->二次验证,用户本人确认--->通过后刷新数据库表单/界面表格/LCD控件--->关闭窗口。
       1.3 数据库:录入信息--->执行"签到状态判别"函数:判别当天该课程所有的签到时间对应的签到状态---(签到状态:未验证-0”,成功-1”,迟到-2”请假-3”)
3、“登录/注册”--->跳转至“登录/注册”页面。
4、“退出程序”--->关闭整个系统页面。

(四)【管理员权限验证页面】【一级子页面】【QDialog类】
1、页面采用绝对布局。
2、账号、密码输入框:输入无限制。
3、登录:
     3.1 验证通过,解锁成功,关闭本窗口,返回主界面。
     3.2 验证失败,关闭本窗口,返回主界面。
4、退出:关闭本窗口,返回主界面。


--------------------------------------------------------------------
二、【登录注册界面】---->(登录页面\\注册页面)
1、登录注册页面均采用绝对布局,禁止用户放缩界面大小。
2、登录界面初次加载时,加载上次登录时的选框状态和用户信息。
3、登录注册页面输入框均设置提示信息,优化用户体验。

(一)登录界面
1、用户名:限制输入数字和英文。
2、密码:限制输入长度6-10位,首字母大写,密码组成字母数字。
3、记住用户名:
     3.1 可单独勾选。
     3.2 勾选时,下次加载登录页面时自动加载上次登录用户名。
     3.3 本地.pkl文件保存上次登录“用户名”。
     3.4 “登录”按钮被点击时,保存选项框选中状态。
4、记住密码:
      4.1 勾选时,“记住用户名”也被标记勾选。
      4.2 勾选时,下次加载登录页面时自动加载上次登录的用户名和密码。
      4.3 本地.pkl文件保存上次登录的“用户名和密码”。
      4.4“登录”按钮被点击时,保存选项框选中状态。
5、自动登录:
      4.1“登录”按钮被点击时,保存选项框选中状态。
      4.2  弹出登录页面时,自动加载信息。 
6、“注册”按钮--->跳转至注册界面。
7、登录按钮:
     7.1 验证管理员身份,跳转至管理员界面。
     7.2 验证用户身份,跳转至用户界面。
           7.2.1 检索前8位班级编号
                   A. 未检索到该“班级编号”表单,检索班级管理表单。
	      a. 班级管理表单中存在该班级词条,则新建该“班级编号”的表单,提示前往注册。
	      b. 班级管理表单中不存在,提示联系管理员。
           7.2.2 存在该班级编号的表单,验证用户设置的密码。

(二)注册界面
1、用户ID:输入限制为数字。
2、用户密码:
     2.1 输入限制为610位数字字母,首字母大写。
     2.2 首次输入明文显示,焦点转移后掩码显示。
3、重复密码:
     3.1 首次输入明文显示,焦点转移后掩码显示。
     3.2 焦点转移后验证两次输入密码的合法性,不合法则清空密码输入框内内容。
           3.2.1 密码长度610位。
           3.2.2 两次密码的一致性。
4、姓名:限制输入中文。
5、英文名:限制输入英文,用于人脸识别打印出身份判定结果。
6、性别:“男/女”二选一选项框。
7、以上表单均填入信息后,开放“注册”按钮。
8、注册功能:
     8.1 检索“用户ID”前8位班级编号的表单。
     8.2 不存在,则检索班级管理表单,存在词条,则新建该“班级编号”表单(某班级的首位注册用户)。
     8.3 存在,则验证“班级管理”内设定的该班级用户的信息格式。
     8.4 格式合法,则用户信息录入该“班级编号”表单,提示注册成功。

--------------------------------------------------------------------
三、【管理员界面】---->(班级管理\\课表管理\\统计分析)
1、目前仅设置单一管理员权限账号。
2、全页面实现支持相对布局。

(一)班级管理页面:【一级子页面】
1、表单未全部填写时,“保存设置”按钮无法点击。
2、所带班级:限制输入专业简称(2位中文)+数字(4位)。
3、班级编号:限制输入8位纯数字。
4、班级人数:限制输入长度3位数。
5、用户ID-Num:限制二选一。
     5.1 “仅固定ID”:用户注册时限制前8位班级编号,尾号数字不限。
     5.2 “固定ID-Num”:用户注册时限制尾号数字小于等于“班级人数”。
6、签到开始时间:开放三选一设置,上课“前20\\15\\10分钟”。
7、签到结束时间:开放二选一设置,下课“前5\\0分钟”。
8、保存设置时:
     8.1 点击后,检索数据库是否存在‘lessontable’,不存在,则新建该表单并完成初始化。
     8.2 检查是否存在同编号班级数据,如无(有)班级数据,新建(覆盖)表单数据。
9、查看班级:【二级子页面】
     9.1 页面支持相对布局。
     9.2 表格显示字段:“班级编号”“班级名称”“班级人数”
                                  “Id格式”“签到开始时间”“签到结束时间”。
     9.3 表格数据以“班级编号”为主键,升序排列。
     9.4 页面弹出时刷新一次,支持“手动刷新”表格数据。
     9.5 支持班级管理表单“导出表格”至本地Excel文件,Excel文件名--->“classtable”。
     9.6 支持以“班级编号”为索引,删除表格中的整行数据。
     【注】以上功能数据处理均基于数据库表单操作实现。

(二)课表管理页面:【一级子页面】
1、课程名称限制输入:中文/英文/数字。
2、班级编号限制输入:8位纯数字。
3、开课结课时间限制:开课时间不得晚于结课时间。日历弹出显示。
4、上课下课时间限制:上课时间不得早于下课时间。日历弹出显示。
5、课程设置周课表:开放多选框“周一/周二/周三/周四/周五/周六/周日”。
6、输入框、复选框未全部有数据填写时,“保存设置”按钮无法点击。
     6.1 点击后,检索数据库是否存在‘lessontable’,不存在,则新建该表单并完成初始化。
7、查看课表:【二级子页面】
      7.1 页面支持相对布局
      7.2 表格显示字段:“班级编号”“课程名称”“开课日期”“结课日期”
                                   “一周课表”“上课时间”“下课日期”。
      7.3 表格数据以“班级编号”“课程名称”为联合主键,升序排列。
      7.3 页面弹出时刷新一次,支持“手动刷新”表格数据。
      7.4 支持班级管理表单“导出表格”至本地Excel文件,Excel文件名--->“lessontable”。
      7.5 支持以“‘班级编号课程名称’”为联合主键,删除表格中的整行数据,并同步修改到数据库。

(三)统计分析页面:【一级子页面】
1、“查询班级-必填”:
       1.1 限制输入:8位出数字。
       1.2 有输入时,开放“查询”“刷新”按钮。
2、“查询课程-选填”限制输入:中文/英文/数字,12位。
3、“查询日期-选填”:
       3.1 初始显示“2000/1/1”,输入日期不为“2000/1/1”时有效。
4、邮箱地址:正则表达式匹配,能覆盖大部分邮箱地址格式的检测。
5、发送至邮箱:
     5.1 发件邮箱默认为QQ邮箱,需要邮箱开启SMTP服务设置。
     5.2 支持自动导入用户本地TXT文件保存的“账号-16位授权码”。
     5.3 “发件邮箱"" 授权码”各单行保存到“./autoLoginFile”文件下的“QMailSMTP.txt”内。
     5.4 单击执行一次“发送至邮箱”后,上述文件夹内生成“QMailSMTP.pkl”文件后,即可删除“QMailSMTP.txt”文件。

--------------------------------------------------------------------
四、【用户界面】---->(个人信息\\班级课表\\签到日志)
1、实现用户身份判别,根据登录用户加载不同表单数据功能。
2、全页面实现支持相对布局。

(一)个人信息页面:【一级子页面】
1、班级编号:弹出页面时,自动加载,用户不可修改。
2、班级人数:弹出页面时,自动加载,用户不可修改。
3、个人ID:弹出页面时,自动加载,用户不可修改。
4、重置密码:
     4.1 密码1:输入时明文显示,鼠标焦点转移后掩码显示。
     4.2 密码2:输入时掩码显示。
     4.3 密码输入限制:首位限制大写字母,限制长度6-10位,密码组成限制英文、数字。
     4.4 密码输入框未全部填写时,“重置密码”按钮无法点击。
     4.5 密码1|2提示框警告场合:长度非法,两次输入不一致。
5、注销账号:支持用户注销账号,删除账号所有签到记录。
     5.1 删除关联的签到记录【功能未激活】
     5.2 注销操作前用户须再次确定。
6、更新面部数据:
      6.1 打开摄像头,检测人脸,拍摄30张图片后关闭摄像窗口。
      6.2 该“班级编号”表单内该用户的面部数据录入标志位“checked”置“是”。
      6.3 自动重新训练该班级的“人脸检测样本”。
8、更换头像:
      8.1 打开摄像头,空格键按下时拍摄用户面部图像。
      8.2 文本框内居中显示,彩色图像。
      8.3 关闭摄像头后,立即更新头像QLabel内容。

(二)班级课表页面:【一级子页面】
1、班级编号:初次加载页面时,自动加载。
2、课表表格:
      2.1 显示字段:“班级编号”“课程名称”“开课日期”“结课日期”
                                   “一周课表”“上课时间”“下课日期”。
      2.2 同步显示数据库数据lessontable表单内容。      
      2.3 支持“导出表格”到本地Excel,Excel文件名--->“班级编号_lessontable”。
3、支持“手动刷新”表格数据。

(三)签到日志:【一级子页面】
1、表格控件:“签到日志”“迟到记录”。
2、LCD显示控件:“出勤次数”“迟到次数”“请假次数”“出勤率”。
3、支持“导出表格”到本地Excel,Excel文件名--->“用户学号__signdata”。
3、支持手动刷新表格数据。
--------------------------------------------------------------------

二、系统前端设计

管理员权限验证”和登录注册页面由于布局相对固定,所以自己手敲的。其他布局因为过程中经常要变动,所以借助了QT Designer。

(一)系统主界面

1、主窗口
(1)初始页面

(2)保存设置/解锁输入

(3)考勤签到

(4)个人请假

2、管理员权限验证页面
(1)基础页面

(2)基础页面

(二)登录/注册页面

各个页面的小操作太多,录了上面的几个小视频后就不想录了…饶了我吧…/doge

(三)管理员页面

1、班级管理页面
(1)基础页面

(2)查看班级页面

2、课表管理页面
(1)基础页面

(2)查看课表页面

3、统计分析页面
(1)基础页面

(2)查询 + 打包发送本地Excel到目标邮箱

(四)用户页面

(1)登录跳转

(1)个人信息页面

(1)班级课表页面

(1)签到日志页面


三、数据库设计

本地安装的MySQL版本号为 8.0.23,调试过程中,使用的是Navicat进行诸如“查看表单是否插入成功”等调试工作的。

MySQL和Navicat的安装教程CSDN上就有很多,我就不介绍了,直接贴出一些有用的链接吧。

1、MySQL相关

(1)我的MySQL版本号

(2)MySQL相关安装指导

这3个教程我都看了一下,相互对照着弄的,一遍过,但好像都没完全完整地照某一个教程单独地弄。(/doge)

2、Navicat相关

看的安装(PouJie)教程好像是这个。

遇到了一次Navicat显示中文乱码的问题,后续解决了。(我印象中好像是在设置里编码改成“auto”好像/doge)

3、表单相关

(1)表单初始化说明

以下所有表单在程序中都实现了自动检索和初始化所需要的表单。
各位后续下载了代码,运行前,只需要 确保本地存在一个名为’mytest’的数据库 就行了。
哦,对了,代码中数据库的验证密码是"jixinye",如果本地之前不存在MySQL数据库,安装的时候可以直接设置密码为"jixinye",这样省的在到程序里去改pymysql的连接参数了。/doge

(2)表单说明(举例说明,其他情况类推)

  • “班级编号 ”:14021702

    • 保存一个班级的学生信息。
  • “班级编号_signdata ”:14021702_signdata

    • 保存一个班级的学生的签到数据。
  • “classtable”表单

    • 保存所有班级的基本属性。
  • “lessontable”表单

    • 保存所有班级的教学计划的基本属性。

(3)导出表格:保存至本地目录下的Excel文件


四、后续下载后需要更改的参数

(1)数据库的连接密码

  • 程序中pymysql的连接密码为:jixinye

    • 程序中所有“jixinye”词条统一替换成"%s"(你的本地数据库密码)

(2)用户页面的“发送至邮箱”功能

  • 项目目录 . / d e m o 1 / a u t o L o g i n F i l e ./demo1/autoLoginFile ./demo1/autoLoginFile下初始状态应该是只有 “auto.pkl”、“login.pkl”和“QMailSMTP.txt”文件。
    • 各位小伙伴,只需要在 “QMailSMTP.txt”中分别写上自己的QQ邮箱地址和16位SMTP授权码,保存退出。
    • 在管理员页面运行一次“发送至邮箱”,本地出现“QMailSMTP.pkl”文件后,就可以删除自己的“QMailSMTP.txt”了。


五、我的“待完善功能”/doge

(一)待补充功能

这是我毕设的一部分内容,起初的任务设定是在树莓派上实现上述效果的。奈何树莓派性能支棱不起来(效果不好),如果一开始就确定在PC端做的话,可以用深度学习来提升人脸识别的性能表现,也不用为了轻量而选择用OpenCV来做了。

现在只是在PC端上实现了基于人脸识别的考勤功能。(我们还是得想办法和树莓派攀上点关系/doge)

目前我还没有什么比较好的思路,各位小伙伴有什么好的建议的话,可以在评论区评论(万分感激)!!

  • 用socket在树莓派和PC间进行视频传输,PC判断结果保存到本地数据库,返回签到信息至树莓派??PC做一个上位机?

  • 树莓派拍照保存人脸信息,一个班考勤签到时每个人进门时拍张照片(一个学号一张照片),空闲时(无考勤任务)或者晚上22点时把图片push到gitee仓库,PC(服务器)22点半把图片拉到本地进行判别??(但这就需要树莓派和PC(服务器)定时进行数据库班级表单信息的同步)

    • 如果是上述思路,可以用阿里云RDS数据库和自建数据库做主从同步,把数据库从PC机上独立出来,本地只在需要时从云上同步数据到本地。
  • 我还没想好怎么让它和树莓派发生关系…

(二)待完善功能

  • 数据库优化:

    • 部署到云,如阿里云RDS数据库。
    • 结构优化:目前各个表间各自独立,删除操作(如,用户的“注销账号”)并不能同步删除所有表单的相关词条内容。
  • 整体架构:

    • 软件部署到服务器上,把目前的系统做成一个客户端软件,一些功能交由服务器去运行。

    • 如用户面部图片的保存,客户端-服务器-树莓派三者间的数据传输等等。

  • 活体检测:因为因为用的OpenCV的Haar分类器做的人脸检测,没办法做到活体检测,是个缺陷。

  • 更新面部数据:用户面部数据的输入除了在“用户页面”自己拍照导入,管理员想管理,只能到相应的班级面部数据文件夹下去进行操作。(增删查改之类的)

  • 实际应用场景:可以用微信小程序或者用户扫描二维码来完成“用户”的面部数据上传工作。

  • 可能还有其他一些没有考虑到的问题,希望相关专业的朋友在评论区提出一些专业性的意见。

六、对想上手的小白的学习建议

先推荐一些视频课程吧。

  • Pymysql数据库 Python操作数据库如此的简单.

    • 这个大概了解就好了,我程序只用到一些基本的增删查改,视图、事务什么的都没用到,多留意一下Navicat的使用方法,上手应该很快。
  • python高级进阶教程-PyQt5部分.

    • 这位UP主的好像有配置anaconda、pycharm、Qtdesigner的视频,对小白很友好。
    • Qt部分的视频看到【010Qt网格布局XXXXXX】部分就可以上手做一些小的界面了,剩余的知识点可以等以后在自己的小项目中需要用到再学。
  • B站讲的最好的opencv计算机视觉课程.

    • B站有很多好的OpenCV的课程,大家各自挑着看看好了【别被上面这个标题唬住,up主自己取的,跟我没关系】。

6月3日–更新:

最新主界面效果图:

后续树莓派承担的工作内容是对输入图像的预处理以及编码压缩,最终通过UDP协议传输数据到PC机服务端。附录的源码中未给出树莓派端的代码,但PC端能独立实现所有的考勤功能。


源码仓库地址:

小玩意,不会做,瞎写的,别喷我。/doge /狗头保命

以上是关于Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 + Python3.7 + OpenCV人脸识别身份认证系统(附源码)

附源码基于OpenCV的Python人脸识别

附源码基于OpenCV的Python人脸识别

附源码基于OpenCV的Python人脸识别

Python OpenCV开发MR智能人脸识别打卡系统(三工具模块设计)

Python OpenCV开发MR智能人脸识别打卡系统(四服务模块设计)