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模型进行表情识别,需要进行训练后比较准确性