基于CNN的表情识别(FER)pytorch实现

Report for FER

Jian Tang

Abstract

我们使用卷积神经网络(CNN)实现了baby的面部表情识别(FER)。

数据上,我们获取了开源FER数据集FER2013[1],besides我们使用爬虫获取了baby相关的人脸图片,进行了手工分类标注以形成一个全新的baby FER数据集。

模型上,我们首先复现了Luan[2]的工作,即参考Kuo[3]在CVPR 2018上的工作并实现一个轻量的CNN网络,在FER2013上进行训练并得到了XXXX%的平均分类准确率(avg acc);然后我们将模型应用在baby FER数据集并得到avg acc XXXX%;我们将网络直接应用在baby FER数据集并进行训练,得到的新的avg acc为XXXX%;我们更改了模型的结构以更好的适应三通道,大分辨率的baby FER数据集,最后我们得到的avg acc是XXXX%。

Data

FER2013

FER2013数据集是一个开源的,带标签的,划分好Train/Val的,含7类表情的,含多种族多性别多年龄段的人脸表情灰度图集,且通过对图片的观察我们发现图片存在带水印,卡通图,标签不准确等可能影响分类精度的问题。具体的表情类别和图片数量如下表1和表2。

表情

Anger

disgust
fear
happy
Neutral
sad
surprised

数量

3995
436
4097
7215
4965
4830
3171

表表1 FER2013 TrainSet数据类别和数量

表情

Anger

disgust
fear
happy
Neutral
sad
surprised

数量

491
55
528
879
626
594
416

表2 FER2013 ValSet数据类别和数量

baby FER数据集

工作1。数据集的构建。首先我们爬取了baby的多种表情的图片;考虑到人工圈出人脸框是高人工消耗的,于是接着我们使用了Opencv的CascadeClassifier+Haar分类器[4]对人脸框进行自动寻找并裁剪;然后我们手工对裁剪后的人脸进行了分类标注,考虑到研究并不需要过多的表情类别,这里我们仅分了happy,peace,sad三类,同时,为了提高分类准确率,我们去掉了表情难以区分,带水印,灰度图,分辨率过小的图片;最后我们对数据进行2/8划分以得到TrainSet/ValSet。

最终的baby FER数据集是一个自建的,带标签的,划分好Train/Val的,含3类表情的,含多种族多性别的,年龄段均为baby的人脸表情非灰度图集。其具体的表情类别和图片数量如下表3和表4。

表情

happy

peace
sad

数量

376
372
431

表3 BabyFER TrainSet数据类别和数量

表情

happy

peace
sad

数量

94
94
108

表4 BabyFER ValSet数据类别和数量

CNN Model

Luan给出了如下图1和图2的模型结构。具体的,因为FER2013只包含7类表情,为了适配模型的8类输出,Luan在FER数据集读入内存的时候增加了一列全0的虚拟数据,并给这类虚拟数据一个标签。

 

基于CNN的表情识别(FER)pytorch实现

图1 CNN模型结构

基于CNN的表情识别(FER)pytorch实现

 

图1 CNN模型具体参数

工作2。考虑到Luan使用TensorFlow 2.3.1 Keras[5]实现网络结构,我们对keras的修改不算熟悉,且我们后期要对结构进行一些修改,于是我们选择使用pytorch[6]复现Luan的工作,但我们将模型输出改成7类,且并没有增加虚拟类数据,且去掉了卷积层的padding,最后的模型输出结果如下

====epoch 333 , acc on TrainSet:====

Accuracy of anger :   86 %

Accuracy of disgust :    0 %

Accuracy of  fear :   85 %

Accuracy of happy :   95 %

Accuracy of neutral :   88 %

Accuracy of   sad :   91 %

Accuracy of surprised :   85 %

avg acc on trainSet = 0.8844264864676582

====epoch 333 , acc on ValSet:====

Accuracy of anger :   39 %

Accuracy of disgust :    0 %

Accuracy of  fear :   39 %

Accuracy of happy :   74 %

Accuracy of neutral :   48 %

Accuracy of   sad :   42 %

Accuracy of surprised :   60 %

avg acc on ValSet = 0.5188074672610755

我们日志的输出和Luan的工作略有差别,我们在TrainSet的平均准确率达到了88%,但在ValSet只达到了50%,低于Luan的69%,我们猜测这可能是因为其增加的第八个虚拟类别导致的。

我们没有绘图,因为log结果没保存,所以画不了,时间充足我们可以再跑一次画出结果图。

工作3。我们将模型应用在baby FER数据集,模型输出包括7种表情,但baby FER数据集的金标签只有3类,所以我们进行了一个映射。具体的,我们将模型输出进行映射,即将happy映射到happy,neutral映射到peace,其他映射到sad。我们得到的准确率如下:

====> class happy has img number: 94

====> class peace has img number: 94

====> class sad has img number: 108

acc for 3 classes (happy peace sad):

0.7234

0.6064

0.8426

 

工作4。我们更改了模型的结构以更好的适应baby FER数据集,具体的,我们将单通道的灰度图改成3通道图片然后送入模型,调大了模型的输入,从48*48调整为96*96,增加了conv的padding,最后我们得到的模型表现如下:

基于CNN的表情识别(FER)pytorch实现

 

上图展示了trainSet的loss(交叉熵损失)随着epoch增加的变化趋势。可以观察到模型的loss在0-50 epoch基本维持在1.1左右不变,在50epoch后找到正确的下降方向并开始下降,到200epoch后loss基本稳定,维持在0.5-0.6区间,不再有明显下降。

基于CNN的表情识别(FER)pytorch实现

 

上图展示了trainSet和valSet在happy类上的accuracy随着epoch增加的变化趋势。可以观察到XXXXX(自行补充,和loss正好对的上(loss越小,acc越高))

 

基于CNN的表情识别(FER)pytorch实现

上图展示了trainSet和valSet在所有类上的accuracy和所有类的accuracy平均值随着epoch增加的变化趋势。可以观察到XXXXX(自行补充,和loss正好对的上(loss越小,acc越高)),而且效果比直接使用FER2013的model好很多。

 

工程代码: (github 抽风传不上去)

链接:https://pan.baidu.com/s/10WxYg-0fdEkuXwgaMtOUbw

提取码:932n

 

[1] Challenges in Representation Learning: A report on three machine learning contests." I Goodfellow, D Erhan, PL Carrier, A Courville, M Mirza, B Hamner, W Cukierski, Y Tang, DH Lee, Y Zhou, C Ramaiah, F Feng, R Li, X Wang, D Athanasakis, J Shawe-Taylor, M Milakov, J Park, R Ionescu,M Popescu, C Grozea, J Bergstra, J Xie, L Romaszko, B Xu, Z Chuang, and Y. Bengio. arXiv 2013.

[2] https://github.com/luanshiyinyang/FacialExpressionRecognition

[3] Kuo C M, Lai S H, Sarkis M. A compact deep learning model for robust facial expression recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition workshops. 2018: 2121-2129.

[4] Soo S. Object detection using Haar-cascade Classifier[J]. Institute of Computer Science, University of Tartu, 2014, 2(3): 1-12.

[5] Ketkar N. Introduction to keras[M]//Deep learning with Python. Apress, Berkeley, CA, 2017: 97-111.

[6] Paszke A, Gross S, Massa F, et al. Pytorch: An imperative style, high-performance deep learning library[J]. arXiv preprint arXiv:1912.01703, 2019.

上一篇:寒假作业3(抓老鼠啊~亏了还是赚了?)


下一篇:sed命令详解