ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深度学习项目-人脸表情识别

2019-07-03 18:27:58  阅读:697  来源: 互联网

标签:same padding strides 人脸 深度 input 识别 Conv2D


表情识别

  • 简介
    • 利用卷积神经网络构建整个系统。
    • 尝试了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设计如下网络结构。
        • 在这里插入图片描述
        • 在这里插入图片描述
      • 输入层后加入(1,1)卷积层增加非线性表示且模型层次较浅,参数较少(大量参数集中在全连接层)。
      • 具体代码
        •   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文件
        • 在这里插入图片描述
  • 模型应用
    • 与传统方法相比,卷积神经网络表现更好,使用该模型构建识别系统,提供GUI界面和摄像头实时检测(摄像必须保证补光足够)。
    • 预测时对一张图片进行水平翻转、偏转15度、平移等增广得到多个概率分布,将这些概率分布加权求和得到最后的概率分布,此时概率最大的作为标签。
    • 注意,GUI预测只显示最可能是人脸的那个表情,但是对所有检测到的人脸都会框定预测结果并在图片上标记,标记后的图片在results目录下
    • GUI界面
      • 运行scripts下的gui.py即可
      • 效果图
        • 在这里插入图片描述
        • 在这里插入图片描述
        • 图片来自百度,侵删。
    • 实时检测
      • 运行scripts下的recognition_camera.py即可
        • 效果图
          • 演示不便,效果不错。
          • 图片来自百度,侵删。
  • 补充说明
    • 具体项目代码、数据集、模型已经开源于我的Github,欢迎Star或者Fork。

标签:same,padding,strides,人脸,深度,input,识别,Conv2D
来源: https://blog.csdn.net/zhouchen1998/article/details/94584047

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有