系统实现
实验环境
本地环境
对于网络的构建,我们使用本地环境先行验证。本地环境的版本参数如下表所示。
版本 | |
---|---|
Python | 3.7.2 |
Tensorflow | 2.6.2 |
Keras | 2.6.0 |
OpenCV | 3.4.2 |
使用GPU训练
我们使用Kaggle提供的在线环境训练我们的神经网络,配置有GPU模块。
然后将训练完的模型,再适配至本地环境,进行真实的人脸表情识别预测。
数据集概览
FER2013数据集共有35887个样本,如下面的输出所示。
1 | data = pd.read_csv('../input/fer2013/fer2013.csv') |
(35887, 3) |
我们使用的FER2013数据集,以CSV格式呈现,如下图所示。
第0列是表情对应的数字类别,从0~1分别对应着表情:Angry(生气)、Disgust(厌恶)、Fear(害怕)、Happy(高兴)、Sad(生气)、Surprise(惊讶)、Neutral(中立)。
第二列是图像的像素数据,以行向量的形式呈现,使用空格分隔。像素值介于[0,255]之间。
第三列是该样本的用途,有Training、PublicTest、PrivateTest。
1 | #查看数据集的分类情况 |
从输出结果可知,训练数据有80%的占比,测试数据和验证数据各占10%。
Training 28709 |
样本概览
查看表情分类数据,如下图所示。
1 | #查看表情分类数据 |
从上面的图我们可以知道,Disgust类的样本数量比较少,这是一个分布不太均匀的数据集。
上图所示的是一些样本的示例图片,其生成代码如下:
1 | def row2image_label(row): |
数据预处理
数据预处理部分,主要完成了下面四个事情:
- 分割数据为3个部分: train, validation, test
- 将数据标签由字符串改为整数
- 调整图片大小为 48x48, 归一化图像
- 更改标签编码为one-hot, 例如类别3(Happy)对应为
1 | #分割数据为: train, validation, test |
经过处理后的各个子数据集的样本分布情况如下图所示。
1 | def CRNO(df, dataName): |
各子数据集的输入和预期输出的形状如下:
train _X shape: (28709, 48, 48, 1), train _Y shape: (28709, 7) |
构建我们的神经网络
我们的神经网络的整体结构已在前文中给出, 每个层的具体参数如下表所示。
具体代码如下所示,注意到代码中已经设置了SGD的具体优化参数。
1 | # ## 构建我们的CNN |
数据增强
根据前文,使用Keras框架自带的ImageDataGenerator方法,编写如下代码。
1 | # 数据增强 |