基于Matlab的人脸表情识别系统(附源码)
本项目是个人在本科期间与同组小伙伴合力完成,界面做的并不是特别精美,但识别效果还算可以,项目已开源,欢迎小伙伴们一同完善,大佬轻喷。下面是相关介绍。
表情是人类除了语言之外的主要沟通方式,是人类表达自身内在情绪的重要途径,它包含了极其丰富的行为信息。本文将介绍一种静态的基于Gabor滤波和ELM极限学习机的人工智能方法实现的人脸表情识别系统,可以对人脸照片进行表情识别分类,网络模型及界面均用matlab编写实现。
下面是本项目的实现的详细介绍。
概述
人类面部表情的实质,是眼晴、眉毛和嘴巴等区域的变化来表现各种情绪形态。依据人脸的解剖学特征,把它分成许多运动单元,研究上述运动特征与它所控制的面部区域 和有关的表情,将表情分为七种基本类别。这七种基本表情类别的肌肉运动都有 其各自独特的规律。
本次实验的目标,主要是利用 PC 机、Matlab 软件以及利用其 GUI 界面完成基本的基于神经网络算法的人脸表情识别系统。最终实现的实验内容及效果为:搭建人脸情感识别系统的 GUI 界面设计,实现加载图像与完成识别的功能,编程实现基于标准数据库的 7 种人脸表情(平静、开心、惊讶、生气、 厌恶、害怕、悲伤)分类。
具体流程为:
图像预处理
人脸表情库是面部表情的标准,它定义了各类表情并有相应表情的图片,供表情识别研究者使用。在此使用的是JAFFE数据库。是由10位日本女性在实 验环境下根据指示做出各种表情,再由照相机拍摄获取的人脸表情图像。整个数据库一共有213张图像,10个人,全部都是女性,每个人做出7种表情,这7种表情分别是:sad、happy、angry、disgust、surprise、fear、neutral。每个人为 一组,每一组都含有7种表情,每种表情大概有3,4张样图。这样每组大概20张样图,图片大小都是256*256。
本项目将图片地址存放在list中,之后访问相应的图片,只需要扫描list的值并进行相应文件夹的寻址即可。在最开始图像预处理环节,我将所有的图片都存放在了Database一个文件夹中,并将每个图片的命名进行提取存放在了S.mat表中,在之后进行Gabor小波或PCA特征提取时直接访问S.mat便可获取照片地址,处理好的新照片存放在Gaborbase和Pcabase文件夹中。
本项目采用的主要是利用rgb2grey函数进行图像灰度归一化的处理。
Gabor小波
因为Gabor特征对干扰因素具备不错的鲁棒性,Gabor特征具有的空间局部性与方向选择性使其能够充分描绘图象的纹理信息。
Gabor变换的实质,是具有窗口可伸缩、核函数频率及带宽可调特性的窗口傅里叶变换。而这种窗口可伸缩、核函数频率及带宽可调的特性与小波变换完全一致,因此又称为Gabor小波变换。Gabor滤波器的频率和方向表达同人类视觉系统类似。经过研究发现, Gabor滤波器其实十分适合纹理表达和分离,生物学上可以很好地近似单细胞的感受函数,所以十分适合进行数据预处理。
Gabor变换定义为:
Gf(a,b,w)=∫−∞+∞f(t)e−iωtdt
其中
ga(t)=12πaexp(−t24a)
上式是高斯函数,也可以称之为窗函数。
对于二维 Gabor 的滤波公式,可以表示为以下方式,对于复数表达来说:
g(x,y;λ,θ,φ,σ,γ)=exp(−x′2+γ2y′22σ2)exp(i(2πx′λ+φ))
其含义分别为:
1、波长 λ :它的值以像素为单位指定,通常大于等于2。但不能大于输入图像尺寸的五分之一。通常用的是它的倒数频率 f 大于等于0.2。
2、方向 θ :这个参数指定了Gabor函数并行条纹的方向,它的取值为0到360度。
3、相位偏移 ϕ :它的取值范围为-180度到180度。其中,0-180度分别对应中心对称的center-on函数和center-off函数,而-90度和90度对应反对称函数。
4、长宽比 γ ::空间纵横比,决定了Gabor函数形状。
在JAFFE数据库中选取某张图片,倘若大小为140 像素*140像素,在此基础上,构建Gabor滤波器,选取2个尺度及4个方向提取特征:
如果假设图象为 M∗N 像素,经过四十个滤波器获得的Gabor特征维数可以达到 40∗N∗M 。故需要降维处理。
PCA降维处理
PCA的主要方式是将n维特征映射到k维上(k<n),这k维是全新的正交特征。这k维特征称为主成分,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。原理在此不再过多介绍,代码讲解部分会在后面介绍。
ELM极限学习机
极限学习机是一种快速学习算法,在单隐层神经网络,它可以随机初始化输入权重和偏置并得到相应的输出权重。输入神经元是把输入信号给到隐含层。隐含层是由径向基两数或激活函数构成,对输入层的数据通过加权等操作进行计算,其变换为非线性的,节点越少计算越简单。输出层主要是神经网络的输出,通常是隐含层结果的线性叠加。
ELM是针对单隐层前馈神经网提出的新算法。含有L个隐含层节点的SLFN的输出表达式为:
fL(x)=∑i=1LβiG(ai,bi,x)
给定任意 N 个样本,如果含有 L 个隐含节点的SLFN以任意小的误差来逼近这 N 个样本,则存在:
fL(xj)=∑i=1LβiG(ai,bi,xj)=tj(j=1,L,N)
上式简化为:
Hβ=T
其中:
H(a1,L,aN,b1,L,bN,x1,L,xN)=[G(a1,b1,x1)LG(aN,bN,x1)MLMG(a1,b1,xN)LG(aN,bN,xN)]N×N
其中式子里的 H 代表隐含层输出矩阵, β 可以得到如下的解:
β^=H+T