ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于 Dlib + PyQt5 的人脸识别考勤系统 v2.0

基于 Dlib + PyQt5 的人脸识别考勤系统 v2.0 基于 Dlib PyQt5 的人脸识别考勤系统 v2.0本文介绍一个基于Dlib深度学习模型与PyQt5图形界面框架构建的人脸识别考勤系统。系统集成了人脸检测、特征提取、身份识别、人脸录入与数据库管理三大核心功能支持图片、视频和实时摄像头三种输入方式并提供直观的可视化操作界面。一、项目概述1.1 系统功能本系统围绕人脸识别的完整流程设计了三大功能模块功能模块说明识别对图片/视频/摄像头画面中的人脸进行实时检测与身份匹配记录识别结果录入通过摄像头或本地图片采集人脸提取 128 维特征向量并写入特征库管理查看已录入人脸信息支持更新特征库与删除人脸数据1.2 技术栈编程语言PythonGUI 框架PyQt5人脸检测DlibHOG 68 关键点定位特征提取Dlib ResNet128 维人脸描述子图像处理OpenCV、PIL数据存储CSV 文件features_all.csv二、系统架构2.1 核心类与数据流系统主类Face_MainWindow继承自 UI 类Ui_MainWindow通过信号与槽机制将界面操作与底层逻辑连接。核心数据流如下输入源图片/视频/摄像头 ↓ Dlib 人脸检测器 → 获取人脸 ROI 区域 ↓ 68 关键点预测器 → 定位面部特征点 ↓ ResNet 模型 → 计算 128 维特征向量 ↓ 欧氏距离匹配 → 与特征库比对阈值 0.4 ↓ 输出识别结果 → 更新界面显示与记录表格2.2 关键模型文件模型文件用途shape_predictor_68_face_landmarks.dat68 点面部关键点预测dlib_face_recognition_resnet_model_v1.dat128 维人脸特征提取三、功能模块详解3.1 识别模块识别模块是系统的核心支持三种输入方式本地图片、视频文件和实时摄像头。工作流程选择输入源用户通过选择图片、选择视频或打开摄像头按钮指定输入启动识别点击开始识别按钮系统加载特征库并开始处理实时检测通过QTimer定时器以 30ms 间隔逐帧处理画面特征匹配计算当前人脸与数据库中所有人脸的欧氏距离取最小值进行匹配结果展示在画面上绘制红色矩形框并标注姓名右侧显示人脸个数、识别距离和当前人脸缩略图记录保存识别结果自动写入下方表格包含序号、画面标识、人脸姓名、时间和距离核心代码逻辑# 计算欧氏距离进行匹配foriinrange(len(self.face_feature_exist)):e_distance_tmpself.euclidean_distance(self.current_face_feature[k],self.face_feature_exist[i])self.current_face_distance.append(e_distance_tmp)min_dismin(self.current_face_distance)ifmin_dis0.4:# 阈值判断self.current_face_name[k]self.face_name_exist[similar_person_num]多目标跟踪当画面中出现多张人脸时系统采用质心跟踪算法Centroid Tracker通过计算前后帧人脸质心距离来维持身份一致性避免频繁重分类。界面效果如图所示系统成功识别出画面中的人脸为李钟硕红色矩形框标注了人脸位置识别距离为 0.26低于 0.4 阈值匹配成功。右侧实时显示人脸个数和当前人脸缩略图下方表格记录每次识别的详细信息。3.2 录入模块录入模块用于将新人脸添加到特征数据库中流程分为三步新建文件夹 → 取图保存 → 录入特征。工作流程输入人脸名称在文本框中输入待录入人员的姓名新建文件夹点击新建文件夹按钮在data/database_faces/下创建以人名命名的文件夹采集人脸通过摄像头实时画面或选择本地图片系统自动检测人脸区域取图保存点击取图保存按钮将检测到的人脸裁剪并保存到对应文件夹录入特征点击录入人脸特征按钮遍历所有已保存照片提取 128 维特征并计算均值写入features_all.csv核心代码逻辑# 特征录入遍历所有照片提取特征并求均值forpersoninperson_list:features_list[]photos_listos.listdir(self.path_face_dir/person)forphotoinphotos_list:features_128Dself.extract_features(self.path_face_dir/person/photo)features_list.append(features_128D)features_meannp.array(features_list).mean(axis0)writer.writerow([person]list(features_mean))界面效果如图所示用户在文本框中输入朴信惠后新建了人脸文件夹通过选择图片检测到人脸区域点击取图保存将人脸裁剪保存最后点击录入人脸特征完成特征写入。右侧面板实时显示新建状态和录入状态。3.3 管理模块管理模块提供对已录入人脸数据的查看、更新和删除操作。功能说明查看数据库以表格形式展示所有已录入人脸的序号、存储路径、姓名和修改时间更新特征库点击更新按钮重新遍历人脸文件夹重新提取特征并刷新features_all.csv删除人脸在表格中选中目标行点击删除按钮删除对应文件夹并重新生成特征库核心代码逻辑# 删除人脸数据defdelete_doing(self):row,colself.col_row r_pathself.tableWidget_mana.item(row,1).text()ifos.path.exists(r_path):shutil.rmtree(r_path)# 删除文件夹# 重新生成特征库withopen(./data/features_all.csv,w,newline)ascsvfile:writercsv.writer(csvfile)forpersoninperson_list:# 重新提取特征...界面效果如图所示管理界面顶部显示现有人脸数量2 人、修改时间和当前状态。表格中列出了李钟硕和朴信惠两条人脸记录包含存储路径和录入时间。用户可通过更新按钮刷新特征库或选中记录后点击删除按钮移除人脸数据。四、关键技术点4.1 人脸特征提取系统使用 Dlib 的 ResNet 模型将人脸映射为128 维特征向量。该模型在大规模人脸数据集上训练能够将同一人的不同照片映射到特征空间中相近的位置不同人的照片则相距较远。defextract_features(self,path_img):img_rdself.cv_imread(path_img)facesself.detector(img_rd,1)iflen(faces)!0:shapeself.predictor(img_rd,faces[0])face_descriptorself.face_reco_model.compute_face_descriptor(img_rd,shape)else:face_descriptor0returnface_descriptor4.2 欧氏距离匹配识别时通过计算欧氏距离衡量两张人脸的相似度d∑i1128(f1i−f2i)2d \sqrt{\sum_{i1}^{128}(f_{1i} - f_{2i})^2}di1∑128​(f1i​−f2i​)2​系统设定阈值为0.4距离小于该值则判定为同一人。4.3 质心跟踪算法当画面中同时出现多张人脸时系统采用质心跟踪算法维持身份一致性计算当前帧每个人脸区域的质心坐标与上一帧的质心坐标计算距离将距离最小的上一帧身份分配给当前人脸每隔 20 帧重新进行特征匹配修正可能的跟踪漂移4.4 中文字体渲染由于 OpenCV 的putText不支持中文系统通过 PIL 的ImageDraw配合自定义字体platech.ttf实现中文标注defdrawRectBox(self,image,rect,addText):cv2.rectangle(image,rect,(0,0,255),2)# 绘制红色矩形框imgImage.fromarray(image)drawImageDraw.Draw(img)draw.text((rect[0]1,rect[1]-16),addText,(255,255,255),fontself.fontC)returnnp.array(img)五、项目结构FaceRecUI/ ├── runMain.py # 程序入口 ├── FaceRecognition.py # 核心逻辑主窗口类 ├── FaceRecognition_UI.py # PyQt5 界面代码 ├── FaceRecognition_UI.ui # Qt Designer 界面文件 ├── image1.qrc / image1_rc.py # 资源文件 ├── Font/ │ └── platech.ttf # 中文字体 ── data/ │ ├── data_dlib/ # Dlib 模型文件 │ ├── database_faces/ # 人脸照片数据库 │ └── features_all.csv # 人脸特征库 ├── images_test/ # 界面图标资源 └── test_img/ # 测试图片六、运行环境依赖安装pipinstallPyQt5 opencv-python dlib numpy pandas Pillow启动方式python runMain.py注意事项首次运行需确保data/data_dlib/目录下存在 Dlib 模型文件摄像头功能需要电脑连接可用摄像头设备特征库文件features_all.csv在首次录入人脸后自动生成中文字体文件platech.ttf需放置在Font/目录下七、总结本项目实现了一个功能完整的人脸识别考勤系统具备以下特点多输入源支持图片、视频、实时摄像头三种模式自由切换实时性能基于 QTimer 的定时刷新机制实现流畅的实时识别多目标跟踪质心跟踪算法保证多人场景下的身份稳定性可视化管理录入、识别、管理三大模块界面清晰操作简便数据持久化CSV 文件存储特征数据便于迁移和备份系统可进一步扩展的方向包括引入更深度的神经网络模型提升识别精度、添加考勤统计与导出功能、支持云端人脸数据库同步等。项目源码基于 Python Dlib PyQt5 开发界面截图展示了识别、录入、管理三大功能模块的实际运行效果。代码下载路径有训练代码和训练好的模型以及训练过程提供数据提供GUI界面代码项目完整文件下载请见演示与介绍视频的简介处给出➷➷➷https://www.bilibili.com/video/BV1AoHk6DErD/
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进