# ExpressionRecognition **Repository Path**: Ellsionjeep/ExpressionRecognition ## Basic Information - **Project Name**: ExpressionRecognition - **Description**: 人脸识别之表情识别项目相关源码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2019-10-19 - **Last Updated**: 2023-11-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 表情识别 - 简介 - 利用卷积神经网络构建整个系统。 - 尝试了Gabor、LBP等传统人脸特征提取方式。 - 在FER2013、JAFFE和CK+数据集上进行模型评估。 - 环境部署 - 基于Python3和Keras2(TensorFlow后端) - 具体依赖安装(推荐使用conda或者venv虚拟环境) - `git clone https://github.com/luanshiyinyang/ExpressionRecognition.git` - `cd ExpressionRecognition` - `pip install -r requirements.txt` - 预训练模型在Github根目录下的models文件夹中 - 项目说明 - 传统方法 - 数据预处理 - 图片降噪 - 人脸检测 - HAAR分类器检测(opencv) - 特征工程 - 人脸特征提取 - LBP - Gabor - 分类器 - SVM - 深度方法 - 数据预处理 - 人脸检测 - HAAR分类器 - MTCNN(效果更好) - 卷积神经网络 - 用于特征提取+分类 - 卷积神经网络 - 模型构建 - 主要参考2018年CVPR几篇论文以及谷歌的Going Deeper设计如下网络结构。 - ![](/asset/CNN.png) - ![](/asset/model.png) - 输入层后加入(1,1)卷积层增加非线性表示且模型层次较浅,参数较少(大量参数集中在全连接层)。 - 具体代码 - ```python def CNN3(input_shape=(48, 48, 1), n_classes=8): """ 参考论文实现 A Compact Deep Learning Model for Robust Facial Expression Recognition :param input_shape: :param n_classes: :return: """ # input input_layer = Input(shape=input_shape) x = Conv2D(32, (1, 1), strides=1, padding='same', activation='relu')(input_layer) # block1 x = Conv2D(64, (3, 3), strides=1, padding='same')(x) x = PReLU()(x) x = Conv2D(64, (5, 5), strides=1, padding='same')(x) x = PReLU()(x) x = MaxPooling2D(pool_size=(2, 2), strides=2)(x) # block2 x = Conv2D(64, (3, 3), strides=1, padding='same')(x) x = PReLU()(x) x = Conv2D(64, (5, 5), strides=1, padding='same')(x) x = PReLU()(x) x = MaxPooling2D(pool_size=(2, 2), strides=2)(x) # fc x = Flatten()(x) x = Dense(2048, activation='relu')(x) x = Dropout(0.5)(x) x = Dense(1024, activation='relu')(x) x = Dropout(0.5)(x) x = Dense(n_classes, activation='softmax')(x) model = Model(inputs=input_layer, outputs=x) return model ``` - 模型训练 - 主要在FER2013、JAFFE、CK+上进行训练,JAFFE给出的是半身图因此做了人脸检测。 - 最后在FER2013上Pub Test和Pri Test均达到67%左右准确率(该数据集爬虫采集存在标签错误、水印、动画图片等问题),JAFFE和CK+5折交叉验证均达到99%左右准确率(这两个数据集为实验室采集,较为准确标准)。 - 训练过程见train.ipynb文件 - ![](/asset/loss.png) - 模型应用 - 与传统方法相比,卷积神经网络表现更好,使用该模型构建识别系统,提供GUI界面和摄像头实时检测(摄像必须保证补光足够)。 - 预测时对一张图片进行水平翻转、偏转15度、平移等增广得到多个概率分布,将这些概率分布加权求和得到最后的概率分布,此时概率最大的作为标签。 - 注意,**GUI预测只显示最可能是人脸的那个表情,但是对所有检测到的人脸都会框定预测结果并在图片上标记,标记后的图片在results目录下**。 - GUI界面 - 运行scripts下的gui.py即可 - 效果图 - ![](/asset/rst_gui.png) - ![](/asset/rst_gui2.png) - 图片来自百度,侵删。 - 实时检测 - 运行scripts下的recognition_camera.py即可 - 效果图 - 演示不便,效果不错。 - 图片来自百度,侵删。 - 补充说明 - 具体项目代码、数据集、模型已经开源于我的Github,欢迎Star或者Fork。