Darknet实现人脸表情识别

Darknet是一个小众的神经网络开源框架,采用纯C++编写,小巧而精炼,速度奇快。著名的YOLO就是其应用之一。

人脸表情识别最近讨论得比较多,但是基本上都在tensorflow上实现的,比较简单。今天我们用Darknet来实现人脸表情识别。

一 : 开发环境

Window10 + vs2015 + Darknet(windows版本)参见 AlexeyAB 版本darknet

二: 数据集

Fer2013人脸表情数据集由35886张人脸表情图片组成,其中,测试图(Training)28708张,公共验证图(PublicTest)和私有验证图(PrivateTest)各3589张,每张图片是由大小固定为48×48的灰度图像组成,共有7种表情,分别对应于数字标签0-6,具体表情对应的标签和中英文如下:0 anger 生气; 1 disgust 厌恶; 2 fear 恐惧; 3 happy 开心; 4 sad 伤心;5 surprised 惊讶; 6 normal 中性。

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

表情类别(0 - 6),数据(48*48个字符值),用途(training, PrivateTest,PublicTest)

数据集官网:

https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data

数据处理流程:

1.解压 fer2013.tar.gz

2.每个图片文件命名规则

    用途序号_表情.bmp

    例如: PublicTest31072_sad.bmp

2.数据转图片文件的主要代码

    IplImage *fst= cvCreateImage(cvSize(48, 48), IPL_DEPTH_8U, 1);

    byte     *data = fst->imageData;

...

             data[idx] = (unsigned char)atoi(p0);

...

    cvSaveImage(fname, fst,0);

三:数据准备

1. 将training类型的表情文件列表形成训练文件目录train.txt

dir /B /S .\Tr*.bmp >train.txt

2. 将Publictest类型的表情文件列表形成测试文件目录test.txt

dir /B /S .\Pu*.bmp >test.txt

3. 将PrivateTest类型的表情文件列表形成测试文件目录valid.txt

dir /B /S .\Pr*.bmp >valid.txt

4. 准备名称文件 emotion.txt,内容如下:

 anger

disgust

fear

happy

sad

surprised

 normal

5. 准备emotion.dat

classes=7
train  =.\train.txt
valid  =.\valid.txt
test   =.\test.txt
labels =.\emotion.txt
backup =/back
top=7

三: cnn网络模型

layer     filters    size              input                output
    0 conv     32  1 x 1 / 1    48 x  48 x   3   ->    48 x  48 x  32
    1 conv     32  5 x 5 / 1    48 x  48 x  32   ->    48 x  48 x  32
    2 max          2 x 2 / 2    48 x  48 x  32   ->    24 x  24 x  32
    3 conv     32  3 x 3 / 1    24 x  24 x  32   ->    24 x  24 x  32
    4 max          2 x 2 / 2    24 x  24 x  32   ->    12 x  12 x  32
    5 conv     64  5 x 5 / 1    12 x  12 x  32   ->    12 x  12 x  64
    6 max          2 x 2 / 2    12 x  12 x  64   ->     6 x   6 x  64
    7 connected                            2304  ->  2048
    8 dropout       p = 0.20               2048  ->  2048
    9 connected                            2048  ->  1024
   10 dropout       p = 0.20               1024  ->  1024
   11 connected                            1024  ->     7
   12 softmax                                           7
   13 cost                                              7

learning_rate 0.01

batch=128
subdivisions=4

四:训练

darknet classifier train .\emotion.dat .\emotion.cfg

五:测试

darknet classifier test.\emotion.dat .\emotion.cfg test.txt

六:结果

经过10000次循环,loss rate <0.02,  测试准确率在 63%

七 :讨论

1. 不同学习率对训练结果有影响,目前暂没有量化

2. 网上有其他的cnn模型进行表情识别,需要进行训练后比较准确性

你可能感兴趣的:(Darknet实现人脸表情识别)