长春大学,吉林长春,130000
摘要:本文题目为基于tensorflow的人脸表情识别算法的研究,通常科学家把面部表情识别主要将表情划分为七个种类,整个人脸表情识别研究将会划分为四个过程:数据预处理、卷积神经网络的搭建、模型的训练与人脸表情的识别界面的设计,第一部分包括对数据集的预处理和利用卷积网络搭建的神经网络与训练模型,第二部分为加载模型进行人脸表情识别测试,其中创新点就是使用pyqt5进行GUI界面设计封装,增加系统的界面简洁性与用户体验感。其中最大的难点就是搭建卷积神经网络与训练的过程花费的时间。
关键词:人脸表情识别 深度学习 人工智能
1引言
目前,一个高效率、高性能的人脸表情识别系统是非常被需要的,它能够尽责任的被运用在普通日常的许多场景中。表情识别一直都在研究热门中,而tensorflow便携、高效、可扩展用于人脸表情的研究也是对此的一种推进。在本文中主要结合tensorflow对人脸表情识别进行研究,制作一个GUI界面进行人脸表情识别认证。
2 Tensorflow相关基础
2.1 Tensorflow介绍
Tensorflow是一个将复合的数据组成结构通过使用计算图的方式进行分析和处输过程的程序设计系统。计算图是在“node-edge-node”转换模式下传输数据的非形象概念。Tensorflow的根本计算模型解释为向量a、b强势的向节点add进行传输。
2.1.2tensorflow数据读取
现有文章中对于Tensorflow数据的处理普遍会划分为有一共两种存取数据的通用方法:1、Feeding(供给数据)用Python编程语言来对数据进行控制处理后把被处理的数据供给到计算图中。2、tf.data API(文件读取)将待处理的文件数据用一个输入管道进行数据的读取。
2.1.3运行模型(会话)
在Tensorflow框架中能够划分以两种模式进行会话可以分为:
1、普通调用Sess.run需要明确调用会话生成函数以及使用完成后,关闭会话函数回收资源,使用该模式时必要明确的Sess.close关掉会话,不然会造成资源泄露的问题。
2、可以经过使用Python编程的(With as)上下文管理器进行封装创建会话,可以解决不正常退出程序而导致的资源泄露问题,当程序结束时上下文管理器时会主动封锁一切资源。
2.2 Tensorflow平台特性
Tensorflow后端是利用C++、CUDA进行保障高效性,其资料库中拥有海量辅佐函数来简化构建图的任务,容易上手,简单易用。其接口可以被使用于C/C++语言以及Python等,其余的编程语言也能够通过SWIG工具来间接运用该接口。Tensorflow程序能够划分为构建(bu)图和执行(execution)图两个阶段。
2.3 Tensorflow环境配置
本研究实验环境为:Tensorflow2.0(CPU)+python3.9+CUDA8.17.13.4505
2.Tensorflow-CPU版本比较方便合适大部分电脑,对显卡要求不高,所以选择安装Tensorflow-CPU版本,从应用中打开命令提示符(cmd)窗口,如果pip包已经很久没有更新使用,提议进行升级,因为若版本过旧,不能安装最近更新的包。
3 基于Tensorflow人脸表情识别
3.1 数据集与预处理
3.1.1数据集的选择
fer2013.csv数据集的组成为由首行为表头说明三列数据的具体含义与命名,首列为心情标签(即表明表情种类);第二列为图片转化成的所有数据(即像素值)以数组格式储存;尾列为三类数据用途的标注(即为训练集或测试集或验证集)。
3.1.2数据集的预处理
信息包含了图片的标签(label),图片的高度(height)与宽度(width)还有图片的数据(raw),分别对应了value为 label,height,width,raw的feature。
最终将测试部分(Training)公共验证部分(PublicTest)和私有验证部分(PrivateTest)数据分别生成fer2013_train、fer2013_test、fer2013_eavl三个TFRECORD文件
3.2 搭建卷积神经网络
3.2.1 GoogleNet原理
主要选择运用Inception mode来进行对特征映射厚度的减低作用。最大优点是使用小计算量却提高一层特征变化与非线性化属于性价比较高的一类Inception模型。
3.2.2深度卷积神经网络模型
相对于传统分类方法,神经网络能够在特征提取和分类范畴同时延伸,改变了传统手工编码提取特征的方式,将其优化成自动化一种端到端(ETE)的学习。
本文所使用Tensorflow的API接口与函数:
tf.get_variable()函数用于截获一个已经存在的变量或者创立一个崭新的变量。
本研究将卷积层与输入层分为两个函数分别定义,优化器选择Adam Optimize,学习率设为0.001,train_step_ = tf.train.AdamOptimizer(self.lr).minimize(loss_, name='train_step')。详细内容如下表1所示:
表1
种类 | 描述 | 核 | 步长 | 填充 | 输出 | 丢弃 |
Input | - | - | - | - | 48*48*1 | - |
Conv1 | 卷积层和relu | 1*1 | 1 | - | 48*48*32 | - |
Conv2 | 卷积层和relu | 5*5 | 1 | 2 | 48*48*32 | - |
Pool2 | 最大池化 | 3*3 | 2 | - | 23*23*32 | - |
Conv3 | 卷积层和relu | 3*3 | 1 | 1 | 23*23*32 | - |
Pool3 | 最大池化 | 3*3 | 2 | - | 11*11*32 | - |
Conv4 | 卷积层和relu | 5*5 | 1 | 2 | 11*11*64 | - |
Pool4 | 最大池化 | 3*3 | 2 | - | 5*5*64 | - |
3.3 模型训练与测试
3.3.1模型训练
通过编写数据增强函数pre_process_img,使得模型在训练过程中出现过多的网络过拟合现象,通过对训练集数据的变换可以得到泛化能力更强的深度网络顺应于实际场景。tf.image.resize_images函数:调整图像的像素大小至48×48。
编写读取TFRECORD文件数据函数__parse_function_csv,tf.cast函数:将 tensorflow 中张量数据转换类型即将features类型由int64变为int32,tf.multiply函数:将[48,48,1]与1./255中对应元素各自相乘。
正式开始训练时,每一步骤(step)训练过程,都要打开tensorflow会话,使用session的run方法执行计算,进行数据的读取,并引用载入所构建的卷积神经网络。
3.3.2模型测试
模编写代码验证模型准确率,先布置存放表情识别模型、人脸识别模型(opencv自带'haarcascade_frontalface_alt.xml')、需要验证的图片路径。新建一个列表存放7中表情种类['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'],然后使用Session来激活ckpt文件对话。
模型测试主要分为三步:
1、建立人脸表情文件夹:收集所需要识别的人脸图像存放到一个文件夹。
2、创建函数对所需要识别的图形进行数据处理
创建函数advance_image(images_):输入图像格式做统一处理。新建列表(rsz_img)用for循环将一张一张图像filp水平翻转后的数组数据,resize重新规定为48*48数组,且np.reshape重新规定数组组成为[48,48,1]存入后,在建一个新列表(rsz_imgs)把(rsz_img)转换为numpy.array格式存入。具体方式为:image(np)、filp、X×Y数组、reszie、48*48数组、reshape、48*48*1(np)。
创建函数predict_emotion(image_):调用produce_result(images_)使用模型进行预测表情。创建函数face_detect():调用人脸识别模型进行人脸识别定位。为了加快检测速度,过滤噪点目标的目的,选择使用detectMultiScale函数中目标检测对象的最大与最小两极尺寸。最终效果展示如下图2:
图2 识别实例图
3.4本章小结
经过测试与诸多fer2013模型的测试对比发现,netural表情最多,happy,surprise 因为他们都是以皱眉,抿嘴等一系列的动作来辨别表情的,不利于相互之间做明显区分。如下表2所示:
表2测试结果
angry | disgust | fear | happy | sad | surprise | neutral | |
angry | 0.682 | 0.022 | 0.1699 | 0.0112 | 0.1423 | 0.0154 | 0.1122 |
disgust | 0.117 | 0.6692 | 0.0691 | 0.0025 | 0.0144 | 0.0189 | 0.0087 |
fear | 0.087 | 0.0197 | 0.652 | 0.0034 | 0.0982 | 0.0584 | 0.0031 |
由表2可以看出开心的表情准确率是最高的,因为他们本身的独有特点是比较独特与其他表情没有太大的相似性。生气,不安与伤心的准确率相对来说比较低都在65%-72%之间,并且相互识别也达到了10%的几率会识别错误为相互的表情,主要原因为在训练集中,各类表情数据量占比不统一,表情特征的相似性,从而导致模型具有倾向性。
4 系统设计与实现
4.1 系统设计
4.1.1系统功能需求
用户可以通过生成的UI界面进行提交图像。并且进一步明确各个功能之间的关联性以及是否达到目的准确率。
4.1.2系统模块流程
人脸表情识别系统数据处理流程打开摄像头、抽取视频帧、水平翻转、转为灰度图、是否含人脸、调用API、人脸及表情标注、数据展示。
4.2相关技术
4.2.1pyqt5介绍
pyqt5特性为:跨平台性、高性能的GUI控件、对QT库进行完全封装、提供一整套齐全的窗口控件,可以利用IDE进行对界面设计与制作,其最大优点是一键生成Python代码。
本系统用到的pyqt5模块为:
1、QtGui:包括窗口控件、字体与文字类。
2、QtMultimedia:包括处理多媒体和调节使用摄像头API的类。
3、QtWidgets:创建主窗口及其主要组成部分
4.2.2 opencv介绍
英特尔公司发起并参与开发。开始出现在人们认知世界。OpenCV可利用于实时性的图像处理的开发、计算机视觉、模式辨别程序以及对象鉴别、图形滤波、模块匹配、颜色空间、人机交互、图形分区、物体、姿势、人脸识别、动作跟踪、机器人等等领域。
主要用到的模块:
video视频剖析组件与core主要核心功能模块
4.2.3具体设计
抽取视频帧:VideoCapture()可在构造函数中打开视频,当参数为0时,默认打开本机摄像头获取视频流,若还带有其他摄像头可通过修改参数进行选择。
图像预处理:cvtColor() 方法可用于转换图像的色彩空间,参数为cv2.COLOR_BGR2RGB代表把视频色彩转换回RGB,这样才是现实的颜色,因为一开始读取彩色图像得到的格式是BGR格式。
表情检测标准:在调用人脸检测接口时带上训练所得的模型参数,即可对这张人脸图片进行情绪识别,并且通过putText添加表情文字。
界面设计:self.timer_camera = QtCore.QTimer()定义了定时器用于控制视频的帧率,使用QtWidgets.QVBoxLayout,将案件向左垂直平均分布布局,设置四个按键打开图片、退出、打开图片、关闭图片,界面右侧还有个label窗口用于打开的图片显示在此地。
需要把读取到的视频数据由np.array格式变成QImage形式再通过setPixmap()把摄像头数据映射到主界面窗口中。
4.3 本章小结
该系统现在可以实时识别人脸表情也可以通过图片进行识别人脸表情,并且可以同时进行多个人了进行检测,主要是基于Tensorflow与卷积神经网络的一个表情识别研究,后期可以优化界面,增加友好交互性,界面美观性,还可以优化作为网课实时监控学生的表情变化,提供给上网课的老师们使用,让最终的识别系统功能更加完善。
5 总结
本研究题目为基于Tensorflow的表情识别算法研究,主要工作是收集数据集进行预处理和搭建卷积神经网络,利用OpenCV进行对视频流的分析,并用PYQT5进行GUI界面封装。可以进一步的针对图像识别,在表情识别的基础上加入性别识别与年龄识别一起研究,利用残差resnet网络进行优化搭建卷积神经网络,从而提高识别的准确率。利用qtdesigner设计系统界面,完善识别系统,增加系统操作性和美化界面可观性。
参考文献
[1]郑攀海, 郭凌, 丁立兵. 基于TensorFlow的卷积神经网络的研究与实现[J]. 电子技术与软件工程, 2018, 000(018):P.20-22.
[2]产文涛. 基于卷积神经网络的人脸表情和性别识别[D]. 2016.
[3]钟思志. 人脸面部表情识别算法研究[D]. 华东师范大学, 2015.