人脸表情识别(facialexpression recognition, FER)是计算机视觉领域中 图像分类 的一个应用场景,相较于目标检测、实例分割、行为识别、轨迹跟踪等难度较大的计算机视觉任务,图像分类只需要让计算机『看出』图片里的物体类别,更为基础但极为重要。表情是我们在日常交流中非常重要的表达方式之一,在无法获取说话人语气的情况下,表情就成为了理解语言含义不可或缺的一部分。FER是一门交叉学科,涉及到计算机视觉、人机交互、生理学、心理学、模式识别等研究领域。
FER同样为图像分类任务的一种,考虑使用最简单的DNN网络,但要避免像素级别的学习,将学习的目标放在 特征级别 ,因此选择卷积神经网络(Convolution Neural Network),CNN 其实可以看作 DNN 的一种特殊形式。
它跟传统 DNN 标志性的区别在于两点,Convolution Kernel 以及 Pooling。
网络公开数据集,下附示例
卑微学生党选择使用 paddlepaddle 深度学习框架(为了白piao V100)
'''
网络结构
原图输入为32*32尺寸
计算卷积后输出图尺寸的方法:
输入图片大小 W×W,Filter大小 F×F,步长 S,padding的像素数 P
于是 out_put = (W − F + 2P )/S+1
'''
class MyCNN(fluid.dygraph.Layer):
def __init__(self):
super(MyCNN, self).__init__()
#Conv2D (in_channels, out_channels, kernel_size)
self.conv1 = Conv2D(1, 6, 5)
self.pool1 = Pool2D(pool_size=2, pool_type='max', pool_stride=2)
self.conv2 = Conv2D(6, 16, 5)
self.pool2 = Pool2D(pool_size=2, pool_type='max', pool_stride=2)
self.conv3 = Conv2D(16, 120, 5)
self.fc1 = Linear(120, 64, act='relu')
self.fc2 = Linear(64, 2, act='softmax')
def forward(self, input):
x = self.conv1(input)
x = self.pool1(x)
x = self.conv2(x)
x = self.pool2(x)
x = self.conv3(x)
x = fluid.layers.reshape(x, [x.shape[0], -1])
x = self.fc1(x)
y = self.fc2(x)
return y
#训练参数配置
train_parameters = {
"input_size": [1, 32, 32], #输入图片的shape
"class_dim": -1, #分类数
"src_path":"data/data38279/face_data.zip", #原始数据集路径
"target_path":"data/dataset", #要解压的路径
"train_list_path": "./train_data.txt", #train_data.txt路径
"eval_list_path": "./val_data.txt", #eval_data.txt路径
"label_dict":{}, #标签字典
"readme_path": "data/readme.json", #readme.json路径
"num_epochs": 10, #训练轮数 num_epochs=500时精度高
"train_batch_size": [16,32,64,128], #训练时每个批次的大小
"learning_strategy": { #优化函数相关的配置
"lr": 0.0005 #超参数学习率
}
}
参考文档地址:
https://aistudio.baidu.com/aistudio/projectdetail/3245781