系统测试
训练我们的神经网络
设置训练参数如下:
1 | #初始化参数 |
进行训练:
1 | es = EarlyStopping(monitor='val_loss', patience=10, mode='min', restore_best_weights=True) |
注意到,在上述代码中,使用了两个策略监测我们的网络:
- 过拟合监测,如果没有更小的验证损失,则网络停止训练
- 学习速率监测,如果没有更好的验证精度,则降低学习速率
部分训练输出信息如下:
2021-12-26 05:35:09.313687: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2) |
我们观察到,训练过程中存在3次学习速率调整,最终在第49次迭代时提前终止训练。
可视化训练效果
代码如下:
1 | %matplotlib inline |
通过观察曲线,我们可以得知神经网络后期存在轻微的过拟合现象。
评估测试效果
我们对测试数据集,进行评估分析,代码如下:
1 | test_true = np.argmax(test_Y, axis=1) |
输出信息如下:
CNN Model Accuracy on test set: 0.6704 |
最终,我们的VGGNet网络,对各个数据集的准确率,如下表所示。
Accuracy | |
---|---|
Train | 73.28% |
Validation | 65.59% |
Test | 67.04% |
使用混淆矩阵进行分析
绘制混淆矩阵,以分析表情之间是否会相互混淆,代码如下:
1 | fusion_matrix(y_true, y_pred, classes, |
输出的混淆矩阵如下图所示。通过分析混淆矩阵,可知:Disgust比较容易和其他表情混淆,这是由于Disgust的样本数本身就很少。
实时人脸表情识别
将已经训练好的模型存入本地,使用摄像头实时捕捉人脸,并识别出相应的表情。我们的思路是,从捕获的图像中,先使用人脸检测器,检测出人脸区域,然后将该区域实施灰度化,并将图片大小缩放至
1 | import cv2 as cv |
上述代码中,haarcascade_frontalface_default.xml是由OpenCV提供的人脸检测器。
识别效果样例如下图所示。