Cnn人脸识别样本采集+Keras编程+识别模型训练和测试

一、设计方案

本系统的具体开发环境包括: Pycharm 2020.1.2 ,Python 3.5,openCV 3.4.3,numpy 1.14.6 keras2.2.4,tensorflow 1.11.0,scikit-sklearn 0.20.0,scipy 1.2.1【很重要!】
思路: 利用opencv获取人脸,采集人脸数据,将收集到的人脸数据加载到内存,搭建属于自己的卷积神经网络,并用人脸数据训练自己的网络,将训练好的网络保存成模型,最后再用opencv获取实时人脸并用先前训练好的模型来识别人脸。
功能需求: 通过电脑本地的摄像头,拍摄实时人脸照片,与训练好的卷积神经网络模型中存放的人脸信息进行比对,同时在桌面上显示识别出的人脸标签值以及在控制台打印输出。

二、实验过程

本次实验我的工程名是work,里面包括的python文件有
1)catchpicture.py 人脸数据的获取
2)picturepraction.py 图片预处理
3)loaddata.py 图片加载到内存
4)face_CNN_keras.py 搭建卷积神经网络
5)faceclassify.py 识别人脸
在这里插入图片描述
1)catchpicture.py 人脸数据的获取
利用opencv来调用摄像头,获取实时视频流,通过opencv自带的人脸特性分类器haarcascade_frontalface_alt2.xml来识别并标注出人脸区域,将当前帧保存为图片存到指定的文件夹下面。
这里我采用了3个样本,把自己的图片存放到了路径"F:/data/mango"里面,并设定了最大保存的人脸数量1000张,超过指定最大保存数量结束程序,输入‘q’退出程序。
在这里插入图片描述
2)picturepraction.py 图片预处理
由于第一步获取到的人脸图片集中的每一张图片大小都不一样,为了后续操作的方便需要将捕获到的人脸照片压缩为像素值为6464的并灰度化处理。所以图片预处理一共分为两部先是压缩成比例6464的,首先定义了一个resize_image()函数作用是先将图片补成正方形之后压缩成像素值为64*64,第二步利用opencv自带的cvtColor()函数将图片灰度化。
在这里插入图片描述
3)loaddata.py 图片加载到内存
先读取数据(我第一步得到的3个不同人脸的数据集每个各1000张,并都保存到了路径"F:/example中")分别对应的文件夹是mango、lemon、olive以及other,将图片预处理之后的图片集,以多维数组的形式,加载到内存,并用loaddata() 函数为每一类样本数据标注标签值(分别对应0、1、2、3)。
在这里插入图片描述
4)face_CNN_keras.py 搭建卷积神经网络
搭建卷积神经网络之前,需要先完成六个步骤:
①先把图片预处理之后的图片集数据加载到内存,以多维数组的形式,加载到内存,并且要为每一类样本数据标注标签值;
②划分数据集即按照交叉验证的原则划分数据集、验证集、训练集。在我的模型中,导入了sklearn库的交叉验证模块,利用train_test_split()函数来划分训练集、验证集和测试集。train_test_split()函数中的test_size参数用来指定划分的比例,另一个random_state参数是用来指定一个随机数种子,从全部数据中随机选取数据建立自己的数据集、验证集和训练集;
在这里插入图片描述
③要改变图片的维度用到了keras库,这个库是建立在tensorflow或者theano基础上的,所以keras库的后端系统可以是tensorflow也可以是theano。但是tensorflow和theano定义的图像数据输入到CNN网络的维度顺序是不一样的,tensorflow的维度顺序为行数(rows)、列数(cols)、通道数(颜色通道,channels);theano则是通道数、行数、列数。所以需要调用image_dim_ordering()函数来确定后端系统的类型(用‘th’来代表theano用‘tf’来代表tensorflow),最后用numpy库提供的reshape()函数来调整维度;
在这里插入图片描述
④采用one-hot编码是因为我的卷积神经网络采用了categorical_crossentropy作为我们的损失函数,而这个函数要求标签集必须采用one-hot编码(这样做是为了方便CNN操作);
⑤归一化图像数据即数据集先让它浮点化之后又归一化的目的是提升网络收敛速度,减少模型的训练实践,同时适应值域在(0,1)之间的激活函数,增大区分度;
在这里插入图片描述
⑥确定优化器即使用了Adam,Adam算法是另一种自适应参数更新算法。
在这里插入图片描述
5)faceclassify.py 识别人脸
利用opencv获取实时人脸数据,调用训练好的卷积神经网络模型,来识别人脸。根据faceID=0、1、2、3判断到低是谁并实时标记和在控制台输出。
在这里插入图片描述

三、系统性能测试和分析

卷积神经网络一共14层:3层卷积层、2层池化层、4层Dropout层、1层Flatten层、2层全连接层Dense和2层分类层Activation。看特征图的尺寸如何随着每个连续的图层而改变,打印网络结构如下图:
在这里插入图片描述在这里插入图片描述
训练完成后的结果显示
在这里插入图片描述

四、分析与总结

这段时间正在学习tensorflow的卷积神经网络部分,为了对卷积神经网络能够有一个更深的了解,自己动手实现一个例程是比较好的方式,所以就选了一个这样比较有点意思的项目。训练出来最后的模型准确度还是蛮高的,但是还是存在一定的误差,因为时间不够个人能力和时间有限,不能进行系统其它功能的实现。
本次实验我采集了我家里面3个不同人(mango、mengmeng、olive)的人脸信息,分别各采集了1000张图片,图片预处理后搭建神经网络做了一个model,精度达到了97%以上,将实时识别人脸并加贴标签以及在控制台打印其对应的名字。
优点: 可以对多个人脸进行识别及优化了前面学习的卷积神经网络模型。
缺点: 首先图片采集的过程样本数量还是太少,而且样本分辨率很低,如果尝试100+个样本,理论上效果应该更好;图片采集过程各种光线和拍摄角度都应该考虑到,否则最后的识别效果还是不会太好,会发生错误。
总结: 本次实践,我其实自己做了很久,前面训练了出一个非实时的人脸识别,感觉不是太符合要求,就做了这个这个多个人的基于卷积神经网络的实时人脸识别系统,之前一段时间,我电脑环境配置上面出现了很多各种各样复杂问题,导致自己搞了很久,所以我觉得用卷积神经网络训练人脸识别对各个环境的配置要求还是很高的。很幸运昨天晚上自己还是想自己完成任务,严格按照对应版本要求重新配置了一下环境,电脑就可以跑自己之前的项目了。但是由于时间不够,昨天晚上熬夜搭配环境做出来的,然后写报告和PPT,花了很多时间,加上晚上家人都睡觉了,导致自己本次实验图片样本数据集采集的匆忙,很多还没有筛选和优化。接下来如果有时间,把图片数据集各方面优化效果肯定更好。

本实验的源代码链接:https://download.csdn.net/download/qq_44830040/12639893

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值