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原理如下图:
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的变化曲线图。如下:
4.测试
笔者编写了测试demo供使用,demo在windows下开发得到。详细参照使用说明。
笔者画出了不同迭代次数训练下的分类精度accury(笔者每1000代测试一次)。accury=正确识别的表情图片数量 / 总表情图片数量。
论文《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 |
笔者提供了笔者测试过的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中。
示例如下: