此次分享的项目是利用tensorflow构建一个CNN网络来对fer2013数据集进行训练以实现面部表情识别的小项目。
首先,我们需要现在官网上下载fer2013数据集,将数据集进行解压,会生成一个fer2013.csv文件,我们首先要对这个.csv文件进行简单的处理。
fer2013数据集将表情大致分为7类,fer2013.csv中分别标注了每张图片的标签,特征值和分类。我们首先根据分类将数据集划分为train, test和val。
fer2013数据集 官网
https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data
或者
关注微信公众号datayx 然后回复“表情识别”即可获取本文代码和数据集。
之后,我们需要将根据其特征值将其还原为48*48的灰度图像:
在这之后,我们就可以对数据集构建batch和CNN网络对其进行训练了。
这样通过调用get_batch()这个函数就可以生成相应的batch,这将对我们后边训练数据非常重要。
将数据的准备工作完成之后,我们接下来来构建本次项目需要使用的CNN网络。本次构建的网络包含2个卷积层,2个池化层,2个全连接层以及1个softmax层,为了训练的方便,还在模型代码中加入了计算损失和准确率以及训练的函数,方便之后直接调用。具体代码如下:
将模型构建好之后,我们就可以直接开始训练了。将训练轮数设置为50000次,学习率设为0.0001,开始训练:
在训练50000轮后,训练的准确率达到了95%左右,验证准确率也到达93%左右,算是一个可以接受的值了。
下面,我们就要来实现从摄像头来识别人脸并对我们做出的表情做出判断。
从摄像头来识别人脸,我们要用到openCV技术以及写好的人脸识别器。人脸识别器有许多种,我们此次选用haarcascade_frontalface_default.xml这个分类器。
使用摄像头截取人像的时候,我们将摄像头此时的一帧图像截取并保存下来。代码如下:
这样调用CatchPICFromVideo()这个函数可以生成瞬时帧的图片,并将其命名为0.jpg。
接着,我们将截下来的图片进行裁剪,使之大小为48*48,并处理为灰阶位图,便于导入网络中进行预测。
这之后我们就能得到一个48*48的灰阶位图。