基于卷积神经网络(tensorflow)的人脸识别项目【深度学习】
前言
经过前段时间研究,从LeNet-5手写数字入门到最近研究的一篇天气识别。我想干一票大的,因为我本身从事的就是C++/Qt开发,对Qt还是比较熟悉,所以我想实现一个基于Qt的界面化的一个人脸识别。
对卷积神经网络的概念比较陌生的可以看一看这篇文章:卷积实际上是干了什么
想了解神经网络的训练流程、或者环境搭建的可以看这篇文章:环境搭建与训练流程
如果想学习本项目请先去看第一篇:基于卷积神经网络(tensorflow)的人脸识别项目(一)
基本思路
具体步骤如下:
首先需要收集数据,我的想法是通过OpenCV调用摄像头进行收集人脸照片。
然后进行预处理,主要是对数据集分类,训练集、验证集、测试集。
开始训练模型,提前创建好标签键值对。
测试人脸识别效果,通过OpenCV捕获人脸照片然后对图片进行预处理最后传入模型中,然后将识别的结果通过文字的形式打印在屏幕上,以此循环,直到输入q退出。
本篇主要是对上述步骤中的第二步进行实现。
关于环境
由于部分环境不兼容,这里对环境重写进行调整。 所以这里我带大家搭建一次环境。
我下面列出了所有用到的包,首先需要将这些内容全部复制到一个文件中,你可以保存为*.yaml文件。
通过anaconda导入配置
通过anaconda导入配置,免去环境的痛苦。
首先打开Anaconda软件,点击左侧的Envirconments。然后点击下方的import导入。

这里我们选择本地导入

然后选择对应的*.yaml文件,然后点击imort。接下来你就可以去喝杯茶或者干点别的,等它慢慢安装即可。

数据集
训练集、验证机与测试集
一般手中拿到的都是历史数据,通过历史数据的学习去预测未知新数据。如果用全量历史数据进行学习,并进行验证,得到的验证结果是学习数据的准确率。
模型的调优方向,让模型具有更强的对未知数据的预测能力,也叫做泛化能力。
通过从历史数据中抽出一部分作为验证集(测试集),对当前学习到的模型进行泛化能力的验证。如果测试集的准确率和训练集的准确率相当,那么说明模型的泛化能力是足够的。
关于三类数据集之间的关系,常常用一个不恰当的比喻来说明:
训练集:相当于课后的练习题,用于日常的知识巩固。
验证集:相当于周考,用来纠正和强化学到的知识。
测试集:相当于期末考试,用来最终评估学习效果。
划分规则
如果给定的样本数据充足,我们通常使用均匀随机抽样的方式将数据集划分成3个部分——训练集、验证集和测试集,这三个集合一般没有交集。但是通常情况下只会给定训练集和测试集,而不会给验证集。这时候验证集就会从训练集中均匀随机抽样一部分样本作为验证集。
预处理
从指定路径读取训练数据
这里对传入的路径进行判断,如果是文件夹就继续递归,否则就进行读取。
设置标签
给文件夹后缀,加标签,使其向量化,如果添加新的人,就可以对应文件夹和下标
按照指定图像大小调整尺寸
对从数据集中取出的照片进行尺寸修剪,并且增加边界。
数据归一化
不同的采集环境会对识别产生较大影响,比如:它会随着光线的变化发生变化、对声音的改变以及像素以及头部姿态等因素。目前常规的表情识别模型都是在标准化下采集的人脸表情数据,如果光线变的更亮或处在昏暗环境下、都会使得正确率发生变化,而这种变化是对我们不利的。在这其中光照强度和头部姿态的影响最为巨大,针对这种情况,我们只能从不变的光强和从正面采集人脸以求得正确率的提升。
基于各向同性扩散的归一化,它能使图像中的噪声减少,但其中非常重要的特征因素不会受其影响。(例如边缘或线条)
最值归一化(normalization)
把所有数据映射到0~1之间;只适用于有明显边间的情况,比如像素点中的像素值(0-255)。
公式如下:
注:x为数据集中每一种特征的值;将数据集中的每一种特征都做映射;
均值方差归一化(standardization)
它的另一个叫法是标准化,不管你中间过程如何,但最终它都会把数据的均值和方差分别控制为0和1。如果我们应用的数据没有边界或边界不容易区分,或数据与数据间的差别非常大时,此方法就非常合适。比如人的工资有人可能好几百万但是有人可能只有几千。
实现
在本文中将采用最值归一化。
加载数据集并按照交叉验证的原则划分数据集
这里将数据集加载到本地内存中,然后将数据集进行划分,训练集与验证集的比例为4:1。测试集将会在所有数据中随机取出一半。然后根据keras库要求的维度顺序重组训练数据集。还包含了数据归一化操作。
注意:K.image_dim_ordering() =\= 'th': 如果报错的话请替换为K.image_data_format() == 'channels_first' “channels_last”对应原本的“tf”,“channels_first”对应原本的“th”。
全部代码
load_ data.py文件
keras_train.py文件
测试结果
将数据进行打印。

输出拆分的数据集量。

报错以及解决方案
过程及其曲折,我只能记得部分错误了。
AttributeError: module ‘keras.backend’ has no attribute ‘image_dim_ordering’
使用K.image_dim_ordering() =\= 'th'语句 如果报错的话请替换为K.image_data_format() == 'channels_first' “channels_last”对应原本的“tf”,“channels_first”对应原本的“th”。
Error:TypeError: Invalid shape (1, 28, 28) for image data
调用:plt.imshow(img, cmap=“gray”) 时出错:TypeError: Invalid shape (1, 28, 28) for image data
这是因为这个image是三维的,我们可以改为:plt.imshow(img.squeeze(), cmap=“gray”)
squeeze()函数可以把三维数组变为二维。因为它会把为1的维度给去掉。
AttributeError: module ‘numpy’ has no attribute ‘version’
这个错误就是就是罪魁祸首,导致我环境搞了几个小时。网上的方法都是让卸载掉然后在安装。
但是我尝试了 结果就是告诉我没有适合的版本。我直接裂开。所以我就采用碰运气的方式重装了环境。如果有大佬知道这个问题怎么解决请评论区说一声。
总结
在读取数据集以及拆分数据集和预处理中,主要的问题就是环境的搭建一个numpy库搞我半天,
再就是还有一些方法的迭代更新,其实核心技术没有多少,可能需要了解一下交叉验证吧。
这里给大家准备了一些我精心挑选的AI的学习资料。关注VX公众H【咕泡AI】回复【333】即可领取!
①10G教学视频包(附课件+代码)
②AI人工智能:54份行业重磅报告汇总
③能写进简历的企业级项目实战。
④100篇+深度学习论文合集
⑤人工智能必读书籍
⑥专属学习路径规划
⑦不定期大神直播,学习和困惑解答
⑧拿来就能跑通的论文复现代码讲解及数据集
这些资料都比较珍贵,但是对自我的职业发展价值则是无价的!
别慌,这些资料这一次全部免费分享给大家。觉得好,就不要吝啬你的三连哦,这样我才有动力持续更新哦