毕业设计-人脸表情识别系统、人工智能

人脸表情识别系统

1. 前言

    在这个人工智能成为超级大热门的时代,人脸表情识别已成为其中的一项研究热点,而卷积神经网络、深度信念网络和多层感知器等相关算法在人脸面部表情识别领域的运用最为广泛。面部的表情中包含了太多的信息,轻微的表情变化都会反映出人心理的变化,可想而知如果机器能敏锐地识别人脸中表达的情感该是多么令人兴奋的事。

    学习和研究了挺久的深度学习,偶然看到IEEE上面一篇质量很高的文章,里面介绍的是利用深度神经网络实现的面部表情识别,研读下来让我深受启发。于是自己动手做了这个项目,如今SCI论文已投稿,这里特此将前期工作作个总结,希望能给类似工作的朋友带来一点帮助。由于论文尚未公开,这里使用的是已有的模型——如今CNN的主流框架之mini_XCEPTION,该模型性能也已是不错的了,论文中改进的更高性能模型尚不便给出,后面会分享给大家,敬请关注。


2. 表情识别数据集

    目前,现有的公开的人脸表情数据集比较少,并且数量级比较小。比较有名的广泛用于人脸表情识别系统的数据集Extended Cohn-Kanada (CK+)是由P.Lucy收集的。CK+数据集包含123 个对象的327 个被标记的表情图片序列,共分为正常、生气、蔑视、厌恶、恐惧、开心和伤心七种表情。对于每一个图片序列,只有最后一帧被提供了表情标签,所以共有327 个图像被标记。为了增加数据,我们把每个视频序列的最后三帧图像作为训练样本。这样CK+数据总共被标记的有981 张图片。这个数据库是人脸表情识别中比较流行的一个数据库,很多文章都会用到这个数据做测试,可通过下面的链接下载。
官网链接:The Extended Cohn-Kanade Dataset(CK+)
网盘链接:百度网盘下载(提取码:8r15)

图片展示

    KaggleKaggle人脸表情分析比赛提供的一个数据集。该数据集含28709 张训练样本,3859 张验证数据集和3859 张测试样本,共35887 张包含生气、厌恶、恐惧、高兴、悲伤、惊讶和正常七种类别的图像,图像分辨率为48×48。该数据集中的图像大都在平面和非平面上有旋转,并且很多图像都有手、头发和围巾等的遮挡物的遮挡。该数据库是2013年Kaggle比赛的数据,由于这个数据库大多是从网络爬虫下载的,存在一定的误差性。这个数据库的人为准确率是65%±5%
官网链接:FER2013
网盘链接:百度网盘下载(提取码:t7xj)

图片展示

    由于FER2013数据集数据更加齐全,同时更加符合实际生活的场景,所以这里主要选取FER2013训练和测试模型。为了防止网络过快地过拟合,可以人为的做一些图像变换,例如翻转,旋转,切割等。上述操作称为数据增强。数据操作还有另一大好处是扩大数据库的数据量,使得训练的网络鲁棒性更强。下载数据集保存在fer2013的文件夹下,为了对数据集进行处理,采用如下代码载入和进行图片预处理:

import pandas as pd
import cv2
import numpy as npdataset_path = 'fer2013/fer2013/fer2013.csv' # 文件保存位置
image_size=(48,48) # 图片大小# 载入数据
def load_fer2013():data = pd.read_csv(dataset_path)pixels = data['pixels'].tolist()width, height = 48, 48faces = []for pixel_sequence in pixels:face = [int(pixel) for pixel in pixel_sequence.split(' ')]face = np.asarray(face).reshape(width, height)face = cv2.resize(face.astype('uint8'),image_size)faces.append(face.astype('float32'))faces = np.asarray(faces)faces = np.expand_dims(faces, -1)emotions = pd.get_dummies(data['emotion']).as_matrix()return faces, emotions# 将数据归一化
def preprocess_input(x, v2=True):x = x.astype('float32')x = x / 255.0if v2:x = x - 0.5x = x * 2.0return x

载入数据后将数据集划分为训练集和测试集,在程序中调用上面的函数代码如下:

from load_and_process import load_fer2013
from load_and_process import preprocess_input
from sklearn.model_selection import train_test_split# 载入数据集
faces, emotions = load_fer2013()
faces = preprocess_input(faces)
num_samples, num_classes = emotions.shape# 划分训练、测试集
xtrain, xtest,ytrain,ytest = train_test_split(faces, emotions,test_size=0.2,shuffle=True)

3. 搭建表情识别的模型

    接下来就是搭建表情识别的模型了,这里用到的是CNN的主流框架之mini_XCEPTIONXCEPTIONGoogleInception后提出的对Inception v3的另一种改进,主要是采用深度可分离的卷积(depthwise separable convolution)来替换原来Inception v3中的卷积操作。XCEPTION的网络结构在ImageNet数据集(Inception v3的设计解决目标)上略优于Inception v3,并且在包含3.5亿个图像甚至更大的图像分类数据集上明显优于Inception v3,而两个结构保持了相同数目的参数,性能增益来自于更加有效地使用模型参数,详细可参考论文:Xception: Deep Learning with Depthwise Separable Convolutions,论文Real-time Convolutional Neural Networks for Emotion and Gender Classification等。

图片展示

    既然这样的网络能获得更好结果又是主流,那当然有必要作为对比算法实现以下了,这里博主模型这部分的代码引用了GitHub:https://github.com/oarriaga/face_classification中的模型(其他地方也能找到这个模型的类似代码),模型框图如上图所示,其代码如下:

def mini_XCEPTION(input_shape, num_classes, l2_regularization=0.01):regularization = l2(l2_regularization)# baseimg_input = Input(input_shape)x = Conv2D(8, (3, 3), strides=(1, 1), kernel_regularizer=regularization,use_bias=False)(img_input)x = BatchNormalization()(x)x = Activation('relu')(x)x = Conv2D(8, (3, 3), strides=(1, 1), kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = Activation('relu')(x)# module 1residual = Conv2D(16, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)residual = BatchNormalization()(residual)x = SeparableConv2D(16, (3, 3), padding='same',kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = SeparableConv2D(16, (3, 3), padding='same',kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)x = layers.add([x, residual])# module 2residual = Conv2D(32, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)residual = BatchNormalization()(residual)x = SeparableConv2D(32, (3, 3), padding='same',kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = SeparableConv2D(32, (3, 3), padding='same',kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)x = layers.add([x, residual])# module 3residual = Conv2D(64, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)residual = BatchNormalization()(residual)x = SeparableConv2D(64, (3, 3), padding='same',kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = SeparableConv2D(64, (3, 3), padding='same',kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)x = layers.add([x, residual])# module 4residual = Conv2D(128, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)residual = BatchNormalization()(residual)x = SeparableConv2D(128, (3, 3), padding='same',kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = SeparableConv2D(128, (3, 3), padding='same',kernel_regularizer=regularization,use_bias=False)(x)x = BatchNormalization()(x)x = MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x)x = layers.add([x, residual])x = Conv2D(num_classes, (3, 3),#kernel_regularizer=regularization,padding='same')(x)x = GlobalAveragePooling2D()(x)output = Activation('softmax',name='predictions')(x)model = Model(img_input, output)return model

4. 数据增强的批量训练

    神经网络的训练需要大量的数据,数据的量决定了网络模型可以达到的高度,网络模型尽量地逼近这个高度。然而对于人脸表情的数据来说,都只存在少量的数据Extended Cohn-Kanada (CK+)的数据量是远远不够的,并且CK+多是比较夸张的数据。Kaggle Fer2013数据集也不过只有3万多数据量,而且有很多遮挡、角度等外界影响因素。既然收集数据要花费很大的人力物力,那么我们就用技术解决这个问题,为避免重复开发首先还是看看有没有写好的库。博主又通读了遍Keras官方文档,其中ImageDataGenerator的图片生成器就可完成这一目标。

为了尽量利用我们有限的训练数据,我们将通过一系列随机变换堆数据进行提升,这样我们的模型将看不到任何两张完全相同的图片,这有利于我们抑制过拟合,使得模型的泛化能力更好。在Keras中,这个步骤可以通过keras.preprocessing.image.ImageGenerator来实现,这个类使你可以:在训练过程中,设置要施行的随机变换通过.flow或.flow_from_directory(directory)方法实例化一个针对图像batch的生成器,这些生成器可以被用作keras模型相关方法的输入,如fit_generator,evaluate_generatorpredict_generator。——Keras官方文档

    ImageDataGenerator()是一个图片生成器,同时也可以在batch中对数据进行增强,扩充数据集大小(比如进行旋转,变形,归一化等),增强模型的泛化能力。结合前面的模型和数据训练部分的代码如下:

"""
Description: 训练人脸表情识别程序
"""from keras.callbacks import CSVLogger, ModelCheckpoint, EarlyStopping
from keras.callbacks import ReduceLROnPlateau
from keras.preprocessing.image import ImageDataGenerator
from load_and_process import load_fer2013
from load_and_process import preprocess_input
from models.cnn import mini_XCEPTION
from sklearn.model_selection import train_test_split# 参数
batch_size = 32
num_epochs = 10000
input_shape = (48, 48, 1)
validation_split = .2
verbose = 1
num_classes = 7
patience = 50
base_path = 'models/'# 构建模型
model = mini_XCEPTION(input_shape, num_classes)
model.compile(optimizer='adam', # 优化器采用adamloss='categorical_crossentropy', # 多分类的对数损失函数metrics=['accuracy'])
model.summary()# 定义回调函数 Callbacks 用于训练过程
log_file_path = base_path + '_emotion_training.log'
csv_logger = CSVLogger(log_file_path, append=False)
early_stop = EarlyStopping('val_loss', patience=patience)
reduce_lr = ReduceLROnPlateau('val_loss', factor=0.1,patience=int(patience/4),verbose=1)
# 模型位置及命名
trained_models_path = base_path + '_mini_XCEPTION'
model_names = trained_models_path + '.{epoch:02d}-{val_acc:.2f}.hdf5'# 定义模型权重位置、命名等
model_checkpoint = ModelCheckpoint(model_names,'val_loss', verbose=1,save_best_only=True)
callbacks = [model_checkpoint, csv_logger, early_stop, reduce_lr]# 载入数据集
faces, emotions = load_fer2013()
faces = preprocess_input(faces)
num_samples, num_classes = emotions.shape# 划分训练、测试集
xtrain, xtest,ytrain,ytest = train_test_split(faces, emotions,test_size=0.2,shuffle=True)# 图片产生器,在批量中对数据进行增强,扩充数据集大小
data_generator = ImageDataGenerator(featurewise_center=False,featurewise_std_normalization=False,rotation_range=10,width_shift_range=0.1,height_shift_range=0.1,zoom_range=.1,horizontal_flip=True)# 利用数据增强进行训练
model.fit_generator(data_generator.flow(xtrain, ytrain, batch_size),steps_per_epoch=len(xtrain) / batch_size,epochs=num_epochs,verbose=1, callbacks=callbacks,validation_data=(xtest,ytest))

5. 系统UI界面的实现

    上面的模型训练好了,但对于我们来说它的作用就只是知道了其准确率还行,其实深度学习的目的最重要还是应用,是时候用上面的模型做点酷酷的东西了。可不可以用上面的模型识别下自己表达的情绪呢?不如做个系统调取摄像头对实时画面中的表情进行识别并显示识别结果,既能可视化的检测模型的实用性能,同时使得整个项目生动有趣激发自己的创造性,当你向别人介绍你的项目时也显得高大上。这里采用PyQt5进行设计,首先看一下最后的效果图,运行后的界面如下:

图片展示

    设计功能:一、可选择模型文件后基于该模型进行识别;二、打开摄像头识别实时画面中的人脸表情;三、选择一张人脸图片,对其中的表情进行识别。选择一张图片测试识别效果,如下图所示:

图片展示

本文转载自思绪无限:人脸表情识别系统介绍——上篇(python实现,含UI界面及完整代码)_思绪无限的博客-CSDN博客_人脸表情识别系统

感谢大家的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌布莱克·勒莫因:为什么我觉得AI已觉醒了?

来源:科技智谷编辑:Light人们在 AI 身上寄托了感情,被一系列拟人化的 AI 术语误导,LaMDA 本质就是个聊天机器人。谷歌工程师布莱克勒莫因(Blake Lemoine)上周发布了一份他分发给同事的文件,引起…

阿里云数据库Mysql被黑

阿里云数据库Mysql被黑 打开Mysql查看数据库时,发现所有的服务器上的数据库被黑 百度翻译了一下: 总结一下: 以下是常用的可以保护数据库的方式,供参考。可以有效防止被攻击。 1.密码强化,使用复杂密码设置&#xff0…

集体心智:社会网络拓扑塑造集体认知

来源:集智俱乐部作者:Ida Momenneja译者:许逸聪审校:陈斯信编辑:邓一雪导语人类是社会动物,人类的认知也是通过在社会网络中学习和记忆而形成。人类的社会网络与其他物种不同,有着复杂多样的成分…

OpenAI最新研究:AI模型看看视频,就学会了玩《我的世界》

《我的世界》里,玩家不一定都是人类,现在 AI 也会玩了。来源:机器之心《我的世界》是全球知名度最高的开放世界游戏。小朋友只需观看十分钟的教学视频,就能学会在游戏中寻找稀有的钻石,但这却是 AI 此前无法企及的高度…

机器的崛起:隐藏的控制论历史

来源:sayonly在二战后的几年里,计算机作为一种“思维机器”是如此的新奇和未知,而且,进步似乎是无限的。新的思维机器可以计算得出如何建造摩天大楼、如何经营证券交易所以及如何飞向月球。唯一的极限是想象力。“超级大脑”是等待…

Richard Sutton:经验是AI的终极数据,四个阶段通向真正AI的发展之路

来源:智源社区导读:强人工智能的发展是近年来关注的话题。让AI从人类的感知和行为,而非单纯的标注数据中学习,成为许多研究者关注的重点。其中,如何利用人类习得的日常生活经验,启发构建能够适应不同环境&a…

一张图带你了解JRE、JDK、JVM

目录 1.JRE 2.JDK 3.JVM 三者关系: 1.JRE JRE是Java Runtime Environment,Java 运行环境,包含Java运行的环境和核心类库。 2.JDK JDK是 Java Development Kit,Java 开发工具包,包含Java编译工具和运行工具。 3.JV…

机器的崛起:隐藏的控制论历史(二)

来源:sayonly大家好,我是只说,我在《图说元宇宙》之外开了一个新的番外,叫《元宇宙新使命》,本文是第34篇,“机器的崛起:隐藏的控制论历史(二)”。在上一篇文章中&#x…

毕业设计-基于Python爬虫的疫情数据可视化系统

基于Python爬虫的疫情数据可视化系统 采用EChartsFlaskRequests架构: 源码加3105088663

不要再「外包」AI 模型了!最新研究发现:有些破坏机器学习模型安全的「后门」无法被检测到...

来源:AI科技评论作者:王玥、刘冰一、黄楠编辑:陈彩娴一个不可检测的「后门」,随之涌现诸多潜伏问题,我们距离「真正的」机器安全还有多远?试想一下,一个植入恶意「后门」的模型,别有…

Git命令:常用Git命令集合

1.Git基本工作流程 2.命令 命令作用git init初始化,创建 git 仓库git status查看 git 状态 (文件是否进行了添加、提交操作)git add 文件名添加,将指定文件添加到暂存区git commit -m 提交信息提交,将暂存区文件提交到…

从微观到宏观:涌现的实质是信息转换?

来源: 集智俱乐部作者:梁金编辑:邓一雪导语之前的研究表明,还原并非总是好的科学策略,一些情况下,降维可以增加系统元素之间的依赖性,使得粗粒化的宏观尺度比底层微观尺度携带更多有效信息&…

Java栈内存、堆内存、方法区对对象和引用的关系

问题:Java栈内存、堆内存、方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码&#xff…

清华徐勇、段文晖研究组开发出高效精确的第一性原理电子结构深度学习方法与程序...

来源:ScienceAI第一性原理计算已被广泛应用于物理、材料、化学、生物相关的科学研究。然而,受限于计算效率和精度,如何实现大尺度材料体系的第一性原理研究是该领域的一个重大挑战。基于人工神经网络的深度学习方法为解决该挑战问题带来了曙光…

图灵奖获得者罗杰·瑞迪:AI不可能取代人类

来源:中国电子报作者:张维佳编辑:赵晨美编:马利亚监制:赵晨6月24日,图灵奖获得者、美国国家工程院院士、美国艺术与科学学院院士、中国工程院外籍院士罗杰瑞迪在第六届世界智能大会上表示,对待A…

LeCun用62页论文公布未来十年研究计划:AI自主智能

来源:量子位 | 公众号 QbitAI丰色 发自 凹非寺这段时间,关于“AI未来往哪走的”讨论,可以说是越来越激烈了。先是Meta被曝AI相关部门大重组,又有谷歌AI是否具备人格大讨论,几乎每一次讨论都能看到Yann LeCun的身影。现…

Java面试知识点:Date类、异常

问题:Java面试知识点:Date类、异常 答案: 1.Date类 代码如下: (1)创建日期: package com.xy;import java.util.Date;/*** ProjectName: day01* Package: com.xy* ClassName: test01* Author…

Cell解开谜题:原来是这种细胞教会新生的T细胞如何区分敌我!

来源:生物通研究人员发现了一种新的机制,可以教会正在训练中的免疫细胞在攻击病原体时保护自身组织。作为这种早期教育的一部分,专门的胸腺细胞会“摆”成不同的组织,教会免疫系统如何识别朋友和敌人。错误地对身体自身蛋白质做出…

Java面试知识点:集合、Set、泛型、HashSet、HashMap

Java面试知识点:集合、Set、泛型、HashSet、HashMap 答案: 1.集合 集合和数组的对比小结 1,数组的长度是不可变的,集合的长度是可变的。 2 ,数组可以存基本数据蟀和引用数据类型。 集合只能存引用数据类型&#xff0…

Java面试知识点:红黑树、Stream流

问题:Java面试知识点:红黑树、Stream流 答案: 1.红黑树 红黑树 • 平衡二叉B树 • 每一个节点可以是红或者黑 • 红黑树不是高度平衡的,它的平衡是通过“自己的红黑规则”进行实现的 2.Stream流 Stream流的常…