尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Python人脸识别考勤系统源码实战:从录入到签到完整跑通

发布时间:2026/9/28 23:37:42

资讯中心
01
ARTICLE

Python人脸识别考勤系统源码实战:从录入到签到完整跑通

Python人脸识别考勤系统源码实战:从录入到签到完整跑通
简介这是一套面向高校计算机相关专业学生的Python毕业设计/课程设计资源主题为基于人脸识别的上课考勤系统适合需要完成毕设或课设、希望掌握人脸识别落地应用的中级学习者。系统按功能划分为录入端、管理端与监控端三部分录入端负责学生信息与人脸数据导入管理端承担信息多条件搜索、修改、多选删除及人脸数据训练监控端实现人脸识别、追踪与签到并支持生成签到表格、导出Excel格式签到表。压缩包共42个文件约46.97MB包含17个xml级联分类器文件、7张png界面截图、5个ui界面文件、3个py核心脚本以及whl依赖包、txt说明、cfg配置与wav提示音等目录结构清晰便于按模块查阅。资源附带详细部署教程与项目运行图下载后可直接部署运行并针对原项目功能不完整之处做了补充与优化能帮助读者快速理解人脸识别考勤的完整流程与工程实现思路。目前已有1656人学习下载。1. 从一份能跑通的 Python 人脸考勤源码说起每年毕业季后台被问得最多的一类资源就是「Python 毕业设计 人脸识别考勤」。原因很直接它同时踩中了三个刚需——人脸识别算法有技术含量、考勤系统业务闭环完整、前后端界面能截图写论文。但真正下载过十几份所谓「完整源码」的人都知道能开箱跑通的不到三成多数卡在 dlib 编译、模型文件缺失、摄像头调用失败这几道坎上。这份face_recognition_py-master的特别之处在于它把依赖轮子直接打包进了压缩包dlib-19.8.1-cp36-cp36m-win_amd64.whl和opencv_python-3.4.1contrib-cp36-cp36m-win_amd64.whl都在省掉了 Windows 下编译 dlib 这个最劝退的环节。系统按职责拆成录入端、管理端、监控端三块覆盖了从学生信息录入、人脸数据采集、模型训练到实时识别、追踪签到、导出 Excel 签到表的完整链路。适合拿来做课程设计、毕业设计也适合想快速摸清人脸识别工程落地流程的开发者——它不是一个玩具 demo而是一套有数据管理、有 UI、有配置文件的完整工程。2. 三端架构拆解录入、管理、监控各自在干什么2.1 模块划分与文件对应关系拿到源码先别急着跑把目录结构和功能模块对上号后面排错会快很多。这份工程的核心文件分布大致是这样的文件/目录职责对应端dataManage.py学生信息增删改查、多条件搜索、人脸数据训练管理端dataRecord.py学生信息录入、人脸数据采集录入端core.py人脸识别、追踪、签到核心逻辑监控端modules/人脸检测、特征提取等封装模块公共haarcascades/OpenCV 级联分类器 XML 文件公共ui/Qt Designer 生成的.ui界面文件三端共用config/telegramBot.cfg.bak、logging.cfg等配置公共requirements.txtPython 依赖清单公共haarcascades目录里塞了十几个 XML包括haarcascade_frontalface_default.xml、haarcascade_eye.xml、haarcascade_profileface.xml等。实际人脸检测主要用frontalface_default其余是 OpenCV 自带的备用分类器不影响主流程但别删——有些模块会按名字去加载。2.2 录入端人脸数据是怎么进库的录入端的逻辑是「先建档再采脸」。dataRecord.py负责把学生姓名、学号、班级等信息写进数据库同时调用摄像头抓取人脸样本。常见做法是每个学生采集 2050 张不同角度、不同光照的人脸图存到以学号命名的目录下。# dataRecord.py 中典型的人脸采集逻辑示意 import cv2 import os def capture_faces(student_id, save_dir, sample_num30): # 打开默认摄像头 cap cv2.VideoCapture(0) # 加载 Haar 正面人脸分类器 detector cv2.CascadeClassifier( haarcascades/haarcascade_frontalface_default.xml ) count 0 while count sample_num: ret, frame cap.read() if not ret: break gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces detector.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: count 1 # 按学号序号命名方便后续训练时按人归类 cv2.imwrite( f{save_dir}/{student_id}_{count}.jpg, gray[y:yh, x:xw] ) cv2.imshow(capture, frame) if cv2.waitKey(1) 0xFF 27: break cap.release() cv2.destroyAllWindows()这里有几个参数值得说清楚。detectMultiScale的第二个参数1.3是每次图像缩放的步长值越小检测越慢但越细第三个参数5是每个候选框至少被检测到几次才算数调大能减少误检。采集时建议保持光照均匀脸别偏太多否则训练出来的模型识别率会明显下降。样本数量不是越多越好30 张左右通常够用太多反而拖慢训练。2.3 管理端训练与多条件搜索管理端dataManage.py承担两件事一是对已录入的学生信息做增删改查支持按学号、姓名、班级多条件组合搜索二是触发人脸数据训练把采集到的图片转成特征向量存起来。训练环节是整个系统的关键。它把每个学生目录下的图片逐张读取用face_recognition库提取 128 维特征编码然后和学号绑定存入数据库或 pickle 文件。识别时只要比对实时人脸编码和库里的编码距离小于阈值就判定为同一人。# 训练逻辑示意提取特征并持久化 import face_recognition import os import pickle def train_model(data_root, output_fileencodings.pkl): known_encodings [] known_ids [] for student_id in os.listdir(data_root): student_dir os.path.join(data_root, student_id) if not os.path.isdir(student_dir): continue for img_name in os.listdir(student_dir): img_path os.path.join(student_dir, img_name) image face_recognition.load_image_file(img_path) # 每张图只取第一张脸避免多人脸干扰 encodings face_recognition.face_encodings(image) if encodings: known_encodings.append(encodings[0]) known_ids.append(student_id) with open(output_file, wb) as f: pickle.dump({encodings: known_encodings, ids: known_ids}, f) print(f训练完成共 {len(known_ids)} 条特征)face_encodings返回的是一个列表因为一张图里可能有多张脸。训练数据是单人照所以取[0]即可。如果某张图检测不到人脸encodings为空直接跳过不要让空值进库否则识别时会报维度不匹配。2.4 监控端识别、追踪与签到落表监控端core.py是运行时最长驻留的部分。它持续读摄像头帧对每一帧做人脸检测和编码然后和训练好的特征库比对。识别到某学生后记录签到时间写入签到表。系统还支持生成签到表格并导出 Excel这对交毕业设计来说是很实用的一环。追踪这块常见做法是给每个识别到的人脸分配一个临时 ID在连续帧里用位置匹配维持追踪避免同一人在短时间内被重复签到。签到去重一般按「学号 当天日期」做唯一约束同一天只记一次。3. 环境搭建与依赖安装绕开 dlib 编译这道坎3.1 Python 版本与虚拟环境选择这份工程打包的是cp36的 whl也就是 CPython 3.6。这不是随便选的——dlib 19.8.1 和 opencv 3.4.1 在 3.6 上的兼容性最稳。如果你用 3.9、3.10 去装大概率会遇到 whl 不匹配、需要自己编译 dlib 的情况而 Windows 下编译 dlib 需要 CMake 和 Visual Studio 构建工具新手很容易在这里翻车。所以第一步装 Python 3.6.x64 位然后建虚拟环境把工程依赖隔离起来。# 创建虚拟环境假设已安装 Python 3.6 python -m venv venv # 激活虚拟环境 venv\Scripts\activate # 确认 Python 版本 python --version虚拟环境激活后命令行前面会出现(venv)标识。这一步别省因为后面要装的 dlib、opencv 版本都比较老装到全局环境里容易和别的项目打架。3.2 用打包好的 whl 安装 dlib 与 opencv压缩包里已经放了两个 whl直接本地安装不走网络。# 先装 dlib注意文件名要和实际一致 pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl # 再装 opencv 带 contrib 的版本 pip install opencv_python-3.4.1contrib-cp36-cp36m-win_amd64.whl # 安装其余依赖 pip install -r requirements.txtcontrib表示这个 opencv 包带了额外模块虽然这个人脸考勤系统主要用基础功能但工程里如果引用了 contrib 里的东西少了它会报module not found。requirements.txt里通常还有face_recognition、numpy、Pillow、PyQt5等face_recognition依赖 dlib所以 dlib 必须先装成功。提示如果pip install dlib-...whl报「is not a supported wheel on this platform」先确认 Python 是 64 位、版本是 3.6再用python -c import pip; print(pip.pep425tags.get_supported())看支持的标签。3.3 界面文件与配置项检查工程里的ui/目录是 Qt Designer 的.ui文件运行时一般会动态加载或者已经转成了.py。如果启动报界面相关错误检查是不是缺了PyQt5或者.ui文件路径写的是相对路径而你的工作目录不对。config/下的logging.cfg控制日志输出telegramBot.cfg.bak是备份配置主配置可能是telegramBot.cfg。如果工程里有 Telegram 机器人推送签到通知的逻辑需要自己填 token不需要的话把相关调用注释掉即可不影响主流程。4. 从录入到签到完整跑通一遍的实操步骤4.1 启动顺序与数据库初始化三个端有依赖关系录入端产生数据管理端训练数据监控端消费数据。所以启动顺序应该是先录入、再训练、最后监控。第一次跑之前确认数据库文件是否存在很多工程用 SQLite首次运行会自动建表但如果代码里写死了路径而目录不存在就会报错。# 建议的启动顺序 python dataRecord.py # 录入端建档 采脸 python dataManage.py # 管理端检查数据 训练 python core.py # 监控端识别 签到如果dataRecord.py启动后摄像头打不开先单独测一下 OpenCV 能不能读到摄像头import cv2 cap cv2.VideoCapture(0) print(cap.isOpened()) # True 表示摄像头可用返回False的话检查摄像头是否被其他程序占用、驱动是否正常或者换VideoCapture(1)试试第二个摄像头。4.2 人脸采集的实操要点采集时建议一次只让一个人进画面背景尽量干净。Haar 分类器对侧脸和遮挡比较敏感所以采集阶段就让学生正对摄像头稍微左右转头各采几张覆盖不同角度。采集完可以在dataRecord.py对应的存储目录里确认图片数量和命名是否符合预期。如果发现采集到的图片大量是空图或者误检比如把背景里的东西当成人脸把detectMultiScale的minNeighbors从 5 调到 6 或 7能过滤掉一部分误检但太高会漏检需要权衡。4.3 训练与识别阈值调整训练完成后识别阶段的判定阈值直接决定签到准确率。face_recognition默认用 0.6 作为距离阈值小于 0.6 判定为同一人。实际用下来教室光照变化大、摄像头质量一般的情况下0.6 可能偏松容易把不同人认成同一个调到 0.450.5 更稳但太高会认不出本人。# 识别时的阈值判定 matches face_recognition.compare_faces( known_encodings, face_encoding, tolerance0.5 )tolerance就是阈值调小更严格。建议先用默认值跑一遍观察误识和漏识情况再针对性调整。这个参数没有万能值跟你的摄像头、光照、采集质量都有关属于典型的「玄学调参」只能实测。4.4 签到表导出与 Excel 格式签到数据落库后管理端提供导出 Excel 的功能。常见实现是用openpyxl或pandas把签到记录写成.xlsx。导出前确认签到表里有学号、姓名、签到时间这几个字段否则导出的表格在论文里没法用。如果导出报编码错误检查写入时有没有指定encodingutf-8Windows 下默认编码有时是 gbk。5. 避坑与常见问题排查5.1 摄像头被占用或读不到帧现象core.py启动后画面黑屏或者cap.read()一直返回False。 原因摄像头被其他程序比如刚关掉的录入端占用或者VideoCapture的索引不对。 解决关掉所有可能占用摄像头的程序等几秒再启动把VideoCapture(0)改成VideoCapture(1)试另一个设备在代码里加cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)显式设置分辨率有些摄像头默认分辨率不支持会导致读帧失败。5.2 dlib 安装报错或 import 失败现象pip install dlib-...whl提示不支持的平台或者装完后import dlib报 DLL 加载失败。 原因Python 位数或版本和 whl 标签不匹配或者系统缺 Visual C 运行库。 解决确认 Python 是 64 位 3.6装一下 Microsoft Visual C Redistributable如果还是不行用pip debug --verbose看当前环境支持的 whl 标签和文件名比对。5.3 训练时检测不到人脸现象训练脚本跑完提示「共 0 条特征」或者大量图片被跳过。 原因采集的图片本身就没检测到人脸或者图片路径读错、格式不支持。 解决先单独用face_recognition.load_image_file加载一张图打印face_encodings的长度确认单张图能不能出特征检查图片是不是灰度图Haar 采集存的是灰度face_recognition 需要 RGB读入时要转换确认目录层级和代码里遍历的逻辑一致。5.4 识别结果不稳定、同一个人时认时不认现象同一个人站在摄像头前有时签到成功有时识别成未知。 原因光照变化、人脸角度、阈值设置不合理或者训练样本太少、角度单一。 解决增加采集样本的角度多样性把tolerance适当调大比如从 0.45 调到 0.5在识别前对图像做直方图均衡化减少光照影响。5.5 签到重复记录或漏记现象同一个人短时间内被签到多次或者明明识别到了却没写进签到表。 原因去重逻辑没做或者数据库写入时事务没提交。 解决在签到写入前先查当天该学号是否已有记录有则跳过检查数据库连接是否在每次写入后commit()如果是多线程读帧注意加锁避免同一帧被处理两次。6. 进阶玩法把识别准确率和工程完整度再拉一档跑通基础流程之后如果想让这份毕业设计在答辩时更有说服力有两个方向可以深挖。第一个是识别算法的替换与对比。当前用的是 Haar face_recognitiondlib的组合你可以再接入 OpenCV 的 DNN 人脸检测器或者用 MTCNN 做检测然后对比不同方案在同一个测试集上的准确率和耗时。答辩时拿出一张对比表比单纯说「用了人脸识别」有分量得多。测试集可以就用采集到的学生照片划分训练和验证记录误识率、漏识率、平均识别时间。方案检测器特征提取准确率自测单帧耗时基线Haardlib 128 维待实测待实测方案 BDNNdlib 128 维待实测待实测方案 CMTCNNFaceNet待实测待实测第二个是工程完整度。原工程的 Telegram 机器人配置是个可扩展点你可以把签到通知、异常提醒接到其他 webhook 上签到表导出也可以加上按课程、按班级筛选甚至生成统计图表。这些改动不需要动核心识别逻辑但能让系统看起来更像一个「产品」而不是「作业」。我自己的习惯是每次改完识别相关代码都强制走一遍「采集 3 个人各 20 张 → 训练 → 连续识别 50 次 → 统计成功次数」的回归流程不然调了阈值当时看着好换个人就翻车。这套流程虽然笨但能省掉答辩前夜发现识别率崩了的后悔药。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。