Fer2013人脸表情数据集由35886张人脸表情图片组成,每张图片是由大小固定为48×48的灰度图像组成,共有7种表情,分别对应于数字标签0-6,具体表情对应的标签和中英文如下:

0 anger 生气
1 disgust 厌恶
2 fear 恐惧
3 happy 开心
4 sad 伤心
5 surprised 惊讶
6 normal 中性

但是,数据集并没有直接给出图片,而是将表情、图片数据、用途的数据保存到csv文件中,如下图所示,

这些数值型的数据可以直接读取、转化后存储为图像数据,这里我编写了对应的处理方法,代码实现如下所示:

def load2Image(filepath='fer2013.csv',saveDir='dataset/'):'''加载数据文件转化为图像数据存储本地'''data = pd.read_csv(filepath)pixels = data['pixels'].tolist()labels = data['emotion'].tolist()width, height = 48, 48faces = []for i in range(len(pixels)):one_pixel = pixels[i]one_label = str(labels[i])face = [int(pixel) for pixel in one_pixel.split(' ')]face = np.asarray(face).reshape(width, height)face = cv2.resize(face.astype('uint8'),(48,48))oneDir=saveDir+one_label+'/'if not os.path.exists(oneDir):os.makedirs(oneDir)one_path=oneDir+str(len(os.listdir(oneDir))+1)+'.jpg'cv2.imwrite(one_path,face)

处理完成之后,数据集目录截图如下所示:

0:

1:

2:

3:

4:

5:

6:

可以看到:不同类别里面的数据集数量时不均衡的,尤其是类别1,数量只有其他类别的十分之一左右。

初窥数据集之后,我们就开始处理数据集、搭建模型了,首先是数据集加载处理部分:

def loadData(filepath='fer2013.csv'):'''加载数据文件'''data = pd.read_csv(filepath)pixels = data['pixels'].tolist()width, height = 48, 48faces = []for pixel_sequence in pixels:face = [int(pixel) for pixel in pixel_sequence.split(' ')]face = np.asarray(face).reshape(width, height)face = cv2.resize(face.astype('uint8'),(48,48))faces.append(face.astype('float32'))faces = np.asarray(faces)faces = np.expand_dims(faces, -1)emotions = pd.get_dummies(data['emotion']).valuesreturn faces, emotionsdef preprocess(x, v2=True):'''图像预处理'''x = x.astype('float32')x = x / 255.0if v2:x = x - 0.5x = x * 2.0return x

读取原始的数据集之后对数据集图像数据进行了归一化处理,之后就可以输入到模型中了。由于深度学习模型所需数据较多,这里设计实现了图片生成器,这里也是为了尽可能减少数据不均衡带来的影响,数据生成器实现如下所示:

def imageGenerator(xtrain,ytrain,xtest,ytest):'''由于深度学习模型所需数据较多,这里设计实现了图片生成器'''train_datagen=ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')validation_datagen=ImageDataGenerator(rescale=1./255)train_generator=train_datagen.flow(xtrain, ytrain,batch_size)validation_generator=validation_datagen.flow(xtest, ytest,batch_size)return train_generator,validation_generator

接下来是模型搭建部分,这里直接使用的是XCEPTION模型,Keras有了封装好的实现,如下所示:

def initModel():'''resnet模型''' model = mini_XCEPTION(input_shape, num_classes)model.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy'])model.summary()return model

完成模型的初始化搭建与数据生成器开发之后就可以进行对应的训练拟合了:

faces, emotions = loadData()
faces = preprocess(faces)
num_samples, num_classes = emotions.shape
xtrain, xtest,ytrain,ytest = train_test_split(faces, emotions,test_size=0.2,shuffle=True)log_file_path = saveDir + 'training.log'
csv_logger = CSVLogger(log_file_path, append=False)
early_stop = EarlyStopping('val_loss', patience=patience)
reduce_lr = ReduceLROnPlateau('val_loss', factor=0.1,patience=int(patience/4), verbose=1)
checkpoint = ModelCheckpoint(filepath=saveDir+'model.h5',  monitor='loss', verbose=1, mode='min', save_best_only = "True", period=1)
model=initModel()
#模型结构可视化
try:plot_model(model, to_file=saveDir+'model_structure.png', show_shapes=True)
except:pass
train_generator,test_generator=imageGenerator(xtrain,ytrain,xtest,ytest)
steps_per_epoch=len(xtrain) / batch_size
validation_steps=len(xtest) / batch_size
history=model.fit_generator(train_generator,epochs=100,steps_per_epoch=steps_per_epoch,workers=16,callbacks=[checkpoint, csv_logger, early_stop, reduce_lr],validation_data=test_generator,validation_steps=validation_steps)#训练数据曲线可视化
print(history.history.keys())
plt.clf()
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epochs')
plt.legend(['train','test'], loc='upper left')
plt.savefig(saveDir+'train_validation_acc.png')
plt.clf()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epochs')
plt.legend(['train', 'test'], loc='upper left')
plt.savefig(saveDir+'train_validation_loss.png')
#保存模型结构+权重数据
model_json=model.to_json()
with open(saveDir+'structure.json','w') as f:f.write(model_json)
model.save_weights(saveDir+'weight.h5')
print('Model Save Success.........................................')

这里我默认设置了100次迭代计算,模型启动输出如下所示:

训练结束如下所示:

结果目录如下所示:

model_structure.png如下所示:

train_validation_acc.png如下所示:

train_validation_loss.png如下所示:

到这里,本文的实践就结束了,后面有时间会补充一个实时计算模块,加载本地模型调用摄像头来对视频流进行实时计算分析。

fer2013人脸表情数据实践相关推荐

  1. fer2013人脸表情数据集简介

    fer2013人脸表情数据集简介 fer2013人脸表情数据集由35886张人脸表情图片组成,其中,测试图(Training)28708张,公共验证图(PublicTest)和私有验证图(Privat ...

  2. 外包 | LBP/HOG/CNN 实现对 CK/jaffe/fer2013 人脸表情数据集分类

    外包 | LBP/HOG/CNN 实现对 CK/jaffe/fer2013 人脸表情数据集分类 文章目录 外包 | LBP/HOG/CNN 实现对 CK/jaffe/fer2013 人脸表情数据集分类 ...

  3. CNN表情识别系统制作(1)----fer2013人脸表情数据集简介

    fer2013人脸表情数据集简介 fer2013人脸表情数据集由35886张人脸表情图片组成,其中,测试图(Training)28708张,公共验证图(PublicTest)和私有验证图(Privat ...

  4. FER2013人脸表情识别从零实现(Pytorch,FNN,CNN)

    学完了深度学习的理论和框架,接下来就是实践啦!相信大家在实践的时候都会去找各种的项目,本文是kaggle上面的一个深度学习小项目,目的是实现人脸表情的分类.接下来我将具体讲解实现过程,相信你只要学了深 ...

  5. Kaggle ICML2013 fer2013人脸表情识别/面部表情识别:训练、调优、调试与踩坑

    目录 概要: 问题来源: 论文对此比赛的说明: 选择原因: 实现与优化思路: 前置: 数据处理: 原csv数据的读取与分割: csv数据转图片和tfrecord的存取: tfrecord接生产队列供模 ...

  6. 【深度学习】基于pytorch的FER2013人脸表情图像识别(ResNet/VGG/DenseNet)

    题目要求 1.1. 任务要求 数据集:Facial Expression Recognition Challenge,共有7类:生气.恶心.害怕.快乐.悲伤.惊讶.中性. 基本要求(50%):构建Re ...

  7. 人脸表情数据集-fer2013

    ------韦访 20181102 1.概述 ---- 2.fer2013人脸表情数据集简介 Fer2013人脸表情数据集由35886张人脸表情图片组成,其中,测试图(Training)28708张, ...

  8. Python基于OpenCV的人脸表情识别系统[源码&部署教程]

    1.项目背景 人脸表情识别是模式识别中一个非常重要却十分复杂的课题.首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾.然后对近期人脸表情识别的方法进行了分类综述.通过对各种识别方法的分析与 ...

  9. 深度学习(二)——从零自己制作数据集到利用deepNN实现夸张人脸表情的实时监测(tensorflow实现)

    一.背景介绍 这篇文章主要参考我的上一篇文章:深度学习(一)--deepNN模型实现摄像头实时识别人脸表情(C++和python3.6混合编程).由于上一篇文章的模型所采用的数据集为fer2013,前 ...

  10. 人脸表情识别和情绪分类 | Python+TensorFlow(框架)+Keras+PyQt5

    人脸表情识别 | Python+Keras+PyQt5 参考学习文章: Keras|基于深度学习的人脸表情识别系统 PyQt5+QtDesigner编写摄像头界面程序(一)--pyqt5.qtdesi ...

最新文章

  1. linux二进制文件构建mysql_MySQL安装系列:使用通用二进制文件在Unix/Linux安装
  2. 《书店》:一本平凡的小书
  3. 开机自启动和由一个APK启动另一个APK核心代码
  4. 2019汇总之从4个关键词看单细胞与肝癌文献
  5. PowerShell 远程执行任务
  6. java arraylist add时默认调用tostring_java中如何调用toString命名的方法?
  7. python输入整数反转输出_Python反转输出正整数
  8. pandas获取全部列名_Pandas 整理列名
  9. 计算过去某天距离今天过去了多少天。
  10. IDEA 默认浏览器修改设置
  11. 为什么说微博、微信、贴吧、头条们都在做同一件事?
  12. Unity3D教程:手游开发常用排序算法 -下
  13. 第7章第31节:四图排版:四张图片两两一组并行排列 [PowerPoint精美幻灯片实战教程]
  14. java时钟课程设计,Java课程设计-时钟图形模拟
  15. Mac Pro硬盘清理,为啥我的系统占用如此之多的磁盘空间
  16. 以太坊(一)——概述
  17. HDU 3333HDU-3874 Necklace 离线树状数组
  18. flask学习:开发一个微电影网站一:项目介绍
  19. 最重要的定理:隐函数定理
  20. 量子计算机可以发明时光机,这三种科技一旦成功,人类将迈入二级文明

热门文章

  1. Android-LayoutParams的那些事
  2. 人人都能学会的python编程教程4:关系运算符与循环
  3. 黑客们成功地在土豆上安装了Linux!
  4. 如何使用小程序画布组件绘制自动缩放正方形
  5. new Random().nextInt
  6. JAVA内部类(一)
  7. 配置mysql复制基本步骤
  8. spring注解 annotation
  9. java se基础复习3
  10. Java 在Word创建表格