基于opencv、CNN人脸识别

系统开发环境

硬件:

CUP: INTEL CORE I7-6500U

GPU: NVIDIA GeForce 940M

内存:8G

硬盘:PCIE SSD 256G

软件:

Python 3.5

系统使用工具

集成开发环境(Anaconda或IDLE)

插件:

opencv3.4.3

numpy1.14.6

keras2.2.4

Tensorflow cpu1.11.0

sklearn0.20.0

获取人脸数据

首先通过opencv打开摄像头,获取视频流,得到一帧一帧的图片,用opencv自带的人脸识别分类器haarcascade_frontalface_alt2检测出每帧人脸的部分,并保存。将获取的每帧图片压缩成64*64的,并灰度化。

图像预处理

划分数据集

按照交叉验证的原则将数据集划分成三部分:训练集、验证集、测试集;交叉验证属于机器学习中常用的精度测试方法,它的目的是提升模型的可靠和稳定性。我们会拿出大部分数据用于模型训练,小部分数据用于对训练后的模型验证,验证结果会与验证集真实值(即标签值)比较并计算出差平方和,此项工作重复进行,直至所有验证结果与真实值相同,交叉验证结束,模型交付使用。在这里我们导入了sklearn库的交叉验证模块,利用函数train_test_split()来划分训练集和验证集。train_test_split()会根据test_size参数按比例划分数据集,在这里我们划分出了30%的数据用于验证,70%用于训练模型。参数random_state用于指定一个随机数种子,从全部数据中随机选取数据建立训练集和验证集,所以你将会看到每次训练的结果都会稍有不同。测试集也调用了这个函数。

改变图像数据维度

按照keras库运行的后端系统要求改变图像数据的维度顺序;因为keras建立在tensorflow或theano基础上,换句话说,keras的后端系统可以是tensorflow也可以是theano。后端系统决定了图像数据输入CNN网络时的维度顺序,tensorflow的维度顺序为行数(rows)、列数(cols)、通道数(颜色通道,channels);theano则是通道数、行数、列数。所以,我们通过调用image_dim_ordering()函数来确定后端系统的类型(th’代表theano,'tf'代表tensorflow),然后我们再通过numpy提供的reshape()函数重新调整数组维度。

one-hot编码

将数据标签进行one-hot编码,使其向量化,对标签集进行one-hot编码的原因是我们的训练模型采用categorical_crossentropy作为损失函数,这个函数要求标签集必须采用one-hot编码形式。所以,我们对训练集、验证集和测试集标签均做了编码转换。那么什么是one-hot编码呢?one-hot有的翻译成独热,有的翻译成一位有效,个人感觉一位有效更直白一些。因为one-hot编码采用状态寄存器的组织方式对状态进行编码,每个状态值对应一个寄存器位,且任意时刻,只有一位有效。对于我们的程序来说,我们类别状态只有两种(nb_classes = 2):0和1,0代表我,1代表others。one-hot编码会提供两个寄存器位保存这两个状态,如果标签值为0,则编码后值为[1 0],代表第一位有效;如果为1,则编码后值为[0 1],代表第2为有效。换句话说,one-hot编码将数值变成了位置信息,使其向量化,这样更方便CNN操作。

归一化图像数据

数据集先浮点后归一化的目的是提升网络收敛速度,减少训练时间,同时适应值域在(0,1)之间的激活函数,增大区分度。其实归一化有一个特别重要的原因是确保特征值权重一致。举个例子,我们使用mse这样的均方误差函数时,大的特征数值比如(5000-1000)2与小的特征值(3-1)2相加再求平均得到的误差值,显然大值对误差值的影响最大,但大部分情况下,特征值的权重应该是一样的,只是因为单位不同才导致数值相差甚大。因此,我们提前对特征数据做归一化处理,以解决此类问题。

卷积神经网络结构

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章