1.实验数据

实验数据采用Kaggle的一个表情分类比赛数据(https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data),该数据集包含三万多张人脸图片,每张图片被标注为“0=Angry, 1=Disgust, 2=Fear, 3=Happy, 4=Sad, 5=Surprise, 6=Neutral”(7类)的其中一种,分成了train、test和val。数据格式为csv,,参考“扎手的苍耳”的博客中脚本,将数据转换为图片,图片尺寸为48*48。编写脚本,根据类别重新命名图像,如下:

深度学习表情识别模型 表情识别实验_数据

笔者编写了准备实验数据脚本,在笔者提供的文件夹data/fer2013/pre_data.sh。笔者用train文件和val文件进行训练和验证,用test文件进行后续的测试精度。

笔者修改的数据存放至百度网盘,链接:https://pan.baidu.com/s/1F8V6iWQfKdUELR4VihUUkA 密码:8r63。

参考博客网址:

2.核心算法

经过在网上的各种阅读资料,笔者大致将表情识别的方法分为两大类,一类是通过提取面部特征值,再利用传统的分类方法,识别出面部表情;另一类则是利用深度网络学习实现端对端的识别。笔者在本次实验中选择第二类方式。

在darknet框架下,参考《Densely Connected Convolutional Networks》的卷积网络结构,制作配置文件(可实现end_to_end分类识别),进行分类训练。网络结构如下:

    

darknet是用C和cuda写的开源深度学习框架,快速且易安装,CPU和GPU都支持。github地址在https://github.com/pjreddie/darknet,更多的信息可以在官网(https://pjreddie.com/darknet/)上查看。

《Densely Connected Convolutional Networks》是CVPR2017最佳论文,其优点主要有三点:1)减轻了梯度消失问题;2)强化了特征传播,鼓励了特征再传播;3)大幅度减少了参数数量。其Densely Connected原理如下图:

深度学习表情识别模型 表情识别实验_表情识别_02

Densely Connected 在darknet框架中实现的代码是体现在route_layer.c。

在本次实验的网络配置中,笔者配置了3个dense block ,输出6*6 feature image,详细可看笔者提供的文件夹中fer.cfg

参考:darknet框架 https://pjreddie.com/darknet/,github:

论文《Densely Connected Convolutional Networks》 https://arxiv.org/abs/1608.06993,github: https://github.com/liuzhuang13/DenseNet

3.训练

笔者在darknet源码上编写了代码,将每次迭代前的avg loss 保存至txt,等训练结束后,编写脚本,画出avg loss的变化曲线图。如下:

深度学习表情识别模型 表情识别实验_Windows_03

4.测试

笔者编写了测试demo供使用,demo在windows下开发得到。详细参照使用说明。

笔者画出了不同迭代次数训练下的分类精度accury(笔者每1000代测试一次)。accury=正确识别的表情图片数量 / 总表情图片数量。

深度学习表情识别模型 表情识别实验_深度学习表情识别模型_04

论文《A Real-time Facial Expression Recognizer using Deep Neural Network.” International Conference on Ubiquitous Information Management and Communication ACM》在统计了fer2013各类别的识别率,见下图。笔者也统计了,见下表。

 

angry

disgust

fear

happy

sad

surprise

neural

angry

58.45

 

 

 

 

 

 

disgust

 

70.96

 

 

 

 

 

fear

 

 

50.76

 

 

 

 

happy

 

 

 

83.5

 

 

 

sad

 

 

 

 

50

 

 

surprise

 

 

 

 

 

78.85

 

neural

 

 

 

 

 

 

66.93

    

深度学习表情识别模型 表情识别实验_github_05

笔者提供了笔者测试过的weights资源在百度网盘,链接:https://pan.baidu.com/s/1akEmcG42zsHp8DMwesXfRw ,密码:oofc ;链接:https://pan.baidu.com/s/1lYg4hm5AXHu7u2yVTs5w9w 密码:iewc。其他的weights可单独向笔者索要,联系QQ:1192090271。

参考博客:

 

 

工程说明:demo在vs2013 x64 下开发得到,工程放置在fer_demo中,github地址:https://github.com/XiaoMinFang/fer_demo

依赖说明:demo依赖darknet在Windows下静态库darknet.lib,存放至lib文件夹中,(darknet在Windows下配置可参考:https://github.com/AlexeyAB/yolo-windows,笔者对darknet中源码做了改动和注释,可查看笔者的github:https://github.com/XiaoMinFang/darknet_windows fer分支。)

网络卷积运算使用了openblas(可加速3-5倍),笔者编译了Windows下x64的,存放至openblas文件夹下。

darknet依赖了pthread,存放至pre_build文件夹下。

demo使用了

代码说明:demo的代码分别存放至fer_module文件夹的include和src中。

示例如下:

深度学习表情识别模型 表情识别实验_深度学习表情识别模型_06