基于opencv的人脸采集、训练及识别应用
摘要
本文主要基于Python展现人脸识别的应用过程和方法,从人脸采集,人脸模型训练以及人脸识别应用讨论这三个过程简单是如何共同构成我们日常中人脸识别技术应用的,提高我们队人脸识别技术及应用的认识。通过采集到的人脸进行预处理后训练人脸的特征并输出模型结果,最后通过人脸和训练模型的比对结果达到人脸识别的效果。
人脸识别技术的常态化,被越来越多的了解到,但是这项技术的应用还是在于对应用场景的选择,不同的场景将会发挥不一样的价值。在医疗管理,人流控制,信息登记,智能安防等领域都有很大的应用前景。同时人脸识别技术开放的模块越来越多,识别的精准度也在不断地提高,我相信这项技术的应用将会是多样化的和多元化的。
1. 引言
本论文主要是基于Python的人脸采集,模型训练及识别应用。我们的生活处处可见人脸识别技术的应用,如打卡刷脸,支付刷脸及门禁刷脸等无不为我们的便捷生活服务着。所以本文从现有的人脸识别技术出发,同时结合Python来让更多人了解到人脸识别的过程及应用。
目前OpenCV因其免费开源,支持功能强大,平台兼容性好等优点受到广大技术开发人员的青睐。所以也将采用OpenCV作为本文的人脸识别技术的应用。同时结合Python语言简洁,开发效率高以及模块化的优点进行应用。该选择在应用上有以下三大优点1、搭建环境便捷 2、识别准确度高 3、应用场景丰富。通过现有的技术,可以搭建属于自己独有的人脸识别工具和平台,同时让更多人了解到人脸识别技术的实现过程。
本次首先将通过Python实现对人脸的采集,并对采集到的人脸进行相关简单的预处理以及格式裁剪。接着通过现有的技术对处理后的人脸图片进行训练及模型输出。最后通过对比模型结果来实现对不同人脸的识别。
2. 系统结构
该系统主要由三个部分构成人脸采集,模型训练以及人脸识别。
1、 人脸采集:该部分有numpy,imutils,cv2,time以及datetime模块,同时用到了由OpenCV提供训练好的人脸识别分类器 haarcascade_frontalface_alt.xml对摄影到的人脸进行截取,并转化为指定格式大小的图片保存到指定文件夹中。
2、 模型训练:该部分有numpy,random,imutils以及cv2模块。首先载入保存好的人脸集,接着将图片集中的每张照片转为灰度图像和指定的尺寸大小接着为每张照片更新人脸图像的数据集和标签,同时还将使用采样索引选择适当的数据点和标签,然后计算训练和测试的分割指数,将数据分为训练和测试两个部分,接着返回训练,测试集合原始标签的元组,最后输出模型到指定的文件目录中。此处训练采用的是OpenCV中基于LBPH特征的人脸识别模型。
3、 人脸识别:该部分有numpy,imutils,cv2,time以及datetime模块。首先加载训练好的模型,设置窗口大小,并打开摄像头,对人像进行采集,此处用的是haarcascade_frontalface_alt.xml的级联分类器对人像进行识别。识别到的人像将其进行裁剪并记录其区域为ROI感兴趣区域并使用rectangle功能将人像框出。将人像保存并与训练好了模型进行比对,如果符合模型中的人像将输出其名字并作出相应动作等。
图1 人脸识别应用架构图
3. 实现代码
1、/************************人脸采集功能代码**************************/
/**************************************************************************/
/*****************************模型训练功能代码*****************************/
face_size为最小脸部尺寸,如果脸部尺寸小于该尺寸将直接略过
test_size为多少比例的图片将取出做测试验证
此次采用的是LBP进行人脸特征的识别,图像中的每个像素点都可以通过LBP算子得到一个LBP编码。LBP特征谱的统计直方图作为特征向量进行分类识别,可以将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBP特征的统计直方图。如此一来,每个子区域,就可以用一个统计直方图来进行描述,整个图片就由若干个统计直方图组成,这样做的好处是在一定范围内减小图像没完全对准而产生的误差,分区的另外一个意义在于我们可以根据不同的子区域给予不同的权重,比如说我们认为中心部分分区的权重大于边缘部分分区的权重,意思就是说中心部分在进行图片匹配识别时的意义更为重大。 例如:一幅100*100像素大小的图片,划分为10*10=100个子区域(可以通过多种方式来划分区域),每个子区域的大小为10*10像素;在每个子区域内的每个像素点,提取其LBP特征,然后,建立统计直方图;这样,这幅图片就有10*10个子区域,也就有了10*10个统计直方图,利用这10*10个统计直方图,就可以描述这幅图片了。之后,我们利用各种相似性度量函数,就可以判断两幅图像之间的相似性了
其中OpenCV在LBP人脸识别中使用的是如下相似度公式:
/**************************************************************************/
/*****************************人脸识别功能代码*****************************/
/**************************************************************************/
4.实验
1、运行收集人脸相片收集程序:
图2.1
图2.2
图2.1,2.2 运行收集人脸程序
可以多建立不同人名的文件夹,并将收集到的人像将保存至指定文件夹中
2、训练人像集中的人像并输出到指定文件夹中:
图4.1
图4.2
3、 进行人脸识别:
识别出其他的为others人脸
图6.2
5.总结和展望
通过学习Python并且结合实际应用并进行相关的知识扩展,学习到了相关计算机图像处理问题,文件处理问题,数据处理问题等。另外此次利用Python较完整地展示了人脸识别的实现过程和使用到的相关技术。通过人脸收集,图像处理,模型建立,信息比对等过程实现了人脸的采集,人脸的存储,人脸的识别等。在图像处理上有关于灰度图像,感兴趣区域,图像数据格式等知识上有了进一步的了解和学习。在系统上对文件存储,格式处理,文件输出等内容上也有了更深的认识。另外对Python语法以及计算机图像处理方面的模块也有了更好的认识和掌握。
其次此次的人脸识别仍有不足的地方,在模型训练中实现功能的效率较低,同时输出的数据模型过大,使得程序整体运行消耗较大,在后续将改进输出模型大小,降低程序整体消耗,同时提高识别准确精度,解决在个别环境中会出现无法识别的情况,例如逆光或强光背景下识别效果不佳。