- 系统开发环境
2.1系统开发环境
2.1.1硬件
- CUP: INTEL CORE I7-6500U
- GPU: NVIDIA GeForce 940M
- 内存:8G
- 硬盘:PCIE SSD 256G
2.1.2软件
- Python 3.5
2.2系统使用工具
集成开发环境(Anaconda或IDLE)
插件:
- opencv3.4.3
- numpy1.14.6
- keras2.2.4
- Tensorflow cpu1.11.0
- sklearn0.20.
- 人脸识别技术
-
3.1获取人脸数据
首先通过opencv打开摄像头,获取视频流,得到一帧一帧的图片,用opencv自带的人脸识别分类器haarcascade_frontalface_alt2检测出每帧人脸的部分,并保存。将获取的每帧图片压缩成64*64的,并灰度化。
3.2图像预处理
3.2.1划分数据集
按照交叉验证的原则将数据集划分成三部分:训练集、验证集、测试集;交叉验证属于机器学习中常用的精度测试方法,它的目的是提升模型的可靠和稳定性。我们会拿出大部分数据用于模型训练,小部分数据用于对训练后的模型验证,验证结果会与验证集真实值(即标签值)比较并计算出差平方和,此项工作重复进行,直至所有验证结果与真实值相同,交叉验证结束,模型交付使用。在这里我们导入了sklearn库的交叉验证模块,利用函数train_test_split()来划分训练集和验证集。train_test_split()会根据test_size参数按比例划分数据集,在这里我们划分出了30%的数据用于验证,70%用于训练模型。参数random_state用于指定一个随机数种子,从全部数据中随机选取数据建立训练集和验证集,所以你将会看到每次训练的结果都会稍有不同。测试集也调用了这个函数。
3.2.2改变图像数据维度
按照keras库运行的后端系统要求改变图像数据的维度顺序;因为keras建立在tensorflow或theano基础上,换句话说,keras的后端系统可以是tensorflow也可以是theano。后端系统决定了图像数据输入CNN网络时的维度顺序,tensorflow的维度顺序为行数(rows)、列数(cols)、通道数(颜色通道,channels);theano则是通道数、行数、列数。所以,我们通过调用image_dim_ordering()函数来确定后端系统的类型(th’代表theano,'tf'代表tensorflow),然后我们再通过numpy提供的reshape()函数重新调整数组维度。
3.2.3 one-hot编码
将数据标签进行one-hot编码,使其向量化,对标签集进行one-hot编码的原因是我们的训练模型采用categorical_crossentropy作为损失函数,这个函数要求标签集必须采用one-hot编码形式。因为one-hot编码采用状态寄存器的组织方式对状态进行编码,每个状态值对应一个寄存器位,且任意时刻,只有一位有效。对于我们的程序来说,我们类别状态只有两种(nb_classes = 2):0和1,0代表我,1代表others。one-hot编码会提供两个寄存器位保存这两个状态,如果标签值为0,则编码后值为[1 0],代表第一位有效;如果为1,则编码后值为[0 1],代表第2为有效。换句话说,one-hot编码将数值变成了位置信息,使其向量化,这样更方便CNN操作。
3.2.4归一化图像数据
数据集先浮点后归一化的目的是提升网络收敛速度,减少训练时间,同时适应值域在(0,1)之间的激活函数,增大区分度。其实归一化有一个特别重要的原因是确保特征值权重一致。举个例子,我们使用mse这样的均方误差函数时,大的特征数值比如(5000-1000)2与小的特征值(3-1)2相加再求平均得到的误差值,显然大值对误差值的影响最大,但大部分情况下,特征值的权重应该是一样的,只是因为单位不同才导致数值相差甚大。因此,我们提前对特征数据做归一化处理,以解决此类问题。
3.3构建卷积神经网络
3.3.1卷积神经网络结构
本实验的其中一层卷积神经网络的结构如图:
本程序的神经网络包含的结构如下:
- 3个卷积层
- 2个池化层
- 3个激活函数层
- 3个Dropout层
- 2个全连接层
- 1个Flatten层
- 1个分类层
- 8,389,120个训练参数