基于卷积神经网络的人脸识别(自我拍摄获取数据集)

基于卷积神经网络的人脸识别

完整代码、数据请见:https://download.csdn.net/download/weixin_43521269/12837110

人脸识别,是基于人的脸部特征信息对人的身份进行识别的技术。随着世界的发展,人脸识别已成为非常重要的技术手段,如确定一个人是否为罪犯,寻找失踪者的踪迹,更为重要的是应用于线上支付的保密手段。
学习目标:
1.了解人脸识别的研究现状
2.掌握采集人脸的思路与方法
3.掌握提取人脸的方法
4.掌握属于预处理的流程
5.掌握cnn人脸识别模型的构建
6.掌握调用模型进行实时识别的方法

操作环境:
Jupyter Notebook (Anaconda3)
python 3.76
tensorflow 2.2.0(初始接触建议装cpu版即可)
opencv-python 4.4.0.40
Keras 2.4.3
numpy 1.18.5
一人脸采集
通过 opencv调用电脑摄像头拍取约10个人的人脸照片,每人拍600张。为拍照的10个人分别建立一个文件夹,并将其所拍照片統一放置该文件夹中,文件夹以其名字拼音命令,将这10个文件夹统一放置于个总文件夹中,并以 facelmages命名。
将获取到的图片进行面部提取操作,并将提取山来的面部照片转成灰度图。对处理后的照片进行整理,并将总件夹命名为 facelmageGray。
1.了解并安装opencv包
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列C函数和少量C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。使用opencv调用摄像头对人脸进行拍摄。
基础操作:
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

2.进行拍摄人脸
对十个人进行人脸拍摄,每人拍摄600张,每隔0.05s拍一张,需30s。
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

3.提取人脸
主要函数使用faces = facec.detectMultiScale(img)、cv2.rectangle()提取出每张图片的人脸,由于可能出现检测不到人脸的情况,导致返回为空,造成数据丢 失,由于照片数据是连续不断拍摄,人脸变动位置很小,可认为人脸位置与上一张图片人脸位置一致,由此提取出600张人脸。
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

二数据预处理
将人脸的图片数据整理成numpy中的 ndarray格式,并将整理后的数据按8、2 划分成训练集和测试集。
1.将人脸数据灰度化
拍摄的照片为彩色图片,通道数为3,将其灰度化,使之成为单通道,方便运算。再将人脸的维度统一大小为2828。
2.将人脸数据归一化,使后面训练收敛速度加快,并为人脸设置标签为0-9
人脸数据为每个像素数据大小集合,像素大小0-255,将数据除以255即可实现 归一化。标签则新建一个与data对应的labels数组,方便识别。
基于卷积神经网络的人脸识别(自我拍摄获取数据集)
3.将所有数据集合为face_data,face_labels,将数据划分训练集与测试集
总共10个人,每人600张图片,则有6000张图片。将其聚合为face_data,大 小为6000
28*28,对应标签为face_labels,大小为6000。
使用sklearn对数据进行划分,主要函数为train_test_split(),参数data为 划分的数据,labels为标签,test_size为划分的比例
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

三模型构建
将训练集样本放入模型进行训练,用测试集样本进行模型性能测试,并将训练好 的模型进行保存,模型文件夹命名为model
1.cnn的认识
卷积神经网络分为卷积层,池化层,全连接层:
卷积层,对输入信号进行加工,然后在连接层实现与输出目标之间的映射。每个 卷积层都包含多个特征映射,每个特征映射是一个由多个神经元构成的“平面”,通 过一种卷积滤波器提取输入的一种特征。
池化层(采样层),基于局部相关性原理进行亚采样,从而在减少数据量的同时保 留有用信息。
全连接层,类似BP神经网络,完成识别任务
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

2.keras卷积神经网络主要函数

基于卷积神经网络的人脸识别(自我拍摄获取数据集)

3.构建模型并测试,保存
构建一个具有两层卷积层,两层池化层,一个flatten层,一个dropout层,两 个全连接层的人脸识别模型,输入训练人脸数据为[4800,28,28,1],标签为[4800], 输出训练的结果与交叉熵大小,并保存模型。再将测试集代入测试

基于卷积神经网络的人脸识别(自我拍摄获取数据集)

基于卷积神经网络的人脸识别(自我拍摄获取数据集)

四模型测试
使用之前拍摄人脸代码抓拍实时人脸,再提取人脸,预处理,最后代入模型即可。
拍摄十张图片,设置好标签,最后与预测结果进行比较。
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

五总结
1.模型结果展示
(1)以下为训练集的交叉熵与准确率:
最终为0.9971,识别效果很好,只有几张被错分。
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

(2)以下为测试集的交叉熵与准确率:
模型与参数情况如下,将1200张图片代入识别,准确率为0.9983,基本能够完 全识别出来,交叉熵也只有0.0074
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

(3)实时拍摄识别
准确率为1,交叉熵为0.2977
基于卷积神经网络的人脸识别(自我拍摄获取数据集)

2.小结
演示了使用cnn进行人脸识别,粗略的了解了如何去使用python对数据进行处理的步骤与方法,了解一些关于机器学习与深度学习的方法,并进行实操,加深自身的理解,但也有不足之处,使用的数据集过于简单,拍摄人脸基本变化不大,使得特征很明显就提取出来,训练与测试的效果也十分好,同样的道理,如果人脸出现了一些变化,如拍摄环境改变,就会影响到识别的效果,属于一种过拟合的识别,这是有数据集导致的。完成本次实验后也可去网上寻找其他数据集进行实验。

六参考阅读
本文讲述了代码实现,关于卷积神经网络可见:
通俗理解卷积神经网络:
https://blog.csdn.net/v_JULY_v/article/details/51812459
卷积神经网络详解 - 卷积层逻辑篇:https://blog.csdn.net/tjlakewalker/article/details/83275322