首页 / 资讯中心 / 文章详情

人脸识别课堂考勤专注度检测系统毕设实现全攻略

人脸识别课堂考勤专注度检测系统毕设实现全攻略 ★ FEATURED ARTICLE
每年到这个时间段后台总有一堆人问“人脸识别课堂考勤系统”怎么做。这个题目确实是毕业设计里的常青树原因很现实它技术门槛适中既有算法内容又有系统开发内容做出来效果好演示直观论文也好凑厚度。我当年就是选的这个方向从最开始只会调OpenCV的灰度图到最后把整套“注册-考勤-专注度检测-报表导出”流程跑通中间踩过的坑可以说相当多。这篇文章我把整个项目的核心思路、算法原理、实现步骤和论文写作框架一次性讲透适合打算做类似题目、但又不知道从哪下手的同学参考。如果你是零基础按照这个思路走起码能保证毕业设计顺利过关如果你已经有点基础里面关于参数设置和坑点的部分同样值得看。1. 项目到底做什么为什么值得做1.1 需求本质拆解“人脸识别学生课堂考勤专注检测系统”这个题目拆开来看其实是两个半模块考勤模块是一个标准的“人脸识别 数据库比对”流程专注度检测模块则是在人脸识别的基础上增加对“是否低头、是否闭眼、是否东张西望”的状态判断然后按时间维度统计出一个“专注度评分”。先说考勤。传统课堂考勤要么点名要么签到表要么刷卡这些方式存在两个问题一是代签和代答很难杜绝二是老师统计起来非常费时间。人脸识别考勤把“人到没到”变成了一个自动化判断摄像头拍到人脸识别出是谁写一条考勤记录整个流程几秒钟完成。对于毕业设计来说这个模块是“保底项”因为它成熟、稳定、效果好能确保你的系统跑得起来。再说专注度检测。这个模块才是真正的加分项。它要回答的问题是这个人虽然坐在座位上但他的注意力到底在不在课堂内容上他的状态是清醒专注还是在打瞌睡、玩手机低头、频繁东张西望。这个模块的技术核心是“状态估计”需要根据人脸关键点来判断头部姿态和眼睛开合度。它比单纯的人脸识别更有研究味道也更容易在论文里写成“创新点”。所以这个题目的本质是人脸识别识别是谁 行为状态分析判断是否认真 数据管理记录和展示。搞清楚这三个层面的关系系统的整体架构就清晰了。1.2 技术方案比选做毕设最忌讳的就是一上来就抱着论文狂啃深度模型结果三个月还没跑通一个demo。对于课堂考勤场景技术选型要遵循“够用就行、稳定优先、可解释性强”的原则。人脸识别部分目前有几种主流方案我直接说结论如果追求简单稳定用 OpenCV face_recognition 库。这个库封装了基于深度学习的人脸检测和特征提取调用起来非常友好检测一个人脸并提取128维特征向量只需要一行代码。对于几十到一百多人的课程规模完全够用。如果想让论文更有“深度学习含量”可以用 MTCNN 做人脸检测用 FaceNet 或者基于 ResNet 的人脸特征提取模型自己写训练和推理流程。但这种方式调试成本高如果不是对算法特别有兴趣不建议在毕设里硬上。如果你想做“跨摄像头跨姿态”的高精度方案比如用 ArcFace 这类损失函数训练模型那已经不是毕业设计的需求了那是工业项目。我建议绝大多数人选第一种方案但要在论文里把底层原理讲清楚把“为什么不用更复杂模型”的理由写透。老师不会因为你用了现成库而扣分反而会因为你“知道这个库解决什么问题、底层是什么原理”而加分。专注度检测部分主流做法是人脸关键点检测 头部姿态估计。face_recognition 库里自带人脸关键点检测能定位到眼睛、鼻子、嘴巴等68个关键点。基于这些关键点再通过几何关系计算头部俯仰角低头抬头和偏转角左右看结合眼睛纵横比判断闭眼状态就能得出比较可靠的专注度判断。这套方案不需要GPU没有巨大的模型依赖逻辑清晰答辩的时候也讲得清楚。这里还有一个人脸检测的细节必须提前说视频流里打开摄像头后系统要持续检测人脸而不是每帧都重新比对全部人脸库。正确做法是先用轻量级的人脸检测器快速定位人脸区域再对检测到的人脸做特征提取和比对。否则每帧都对整张图跑一遍全库比对性能一定崩。2. 核心算法拆解与参数设计2.1 人脸检测与特征提取人脸检测解决的是“人脸的框在哪里”。早期用Haar特征级联分类器效果在正面光照好的情况下勉强能用但稍微侧脸或者暗光就废了。现在毕业设计里普遍用的是基于 HOG方向梯度直方图或者 CNN 的人脸检测器。face_recognition 库的默认检测器是 HOG 的改进版速度快、CPU就能跑还可以切换到 CNN 检测器精度更高但速度慢一些。人脸特征提取解决的是“这张脸长什么样”。face_recognition 底层调用了预训练的深度学习模型将一张人脸图像编码为一个128维的浮点向量。这个向量的设计逻辑是同一个人的不同照片编码结果在欧氏距离上非常接近不同人之间编码距离明显拉大。所以后续的人脸比对本质上就是计算向量距离。我把关键参数给一下特征向量维度128维相似度度量欧氏距离一般阈值取 0.45 到 0.6 之间距离越小越可能是同一个人不同光照、不同角度下的同一人脸距离通常在 0.4 以下如果阈值设得太小比如0.3会出现大量“识别失败”设得太大比如0.7会出现“认错人”这里有个非常重要的实操经验注册人脸照片的质量决定后面所有环节的体验。建议给每个学生录入2到3张不同角度的正面照不要用翻拍的电子照片不要用美颜严重的照片注册时保证光线充足。我曾经在一个测试里用了一张侧脸照做注册结果那个人每次考勤都要在摄像头前侧着坐才能被识别非常痛苦。2.2 人脸比对与考勤判定逻辑考勤判定的流程不复杂但需要想清楚几个边界情况第一帧检测到人脸后先把人脸区域截取出来送入特征提取模型得到128维特征向量。然后遍历数据库里的所有学生照片逐一计算欧氏距离取最小值。如果最小值小于阈值认为识别成功然后查一下这个学生在当前时间段的考勤状态防止重复签到。如果最小值大于阈值系统应该提示“未识别”而不是随便匹配一个最像的人。我在实际开发里还加了一个“连续帧确认”机制不是一检测到人脸就立刻签到而是连续N帧一般取5到10帧都识别为同一个ID才真正写入考勤记录。这样能避免学生只是路过摄像头被误签到。这个机制对提升系统的可信度非常有帮助。考勤记录表里除了基本信息一定要存“识别置信度”就是那个最小的欧氏距离值或归一化相似度。论文做数据分析的时候这个字段非常有用你可以统计出不同时段、不同光照下的识别置信度分布用来佐证系统的稳定性。2.3 专注度检测头部姿态与眼睛状态估计专注度检测是这套系统里最有技术含量、也最容易在答辩时被追问的部分。我建议分为两个维度来判断头部姿态估计利用68个人脸关键点中的鼻尖、下巴、左右眼外角、左右嘴角等点通过求解PnP问题来估算头部在三维空间中的旋转角度。通俗地说就是算出头部是正对摄像头还是下低、上扬、左转、右转。对于课堂场景只需要关注俯仰角Pitch和偏转角Yaw。人在正常直视黑板或屏幕时头部姿态角应该在某个范围内如果持续低头俯仰角绝对值大大概率是在看手机或打瞌睡如果频繁左右转动大概率在交头接耳或东张西望。眼睛状态判断利用眼睛关键点计算眼睛纵横比EAR。EAR的值在眼睛睁开时约为0.25到0.35完全闭合时接近0.1。设定一个EAR阈值连续若干帧低于阈值就判定为闭眼状态累计一段时间没有睁开就标记为“瞌睡”。关键参数参考专注状态判定窗口比如每10秒统计一次状态如果低头时间占比超过50%标记为不专注头部姿态阈值低头角度大于20度视为低垂左右转动超过30度视为东张西望EAR阈值取0.2附近连续6帧低于阈值判定为闭眼专注度评分公式专注时长 / 总检测时长 × 100需要注意的是脸部姿态的估计结果和摄像头安装位置关系极大。如果摄像头装在黑板上方正对学生学生正常看黑板时其实是微微抬头的这时候的“低头”判定阈值就要往低调。如果摄像头装在教室角落正常学生看黑板时可能头部就是偏转的不能用同一个固定阈值。我的做法是“个人化校准”在课程开始的前两分钟采集每个学生正常状态下的头部姿态分布作为基准值后面再根据偏离程度判定状态。这样做出来的系统鲁棒性比固定阈值好很多。3. 从零搭建系统环境、代码与实现细节3.1 技术栈与开发环境我建议整个系统用Python实现依赖管理简单第三方库生态完善。具体技术栈语言Python 3.8以上人脸检测/识别face_recognition、opencv-python界面PyQt5或者Tkinter二选一PyQt5界面更精致Tkinter更轻量数据库SQLite就够如果想让系统显得“正规”一点可以用MySQL报表openpyxl或pandas导出Excel为什么SQLite就够因为这个系统是单机课堂考勤并发量非常低一个班最多几十上百人一张表几千条记录。用MySQL要额外安装服务、配置账号反而增加答辩现场出问题的概率。SQLite是文件型数据库直接嵌入Python拷贝即用稳得很。如果论文需要写到“可扩展性”你就写“系统采用DAO模式封装数据访问层后续可平滑替换为MySQL等数据库”这句话点到即可。开发环境分两种场景如果你有带NVIDIA显卡的电脑可以本地调试模型效果如果没有CPU也完全能跑。face_recognition提取一张人脸的128维向量在普通CPU上大约需要0.1到0.3秒考勤场景下完全能接受。实时视频流检测时关键是不要让每帧都做特征提取而是“隔帧检测、检测到后跟踪”压缩计算量。3.2 数据库设计与核心流程数据库表至少要有三张学生表、考勤表、专注度记录表。我给出最简设计学生表studentid 主键自增student_no 学号唯一索引name 姓名face_encoding 人脸特征向量建议以二进制或JSON文本存储photo_path 注册照片存放路径created_at 注册时间考勤表attendanceid 主键自增student_id 关联学生idcourse_id 课程id如果有check_time 考勤时间confidence 识别置信度status 出勤/迟到/缺勤等状态专注度记录表focus_recordid 主键自增student_id 关联学生idstart_time 检测开始时间end_time 检测结束时间low_head_duration 低头时长eye_closed_duration 闭眼时长turn_head_duration 转头时长focus_score 专注度评分核心流程是这样的管理员登录系统录入学生信息并注册人脸照片学生进入教室后系统打开摄像头创建“当前课堂检测会话”视频流中检测到人脸 - 提取特征 - 与注册库比对 - 识别出学生ID跟踪该学生持续估计头部姿态和眼睛状态每10秒落一条状态记录累计会话结束后计算专注度老师/管理员可以查看考勤结果和专注度报表导出Excel这个流程写清楚之后论文的“需求分析”和“系统设计”两章就有了主线。3.3 关键代码思路这里只说思路不贴完整代码因为框架代码网上非常多重要的是逻辑。核心代码可以分为三个模块。人脸注册模块import face_recognition # 读取注册照片 image face_recognition.load_image_file(student_photo.jpg) # 提取人脸特征这里必须处理“检测不到人脸”和“出现多张人脸”的情况 face_encodings face_recognition.face_encodings(image) if len(face_encodings) 1: encoding face_encodings[0] # 128维向量 # 存入数据库可转成list再序列化 else: # 提示重新上传考勤识别模块的核心import face_recognition import cv2 video_capture cv2.VideoCapture(0) while True: ret, frame video_capture.read() # 隔几帧处理一次压缩CPU消耗 face_locations face_recognition.face_locations(frame) face_encodings face_recognition.face_encodings(frame, face_locations) for face_encoding in face_encodings: # 与所有注册学生编码计算欧氏距离 distances face_recognition.face_distance(known_encodings, face_encoding) best_match_index np.argmin(distances) if distances[best_match_index] threshold: # 签到成功专注度检测这里有个细节face_recognition 的face_landmarks函数能返回左右眼、鼻子、嘴巴等关键点坐标。基于这些坐标可以计算EAR和头部姿态。头部姿态需要相机内参和三维人脸模型点坐标OpenCV的solvePnP函数可以解算这部分代码建议直接参考成熟项目的实现不要自己从头推导数学模型但论文里一定要把原理写清楚。4. 论文怎么写才能撑得起这个项目4.1 论文框架与各章写作要点“项目论文”是这个题目的另一个重头戏。很多同学系统做出来了论文却写成“代码说明书”被老师批得一无是处。论文不是把代码贴一遍而是要把“为什么要这么做”讲清楚。毕业论文的基本框架是固定的重点是各章怎么写摘要和绪论摘要要直接点明“设计并实现了一个基于人脸识别的课堂考勤与专注度检测系统能够实现无感考勤和注意力状态实时分析”。不要空泛地说“随着科技的发展”。绪论里的“国内外研究现状”是很多同学的噩梦其实不必堆砌太多文献你只需要归纳出几条线索传统考勤方式的局限、人脸识别技术在安防和校园场景的应用、课堂行为分析的研究现状。最后再说“本文在前人基础上将人脸识别与专注度检测结合设计了一套完整系统”。相关技术介绍这一章要把你用的技术逐个讲透。Python、OpenCV、人脸检测算法、人脸特征提取模型、人脸关键点检测、数据库技术。记住一个原则这一章不是API文档是原理说明。比如你写face_recognition库不要只写“它能做人脸识别”而要解释HOG检测和128维特征编码的基本原理。需求分析要区分功能需求和非功能需求。功能需求包括人脸注册、实时考勤、专注度检测、考勤记录查询、报表导出。非功能需求包括识别准确率、实时性、易用性、系统稳定性。每一个需求都要对应后面的一个实现模块让老师看到你的需求分析不是抄模板。系统设计画系统架构图、功能模块图、流程图、数据库E-R图。这一章是工作量最直观的体现图要画得认真不要截图随手糊弄。系统实现每个功能模块对应一个小节每一节要有“实现思路 关键代码片段 运行效果截图”三层结构。代码截图不要一大段贴完只贴核心逻辑。系统测试这一章是论文里最容易被写废的。不要只写“系统运行正常”。要设计具体的测试用例比如“在不同光照条件下测试识别准确率”“遮挡口罩时的人脸检测成功率”“多人同时出现在画面中时系统能否正确识别”“低头状态能否被准确捕捉”。每个测试要有测试环境、测试步骤、预期结果、实际结果、结果分析最好用表格呈现。总结与展望总结里写“系统实现了什么、达到了什么指标、存在哪些不足”。展望里不要写空话要写可落地的改进方向比如“引入活体检测”“模型轻量化部署到嵌入式设备”“增加课堂互动行为分析”。4.2 图表、实验数据与创新点的包装论文里最容易被老师盯住的是数据。你的系统识别准确率是多少专注度检测的正确率怎么验证的这些必须有数据支撑。我自己当时做的做法是用自己的数据集做测试在正常光照下识别准确率能达到95%以上在倾斜角度大于30度的场景下降比较明显。专注度检测方面让测试者按脚本做“正常看前方、低头、闭眼”三个动作每个动作重复若干次统计系统判断的准确率。把这些数据整理成柱状图或折线图放进论文比任何文字描述都有说服力。这个项目的“创新点”怎么包装我建议不要过度吹嘘算法创新毕业设计的创新可以体现在系统集成和方案优化上将人脸识别与专注度分析融合到同一套课堂考勤系统中实现了从“是否到场”到“是否专注”的递进式管理设计了基于连续帧确认的考勤策略有效避免误签到使用基于个人基准姿态的专注度判定方法提高不同座位、不同摄像头角度下的适应性提供了完整的可视化报表方便教师课后查看5. 常见问题与踩坑实录5.1 识别精度类问题人脸识别系统最怕的就是识别不出来或者认错人。我踩过的坑按出现频率排序光照不均匀是最常见的原因。教室靠窗位置的人脸上会有明显的高光阴影人脸特征提取效果大打折扣。解决方案有两个方向一是在图像送入模型前做直方图均衡化减少光照差异影响二是注册时也尽量模拟课堂实景光照不要只在宿舍灯光下拍一张就入库。遮挡也是个老大难。口罩遮挡下半张脸之后人脸识别算法的特征提取本身是能工作的因为很多模型用的是人脸整体结构特征而不是单纯五官但准确率确实会下降。如果学校场景需要戴口罩建议在软件层面增加“人脸质量检测”当检测到画面中的人脸被大面积遮挡时提示重新识别不要硬匹配。误签到问题。前面提到的连续帧确认机制能解决大部分路过摄像头被误识别的情况。另外识别后写入考勤记录前要检查这个学生在当前课程是否已经签到避免重复记录。5.2 专注度判定类问题专注度检测最大的坑是误报。你以为的“低头”可能是学生在记笔记“东张西望”可能是学生在看旁边的同学讨论问题。固定阈值在这种场景下基本不可靠。我给几个经过实际检验的策略用“持续时间”过滤瞬时动作。低头三秒钟可能是捡笔低头持续三十秒大概率是看手机。专注度统计窗口内状态持续时间占比比瞬时状态更有意义。分时段统计不对整个课堂做一刀切。课堂前5分钟学生刚坐下状态波动大课堂中间20分钟相对稳定。我建议系统每隔1分钟生成一个独立的状态片段最后汇总成全课堂报告而不是从始至终用一个全局状态。针对“每个人基准姿态不同”的问题加入起步校准阶段。在课程开始前用2分钟记录每个学生的“正常听课姿态”后面通过偏离程度来判断这个方法非常有效。5.3 系统性能与部署类问题性能问题主要集中在视频流处理上。如果每一帧都做完整的人脸检测和特征提取CPU占用率会居高不下摄像头画面直接卡成PPT。优化方法跳帧处理每处理2到3帧跳过1帧对考勤场景影响非常小分辨率控制不要直接处理摄像头输出的1080P原图先把画面缩放到640x480甚至更小利用人脸跟踪检测到人脸后在接下来几帧直接用目标跟踪算法锁定人脸框不需要每帧都重新检测特征比对做成批量计算把库中所有学生特征编码转成numpy数组用矩阵算欧氏距离比循环快一个数量级数据库写入也要注意。不要每次状态变化都立刻写数据库那样会造成大量无意义的IO开销。我的做法是每10秒或每个统计窗口结束批量写入一条记录程序退出时统一提交。SQLite在频繁写入场景下会有锁等待批量写入能明显改善这个问题。6. 答辩准备与项目加分技巧6.1 高频答辩问题做这个题目答辩时被问到的问题基本可以预料提前准备好答案就成功了一半。“你用的face_recognition库原理是什么”这个问题几乎必问。你需要答出它基于HOG或CNN做人脸检测然后用预训练的深度神经网络把脸编码成128维向量识别时计算欧氏距离。说清楚这三层就够了。“你的系统识别准确率是多少怎么测的”这是第二个必问题。你要拿出测试数据表说明测试集是自己采集的多少个人、多少张照片、测试了多少次准确率多少。千万不能说“大概挺准的”。“专注度检测的可靠性如何保证”这个问题答得好就是加分项。你从“姿态估计原理 阈值怎么定 怎么校准”三个角度回答老师就觉得你确实做了东西。“为什么不用更复杂的模型”这个问题考察的是你是否理解工程权衡。你就答课堂考勤场景对实时性要求高GPU环境不可控face_recognition的精度已经满足需求而且模型复杂度低更容易部署在课堂单机上。“活体检测做了吗”这是高级问题很多同学会懵。诚实回答“本系统暂未加入活体检测后续可以通过分析眨眼、随机动作指令等方案来增强防伪能力”比强行解释要好。6.2 演示前必做的几件事答辩演示是翻车最高发的环节多花点时间准备演示流程比多改几版论文有用。提前一天到答辩教室测试摄像头确认光线、距离、摄像头角度都正常。演示时不要临时让人站到摄像头前应该提前录好一段包含多个场景的课堂模拟视频现场展示“自动识别签到”和“专注度状态变化”的实时分析过程。如果现场网络环境差确保所有库文件和模型文件都是本地的不要依赖在线下载模型。准备一个“备用方案”如果现场摄像头故障直接播放录屏视频演示系统所有功能。另外把数据库里的测试数据清干净再演示不要出现上一个人留下的考勤记录影响观感。还有一个小细节提前把窗体大小、字体大小调到答辩屏幕能看清的程度。很多同学开发时用的小分辨率窗口投到答辩教室大屏上一片糊老师看着都费劲。我个人在实际操作中的体会是这类系统拿到“良”很容易拿到“优”靠的是细节。把光照影响的处理方案讲清楚、把连续帧确认的考勤策略讲清楚、把专注度判定时个人校准的思路讲清楚这三个细节比堆砌一堆花哨功能更能打动老师。如果你准备做这个题目或者正在为这个题目发愁希望这篇内容能帮你少走几步弯路。最后再分享一个小技巧代码写完之后把读代码的时间留给自己答辩前逐行过一遍核心逻辑你会发现自己对项目的理解会明显上了一个层次。
阅读完成 · 觉得有帮助?
咨询建站