1、介绍
目前,很多公司对员工的考勤同时通过打卡机或者钉钉之类的打卡软件,传统的员工打卡方式有很多,例如点名、签字、刷卡、指纹等等
然而随机机器视觉、计算机视觉的不断发展,算力的不断提升,人工智能对人脸检测的技术趋于成熟,基于人脸识别的智能打卡系统已经成熟。
通过摄像头对人脸特征进行扫描,利用面部特征的差异,识别人员。
人脸打卡的准确性不逊色于指纹打卡,相对于安全性和便捷性来说,甚至更胜一筹
本章将完成一套基于Python + OpenCV 开发的智能人脸识别打卡系统
2、需求介绍
打卡系统有三个核心功能:
- 录入打卡人的资料
- 员工打卡
- 查看打卡记录
项目较为复杂,需要对每个功能进行拆解,如下:
对数据模型的分析本系统不使用第三方数据库,所有数据都以文本文件的形式保存在文件中,因此要规范数据内容和格式,建立统一模型。
若把软件的使用者设定为“公司",那么打卡者身份可设定为“员工”,程序中的数据模型就应该
是员工数据类。每一位员工都有姓名,“姓名”就作为员工类中必备的数据之一。因为员工可能会重名,所以必须使用另一种标记作为员工身份的认证。为每一位员工添加不会重复的员工编号。员工编号的格式为从1开始递增数字,每添加一位新员工,员工编号就+1。员工类中添加“员工编号”。系统中必须保存所有员工的照片用于人脸识别。为了区分每位员工的照片文件,程序使用“员工特征码+随机值.png”的规则为照片文件命名。
如果使用员工编号作为特征码,1号员工和 11号员工的文件名容易发生混淆,所以特征码不能使用员工缤号,而是一种长度一致、复杂性高、不重复的字符串。员工类中添加“特征码”。
员工与编号、姓名、特征码是一对一的关系,但员工与打卡记录是一对多的关系,所以打卡记录可以放在员工类中保存,而不是单独保存在打卡记录模型中。打卡记录需要记录每一个员工的具体打卡时间,并能以报表的形式体现。可以使用字典保存打卡记录模型,员工姓名作为key,该员工的打卡记录列表作为 value。
打卡功能的分析:
人脸打卡依赖于人脸识别功能。本程序可以使用OpenCV提供的人脸识别器实现此功能,建议使用正确率较高的LBPH 识别器,其他识别器也可以考虑,但需要做好测试验证。
LBPH 识别器教程如下:OpenCV实战--人脸识别的三种方法(人脸识别具体到某个人)_使用opencv进行人脸识别的三种方法-CSDN博客
系统可以通过拍照方法保存员工的照片样本。当员工面对摄像头时,敲击【Enter】(回车)键就可以生成一张正面特写照片文件。为了增加识别准确率,每个员工应拍三张照片,也就是敲三Enter 键才能完成录入操作。
OpenCV提供的人脸识别器有一个缺陷:必须比对两种不同样本才能进行判断。如果公司第一次使用打卡系统,系统中没有录入任何员工,缺少比对样本,OpenCV提供的人脸识别器就会报错。因此本系统应该给出几个无人脸的默认样本,保证即使只录入一个员工,该员工也能顺利打卡。
每次员工打卡成功后,都应该记录该员工的打卡时间,然后保存到文件中
对数据维护的分析:
数据维护总结起来就是增、删、改、查四种操作。
简化版的打卡系统可以忽略“改”的操作,由“先删除,再新增”的方式代替。
本系统除了提供录入新员工的功能之外,也应提供删除已有员工的功能。删除员工之前应输入验证码进行验证,以防用户操作失误,误删重要数据。确认执行删除换作后,不仅要删除员工的信息,也要同时删除员工的打卡记录和照片文件。完成删除操作之后,所有数据文件中不再存有被删员工的任何数据。
对考勤报表的分析:
每个公司的考勤制度都不同,很多公司都主动设置“上班时间”和“下班时间”来做考勤的标准。员工要在“上班时间”之前打卡才算正常到岗,在“下班时间”之后打卡才算正常离岗。关在规定时间内打卡的情况属于“打卡异常”,“打卡异常”通常分为三种情况:迟到、早退和缺席(或者叫缺勤)。本系统会分析每一位员工在某一天的打卡记录,如果该员工在“上班时间”前和“下班时间”后都有打卡记录,则认为该员工当天全勤,该员工当天的其他打卡记录会被忽略。但如果该员工在“上班时间”前未能打卡,而是在“上班时间”后到中午12点前打卡,这种情况被视为迟到。如果该员工在“下班时间”后未能打卡,而是在中午12点之后到“下班时间”前打卡,这种情况被视为早退。当天没有打卡记录被视为缺席。
3、系统设计
本章节提供系统设计
3.1 开发环境
环境如下:
3.2 功能结构
MR 智能打卡系统结构如下:
3.3 员工打卡业务流程
总体流程如下:
员工打卡的流程:
查看记录功能业务流程:
员工管理功能流程:
考勤报表流程:
员工管理、查看记录和考勤报表这三个功能中都涉及了权限管理业务
如果用户想要使用这三个功能,需要登录管理员账号,只有登录成功之后才有权使用
3.4 文件夹目录
4、文件系统设计
为了程序简便,不使用别的数据库,而是采用读取文本文件的方式保存数据
项目所有的数据文件都在data 文件夹中
每个数据文件详细的内容格式
employee_data.txt 文件以字符串的形式保存所有员工数据,数据之间用英文逗号隔开,一行保存一个员工文件
编号、姓名、特征码
lock_record.txt 文件以字符串的形式保存数据,数据格式为打卡记录的字典文件
姓名:打卡时间
work_time.txt 文件以字符串的形式保存数据
上班时间、下班时间
系统会根据这两个时间判断员工是否迟到、早退
user_password.txt 文件以字符串的形式保存数据,数据格式为管理员账号密码
管理员账号:管理员密码
如果要更改管理员账号密码,可以在这里更改
/data/face/文件夹下保存的是所有员工的照片文件,格式为PNG
每张照片的大小都是640X480。每名员工需保存三张照片。该文件夹下还有两个默认的图像文件,文件名分别为1000000000.png和2000000000.png。这是两幅纯色图像,用于辅助训练人脸识别器。人脸识别器使用样本进行训练时,至少要有两个以上的标签分类。如果程序中仅保存了一位员工的照片,人脸识别器无法拿此员工照片与其他样本作对比,人脸识别器就会报错,此时两幅默认图像文件就充当了对比样本,以防止人脸识别器无法完成训练。当程序录入了足够多的员工信息后,这两幅默认图像虽然丧失了功能,但也不会影响识别器的识别能力。
5、数据实体模块设计
entity 包下的 organizations.py 文件用于封装数据模型。该文件中设计了员工类,并提供了一些维
护数据的方法
构建员工类
# 员工类
class Employee:def __init__(self, id, name, code):self.name = name # 员工编号self.id = id # 员工姓名self.code = code # 员工的特征码
变量设定如下:
LOCK_RECORD = dict() # 打卡记录字典,格式为{姓名:[时间1,时间2]}
EMPLOYEES = list() # 全体员工列表
MAX_ID = 0 # 目前可用的最大ID
CODE_LEN = 6 # 特征码的默认长度
WORK_TIME = "" # 上班时间
CLOSING_TIME = "" # 工下班时间
USERS = dict() # 管理员账号密码
6、程序使用
这里介绍程序使用的方法,运行main程序如下
6.1 登记照片
输入3,选择员工管理,然后输入1录入新员工即可:
员工管理需要登陆管理员账号!
输入姓名即可:henry
员工的照片数据:
6.2 删除员工信息
删除后,可以发现员工的照片不见了
6.3 查询员工打卡记录
如下:
6.4 生成考勤信息
如下:
6.5 自定义上下班时间
如下:
7、总结
更多功能可以自行查看,每一行均有注释,用户可以根据自己需求添加
项目地址:OpenCV实战:基于python的员工上下班人脸识别智能打卡系统资源-CSDN文库
其他资源:OpenCV教程代码:从读取图像到人脸识别的完整教程资源-CSDN文库