基于CNN、Opencv、tensorboard的人脸识别

  1. 系统开发环境

2.1系统开发环境

2.1.1硬件

  1. CUP: INTEL CORE I7-6500U
  2. GPU: NVIDIA GeForce 940M
  3. 内存:8G
  4. 硬盘:PCIE SSD 256G

2.1.2软件

  1. Python 3.5

2.2系统使用工具

集成开发环境(Anaconda或IDLE)

插件:

  1. opencv3.4.3
  2. numpy1.14.6
  3. keras2.2.4
  4. Tensorflow cpu1.11.0
  5. sklearn0.20.
  6. 人脸识别技术
  7. 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卷积神经网络结构

    本实验的其中一层卷积神经网络的结构如图:

     

     

    本程序的神经网络包含的结构如下

  8. 3个卷积层
  9. 2个池化层
  10. 3个激活函数层
  11. 3个Dropout层
  12. 2个全连接层
  13. 1个Flatten层
  14. 1个分类层
  15. 8,389,120个训练参数

猜你喜欢

转载自blog.csdn.net/lemon1999123/article/details/86676155