学校小学期项目:人脸识别签到系统

一、需求和计划:

随着高科技的蓬勃发展,人体特征分析技术已经作为身份快速识别及视频监控等领域的最新增值点与应用点,在身份识别、智能安防、智能监控、出入管理、证卡认证等方面发挥巨大作用。面部检测识别技术,是利用计算机图像分析、模型理论、人工智能及模式识别技术的非接触性高端模式识别技术,其可完成从复杂的图像场景中检测、检出特征人像信息,并进行匹配识别的智能分析过程。
软件的发展给我们的经济带来了很大的推动作用,现在越来越多的软件技术运用于各行各业,市场经济作为经济发展的一部分,推行新的技术对其有很大的帮助作用,而人类面部识别智能化的应用,为工作及生产带来很大便利,提高了效益。比如日常工作中的面部考勤签到,vip客户面部识别,来访人员面部识别等,这些系统的应用为行业及单位带来了很大的收益,因此随着技术的进步,跟上时代的步伐显得尤为重要。


二、项目设计:

1、 人员脸部信息采集

在学校集中进行学生和教师的人脸信息采集(现阶段),证件、部门、职务等信息登记(以后)。

2、 人员基础信息管理

在系统中基础信息管理需要管理工作人员的基本资料:包括面部信息、证件号、部门(暂未)等,可以以不同参数为索引百行排列、查询,并可以生成工作人员信息报表。

3、 IP摄像机终端管理(目标)

在系统中,可以对前端IP摄像机进行远程管理,比如修改IP地址,修改设备编号及开启采集与识别功能。

4、 系统扩展接口(目标)

系统提供与企事业单位内其他业务系统的开发接口,实现面部识别考勤系统与其他业务系统的结合使用,方便生产场所的业务管理,提高工作效率。

5、 查询统计报表

系统可以对工作人员的考勤信息进行查询统计,并生成相应工作报表,为单位进一步提供有针对性的工作考勤管理提供信息决策支持。

7、系统设置

实现系统的使用用户及权限信息管理,实现系统参数设定管理。

使用的库 :
1.opencv(人脸识别):
(内置)算法,摄像头,引用xml。
2.tkinter(图形界面):
图形化界面,(简单按钮事件)链接各py文件,业务逻辑。

(内置)算法,摄像头,引用xml
Tkinter:
图形化界面,(简单按钮事件)链接各py文件,业务逻辑

界面:


三、项目实现过程:

人脸检测:

使用OpenCV的人脸检测器进行人脸的初步检测,使haarcascade_frontalface_default.xml训练进行人脸的二分类判定,完成人脸检测。换调用摄像头:“cv2.VideoCapture(1)”,使用Python+OpenCV进行视频中的人脸检测,人脸关键点定位:关键点定位的目标是在确知人脸位置的基础上,精确定位面部的关键点,如下图示意:

图像采集:
采集1000张图片,转换为灰度图并报错,以自己设定好的规律命名图片文件,易于之后的读取后训练。

获得面部关键点的目的是进行人脸的对齐和标准化。标准化的人脸输入可以获得更高的人脸识别精度。

图像特征采集:
人脸特征提取是根据上述标准化的人脸区域图块,提取出数字化的特征。即完成从RGB信息到数值特征的变换。此环节需要尽量使得同一个人物的不同人脸所提取到的特征尽可能相似,而不同人物的人脸所提取的特征尽可能相异。

模型的训练:

人脸识别的模型的训练采用LBPH算法:

cv2.face.LBPHFaceRecognizer_create()

OpenCV人脸识别LBPH算法源码分析

注册成功:

签到成功:


四、项目总结和体会:

要搞一个人脸识别程序,首先我们需要先用提前裁剪好的标注好的人脸照片训练一个识别器。比如说,我们的识别器需要识别两个人,一个人的id是1,而另一个的id是2,于是在数据集里面,1号人的所有照片会有id 1号,2号人同理。然后我们就会使用这些数据集照片去训练识别器,再从一个视频中识别出1号人。

我们把要做的事分成三部分:

1.创建数据集

2.训练

3.识别

生成数据集,写一个数据集生成脚本。Python环境,Pycharm等IDE。

在目录中放好haarcascade_frontalface_default.xml 。OpenCV自带的。

我在github上进行了下载接下来使用cv2获取摄像头数据以及XML文件:我们的数据集需要先从摄像头采集一些人脸例子照片,当然,只能是同一个人的。然后程序会给这些例子照片添加id,并将照片保存在一个文件夹中,这个文件夹我们就将它命名为data,在py脚本的同目录下创建一个data的文件夹。

为了不会将不同的人脸照片弄混,我们需要定一个命名规则,用于给照片命名。例如,命名规则为User.[ID].[SampleNumber].jpg。如果是2号人的第十张照片,我们可以将它命名为User.2.10.jpg。为什么要定义这样的格式呢?因为这样,在加载照片训练的时候,我们就可以只通过照片的文件名,就能简单地判断是几号用户的人脸照片。而后取出时进行分割,拿到对应id的图片,计算特征值。通过shell输入,来获取人的id,并且初始化计算器变量来存储人们的例子数。

有一个值得注意的地方,gray[y : y + h, x : x + w]。此处我们是把一张灰度图片看成一个二维数组(或二维矢量),然后使用python中[]截取OpenCV检测出来的人脸区域。为了照片识别度,质量好一点,我们需要提高一下两次拍摄之间的延迟。代码会在两个拍摄间延迟100毫秒,100毫秒足够让我们去移动我们人脸的角度了(时间不够长就再加)。在拍摄1000张后停止。

最后释放资源:cap.release() cv2.destroyAllWindows() 识别和录取到训练其实都是差不多的业务逻辑。我们的1000张图片如果质量更好,或者说直接10000张。可能效果会好很多。

在算法抉择方面我们选用了1996年的LBPH算法,还有其他更多算法

如:

recognizer = cv2.face.EigenFaceRecognizer_create()
recognizer = cv2.face.FisherFaceRecognizer_create()

不同算法详细介绍:
人脸识别算法之特征脸方法(Eigenface、FisherFace、LBPH)

LBPH算法:

原理:通过已知条件,利用特定关系逐步递推,最终得到结果。

1.提取特征值并转换

2.生成数据集,训练,生成yml文件

3.计算(欧式)距离,输出相似度


整体代码流程:


完整代码:

Github: littlebuzi / FaceRecognition