Python人脸识别考勤系统实战:从深度学习算法到PyQt5界面开发

发布时间:2026/10/19 11:07:26

Python人脸识别考勤系统实战:从深度学习算法到PyQt5界面开发 简介面向计算机相关专业本科生及需要项目实战经验的学习者这套基于深度学习的人脸识别考勤系统源码针对课堂与企业考勤场景中的人脸检测、特征提取、身份比对与签到记录问题提供了完整可运行的毕业设计实现评审分为98分。压缩包共25个文件以Python程序文件为核心包含界面测试脚本、API接口、配置信息、字体图标等支撑资源另附使用手册和打包好的可执行软件整体约239MB结构与文件类型覆盖了从开发到部署的各个环节。目前已有166人学习浏览适合在校学生作为课程设计、期末大作业或毕业设计的高分参考。整套源码不仅展示人脸识别与考勤系统前后端联动逻辑还附可直接运行验证的软件包、界面素材和相关图文文档便于理解实现思路后快速二次开发。1. 人脸识别考勤系统决定拿它做毕设前先看这三个点每个毕设季都会有一批人抽到「人脸识别考勤」这个题目打开搜索框满屏都是教程真到答辩那天能现场演示成功的却没几个。这套基于深度学习的人脸识别考勤系统 Python 源码是我见过为数不多「从摄像头到数据库全链路闭环」的本科毕业设计界面用 PyQt5 绘制完整后台识别层走深度学习模型做人脸检测与特征比对考勤记录落到 SQLite还附带使用手册和打包好的软件。评审 98 分说明代码完成度和论文支撑材料都经得起现场拷问。适合正在做 Python 毕业设计、课程设计或期末大作业的学生也适合想找一个带 UI 的真实项目练手的学习者。2. 系统架构从摄像头取帧到考勤入库中间经过了哪几层2.1 技术选型PyQt5 OpenCV 深度学习模型的组合为什么稳这套系统的技术栈不是随手拼的。界面层用 PyQt5从根目录的Ui_test_01.py能看出来这是 Qt Designer 导出的命名习惯摄像头采集交给 OpenCV 的 VideoCapture人脸检测与特征提取走的是基于深度学习的预训练模型数据层直接用 SQLite 单文件库免安装答辩现场不怕数据库连不上。各组件和源码的对应关系如下表层级源码位置职责界面层Ui_test_01.py static/登录、主窗口、视频区、人员列表渲染识别层face.py api/人脸检测、特征提取、比对打分数据层config attendance.db学生信息、考勤记录、签到状态资源层static/ msyh.ttf背景图、控件切片、中文字体PyQt5 在这个场景里是「最不折腾」的选择。相比 Tkinter 的简陋和 Web 方案需要起的 Node 服务PyQt5 自带 QTimer、QLabel 和样式表配合 static 目录里做好的背景图、按钮切片能把界面做到接近商用后台的观感这是拿高分的一个重要加分项。人脸部分用预训练模型的另一个好处是特征向量是 128 维的特征库只存 numpy 数组几十个人的班级跑起来毫无压力。2.2 目录结构解压之后每个文件怎么用拿到压缩包解压后第一层是face-master/里面才是工程本体典型 git 仓库导出结构。工程根目录下有几个值得先说清楚的东西文件/目录作用Ui_test_01.py主程序入口运行它启动系统face.py人脸识别核心封装检测、编码、比对都在这里api/业务接口层登录、考勤、人员管理的逻辑封装config配置文件摄像头编号、识别阈值、数据库地址static/UI 静态资源背景图、视频区域蒙版、人员列表装饰msyh.ttf微软雅黑字体解决 PyQt5 中文显示乱码手册.docx图文使用手册答辩和二次开发都能用到back/旧版本代码备份.gitignoregit 忽略规则back/这个目录说明作者有版本管理习惯论文里常写的「系统经过多次迭代」至少不是空话。真正运行起来后根目录下还会多出attendance.db和已录入的人脸特征文件这些在.gitignore里被排除不会污染仓库。static 目录值得单独说一嘴。png 素材分两类一类是窗口整体背景比如llz_background.png另一类是控件切片比如llz_video_rect.png是视频显示区域的描边llz_user_list_bg.png是右侧人员列表的背景。二次开发时想改界面风格直接替换对应文件就行不用动代码。2.3 数据流一次考勤从摄像头到数据库经历了什么把一次完整签到拆开看流程是这样的。用户在界面点击「开始考勤」摄像头实时采集每一帧先过人脸检测器圈出人脸位置对目标区域做对齐和编码得到一个 128 维特征向量拿这个向量和特征库里的已知人脸逐一算欧氏距离距离最小的那个且低于阈值的名字就是识别结果最后查数据库判断今天是否已经打过卡没打过就写入一条签到记录界面右侧的人员列表同步刷新状态。这个过程对应到源码里大致是这样# 帧处理主循环对应 Ui_test_01.py 里的定时器槽函数 def on_frame(self, frame): rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) boxes face.detect(rgb) # 1. 检测人脸位置 encodings face.encode(rgb, boxes) # 2. 提取特征向量 for enc in encodings: name, score face.compare(enc) # 3. 与特征库比对 if name: self.attendance_service.check_in(name) # 4. 写考勤记录 self.user_list_widget.refresh(name) # 5. 刷新界面这里有个容易被忽视的参数比对结果返回的不只是人名还有一个距离分数score。这个分数决定了识别严格程度调太小会出现「真人站在摄像头前也认不出来」调太大又会出现「照片也能打卡成功」。config里默认给了一个中间值具体怎么调放到避坑章节展开。3. 核心模块拆解界面、识别、考勤三条主线各写了什么3.1 主程序 Ui_test_01.py摄像头刷新与界面更新怎么配合主程序最值得看的部分不是画界面的几百行代码而是摄像头刷新机制。作者没有用while True循环读帧因为那样 UI 会卡死也没用多线程因为线程间往 QLabel 塞图像容易出线程冲突。合理的做法是用 QTimer 定时器每 30 毫秒触发一次读帧和刷新这也是 PyQt5 视频应用的标准写法。class AttendanceWindow(QMainWindow): def __init__(self): super().__init__() self.cap cv2.VideoCapture(config.CAMERA_INDEX) # 打开摄像头 self.timer QTimer(self) self.timer.timeout.connect(self.update_frame) self.timer.start(30) # 约 33fps def update_frame(self): ok, frame self.cap.read() if not ok: return frame cv2.flip(frame, 1) # 镜像拍出来才自然 faces face.detect(frame) for (top, right, bottom, left) in faces: cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2) self.video_label.setPixmap(convert_to_pixmap(frame))两个重点注释解释一下。一是CAMERA_INDEX笔记本内置摄像头一般是 0外接 USB 摄像头有可能是 1 或 2跑起来黑屏先改这个数。二是cv2.flip(frame, 1)不镜像的话画面里你抬手左边屏幕里往右边动录入人脸特征的样本也会跟着歪直接影响识别准确率。convert_to_pixmap是作者封装的一个图像转换工具函数把 OpenCV 的 BGR 数组转成 QPixmap 显示到界面上。3.2 face.py人脸检测与特征提取的核心封装face.py 是整个项目里含金量最高的文件。它把检测、编码、比对三步各自封装成独立函数上层界面代码不关心模型细节只要拿到一张脸的位置和一组特征向量就行。这种「界面不碰模型」的分层答辩时老师问起代码结构会很好讲。# face.py —— 检测与编码封装 import face_recognition def detect(rgb_frame): # 调用基于深度学习的人脸检测模型返回 (top, right, bottom, left) 列表 return face_recognition.face_locations(rgb_frame, modelcnn) def encode(rgb_frame, boxes): # 对每个检测到的人脸区域提取 128 维特征向量 return face_recognition.face_encodings(rgb_frame, boxes) def compare(encoding, known_encodings, names): # 计算当前人脸与库中所有已知人脸的距离 distances face_recognition.face_distance(known_encodings, encoding) best_idx int(np.argmin(distances)) if distances[best_idx] config.MATCH_THRESHOLD: return names[best_idx], float(distances[best_idx]) return None, None三个函数的参数说明。detect的modelcnn是关键参数face_recognition 库默认用 HOG 检测器轻快但精度一般换成cnn走的是深度学习卷积网络检测更准代价是每帧耗时高一些。答辩现场机器配置不太差的话建议保持cnn识别框会更稳定。compare用face_distance而不是compare_faces这个细节很多同类项目没处理好。compare_faces返回的是布尔值列表你拿不到距离也就没法做阈值调节用face_distance拿到的是实打实的欧氏距离既可以排序取最近又可以拿阈值过滤。known_encodings是一个二维 numpy 数组形状是(人数, 128)每行代表一个人的特征程序启动时从已录入的人脸照片里批量生成。班级规模在 50 人以内时这个线性扫描的速度完全够用。3.3 考勤业务签到、签退与防重复打卡识别出人之后业务层要处理的是「这个人今天能不能打卡」。api 目录下的考勤接口做了三件事查重、插入、返回结果。查重逻辑是防重复签到的关键同一人同一天同一方向只能有一条记录。# api/attendance.py —— 考勤记录写入 def check_in(student_id, directionin): now datetime.now() today now.strftime(%Y-%m-%d) row db.execute( SELECT id FROM attendance WHERE student_id? AND date? AND direction?, (student_id, today, direction), ) if row: return {code: 1, msg: 今日已签到请勿重复} db.execute( INSERT INTO attendance(student_id, date, time, direction) VALUES(?,?,?,?), (student_id, today, now.strftime(%H:%M:%S), direction), ) return {code: 0, msg: 签到成功, time: now.strftime(%H:%M:%S)}这段代码用一个三元组(student_id, date, direction)作为查重条件把签到和签退看成两个独立方向这样「上午签到 下午签退」就能一天写两条记录。返回值带code字段界面拿到 0 才刷新状态拿到 1 就弹提示业务逻辑和界面展示彻底分开。后面想加「迟到判定」只需要在插入前比较time和课程开始时间完全不用动识别模块。4. 运行步骤从一台干净机器到成功打卡4.1 环境准备Python 版本与依赖清单这套系统依赖的第三方库不多但版本要选对。Python 建议 3.8 或 3.9太新的版本在装 dlib 时容易遇到编译问题。推荐用 conda 建独立环境避免污染本机其他项目的包conda create -n face_attendance python3.8 conda activate face_attendance pip install pyqt5 opencv-python face_recognition numpyface_recognition是这里最重的依赖它内部依赖 dlib而 dlib 在 Windows 上默认走源码编译经常会因为缺少 C 工具链而翻车。如果安装报错先把cmake装上再装 Visual Studio Build Tools然后重新执行 pip install。在 Linux 服务器上跑的话记得先装libgl1和libglib2.0-0否则会有 OpenCV 的 so 文件加载报错。依赖全部装好后在命令行执行python -c import face_recognition, cv2, PyQt5验证一次不报错再进下一步。4.2 配置项摄像头编号、识别阈值与数据库路径config 是启动前唯一需要动的文件。默认内容大概是这几项CAMERA_INDEX 0 # 摄像头编号内置为 0外接改 1 或 2 MATCH_THRESHOLD 0.45 # 识别距离阈值越小越严格 DATABASE_PATH attendance.dbMATCH_THRESHOLD是验收时最容易翻车的参数。0.45 是一个比较均衡的起步值正常光线能稳定识别如果你在实验室演示光线偏暗建议先调到 0.5识别优先于防误判如果现场有人拿照片试你系统再往回调小到 0.4。注意DATABASE_PATH是相对路径程序启动时会自动在根目录创建attendance.db不要手动建空文件否则表结构会冲突。4.3 启动与首次点名把第一张人脸录进系统环境配好、config 改完就可以启动了python Ui_test_01.py提示启动后如果发现摄像头画面出不来先在命令行单独跑一段验证代码确认是摄像头编号问题还是软件层问题别急着改代码。首次使用流程一般是进入「人员管理」添加学生姓名和学号录入一张正面照片程序用 face.py 里的 encode 函数生成特征向量存进特征库回到主界面点击「开始识别」站在摄像头前识别通过后界面右侧列表对应名字会从灰色变成已签到状态。系统里附带了一份打包好的软件压缩包如果你只想先看演示效果不折腾源码直接解开那个包也能跑。根目录的手册.docx 是图文版操作说明答辩前通读一遍里面的截图流程和论文里的使用说明是能对上的。启动后如果发现摄像头画面出不来先跑一行命令定位python -c import cv2; capcv2.VideoCapture(0); ok, fcap.read(); print(ok)输出 True 说明摄像头本身没问题问题在软件层回到 4.2 改配置输出 False说明摄像头被占用或编号不对把 0 改成 1 再试。5. 常见坑与排查识别不准、起不来的五个踩坑记录5.1 摄像头黑屏QTimer 里读帧读不到数据现象是软件能起来界面能显示但视频区域一直是黑的。原因是cv2.VideoCapture打开失败后不会报错只是每次read()返回(False, None)程序对失败没有显式提示画面就一直空着。通常是摄像头编号错了或者摄像头被其他软件占用。解决办法先跑上一章给的那行验证命令确认是返回 False 还是画面翻转问题如果是编号问题改config.CAMERA_INDEX如果是被占用关掉所有会调用摄像头的程序再重启系统。5.2 dlib 装不上Windows 编译报错现象是pip install face_recognition在安装 dlib 时中断日志里出现一大堆 C 编译错误。原因很直接Windows 上 dlib 没有现成的 wheel 包pip 只能现场编译系统里又缺对应的 C 编译工具链。解决办法分三步先pip install cmake再安装 Visual Studio Build Tools勾选 C 桌面开发最后重新pip install dlib。如果还报错看看 Python 版本是不是超过 3.9换个 3.8 的环境基本能解决。这是整个项目最大的环境坑建议所有人先装好依赖再跑主程序。5.3 界面中文全变方块msyh.ttf 没被加载现象是按钮和列表能显示但所有中文文字都是方框。这是 PyQt5 在中文系统下的老问题控件的默认字体族在渲染时找不到中文字体。项目的 static 目录里特意放了 msyh.ttf 就是为了处理这个。正确做法是在 QApplication 创建后手动加载字体文件而不是依赖系统字体# 主程序启动处 QFontDatabase.addApplicationFont(static/msyh.ttf) app.setFont(QFont(Microsoft YaHei, 10))如果你的二次开发版把 static 目录改名或移了位置这条路径就会失效所以尽量保持目录结构不变。出现方块时先检查字体文件路径是不是还在原位。5.4 识别忽高忽低阈值与光线条件的博弈现象是同一个人上午识别秒过下午站同一个位置却识别失败。原因有两个一是光照变化导致人脸特征波动二是固定阈值在这个波动区间的边缘。人脸特征距离不是一成不变的侧脸、逆光、戴眼镜都会让距离变大。解决办法不是反复调阈值而是先固定识别环境——正对摄像头、面部受光均匀、不要戴遮挡物。环境稳定后再根据多次实测距离取一个中间值写进 config。如果还是经常误判把录入的照片换成现场环境下拍的照片比调阈值有效得多。5.5 考勤记录丢失attendance.db 文件被误删现象是某天发现前几天签到记录没了或者软件启动时报数据库表不存在。原因是 SQLite 的库文件在项目根目录很多人在清理临时文件时把它当垃圾删了或者拷贝项目时只复制了源代码没带 db 文件。解决办法源文件目录保持完整备份时连同 attendance.db 一起打包如果表结构真的丢了api 目录里的初始化函数会自动重建空表重新录入人员并恢复照片即可。平时养成习惯每次跑完把 db 文件手动备份一份我在这上面吃过亏当晚要生成统计报表时发现库里空了一半。6. 二次开发思路把别人的毕设改成自己的系统6.1 换成自己的班级名单和照片拿到源码第一步不是跑起来而是先清空演示数据。把特征库目录里旧的.dat或.npy文件删掉在「人员管理」里重新添加自己班级的学生。照片建议用手机在正常光线下拍正面照每个人单独一张。录入后会生成新的特征向量覆盖旧的即可。如果班级人数多我一般会在 api 层加一个批量导入接口用 pandas 读 Excel一次导入几十个学生省得手动一条条加。6.2 改界面风格与品牌static 目录里的背景图、列表装饰图全部可以直接用 Photoshop 替换成自己学校的风格代码不需要动。改窗口标题注意主程序里setWindowTitle那一行把默认的「人脸识别考勤系统」改成自己的项目名。答辩演示时界面配色统一、带学校 logo 的系统观感上比默认模板高一个档次。6.3 增加导出与统计功能对毕设来说加一个「按日期导出考勤明细」的功能是性价比最高的加分项。实现很简单在 api 层加个查询把数据写成 CSV# api/export.py —— 导出某天考勤明细 def export_csv(date_str): rows db.query( SELECT student_id, time, direction FROM attendance WHERE date?, (date_str,)) with open(fattendance_{date_str}.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([学号, 时间, 方向]) writer.writerows(rows)编码用utf-8-sig而不是utf-8这样用 Excel 打开导出文件时中文不会乱码这个小细节经常让答辩老师眼前一亮。如果不需要 CSV也可以在主界面下方加一个日期选择器按天查询记录。生成的文件放在项目根目录答辩时直接展示导出的 Excel 表格比当众敲数据库命令直观得多。说实话这套代码最值得学的地方不是某个算法多高明而是「界面、识别、数据」三层分得很清楚。从那以后我自己接手别人的项目都会先照这个思路理一遍各层边界再动手改而不是一头扎进某个文件里到处找逻辑改到一半发现牵一发动全身又没法回退。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/19 11:02:21

DSP28377D CAN通信调试指南:位定时、MOB配置与中断排查

简介:本资源是一套面向嵌入式开发初学者与DSP应用工程师的TMS320F28377D CAN通信实战代码包,聚焦工业自动化与汽车电子中高可靠性实时通信需求,完整实现CAN消息发送与中断接收两大核心功能。压缩包含217个文件,总计818KB&#xff…

2026/10/19 11:02:21

从流程图到架构图:一套可落地的图表设计规范

“diagram-design”这个名字,最早出现在我电脑里一个不起眼的目录下。那时候我桌面上堆满了各种图:流程图、架构图、时序图、部署拓扑图……每一张看起来都“已完成”,可过两周再看,几乎每一张都得靠回忆才能解释清楚。真正让我下…

2026/10/19 11:02:21

RAG技术解析:从原理到实战,构建大模型知识库问答系统

如果你最近在调试大模型驱动的问答系统,肯定遇到过这类情况:模型答得自信满满,但引用的数据和资料全是你没见过的;或者你问它上周刚更新的业务规则,它只能一脸无辜地复述训练时的旧知识。问题核心不在模型智商&#xf…

2026/10/19 11:53:01

LinkSwift 网盘直链下载:3 步把八大网盘文件送进 IDM/Aria2

LinkSwift 网盘直链下载:3 步把八大网盘文件送进 IDM/Aria2 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

2026/10/19 11:53:01

麻雀算法优化SVM参数:Python实现自动调参的多分类模板

我一直觉得SVM是个被严重低估的经典模型。别看现在深度学习、XGBoost满大街,很多中小型表格数据的分类任务,SVM配RBF核依然是性价比极高的选择。但SVM有一个让人头疼的毛病——参数太敏感。C和gamma稍微调不好,精度可能天差地别,手…

2026/10/19 11:53:01

从低ESL MLCC到GaN与RF前端:硬件设计三大风向标解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 11:53:01

8.Excel数据与指标概述

文章目录1.数据分析结构1.1认识数据-表格结构1.2 认识数据-关系型表结构1.3 认识数据-关系型表结构1.4 认识数据-非关系型表结构1.5 认识数据-对比2.指标的作用3.汇总类指标4.对比类指标5.案例5.1 人力资源框架数据的分类汇总1.数据分析结构 从理解数据开始 数据来源于日常生活…

2026/10/19 11:48:00

arcgis用累计值进行分级

为了计算生态系统服务的重要性,一般来说会使用累计值来进行计算。比如说累计的前50%值的像元为极重要区,而50-75是一般重要。重要性说明极重要从大到小排序,累计50的值重要从大到小排序,累计50-75的值中等重要从 90%到 75%该段的栅…

2026/10/18 0:01:50

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/19 0:04:56

悟空开源无代码平台实战:从实体建模到应用设计避坑指南

简介:基于悟空开源无代码平台的多种应用设计源码,面向希望在不编写代码的情况下快速搭建CRM、HRM、财务系统、ERP、SRM等业务应用的企业与技术人员,通过拖放式界面和内置模板即可完成应用定制与部署。压缩包共697个文件,约10.74MB…

2026/10/19 0:04:56

基于.NET9的多租户权限系统:数据权限与动态API落地实践

简介:这份资源是一套面向 .NET 与 Vue 全栈开发者的中台权限管理系统,后端基于 .Net9,前端采用 Vue3 Element Plus,并配套 uniapp uviewui 移动端方案,实现前后端分离。系统覆盖多租户隔离、数据权限、动态 Api、任务…

2026/10/19 0:04:56

场地预约小程序毕设实战:SSM+微信小程序+MySQL数据库设计到避坑

简介:面向毕业设计场景的场地预约小程序完整项目,基于微信小程序SSMMySql技术栈开发,适合计算机相关专业学生作为选题参考、功能扩展或二次开发起点。系统实现场地类型管理、场地管理、预约管理、取消申请与押金退回等功能,分为管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑