【图像识别】表情检测matlab源码

的表情识别可以用单个感官完成,也可以用多个感官相配合来完成。它是一个整体识别和特征识别共同作用的结果。具体说来,远处辨认人,主要是整体识别,而在近距离面部表情识别中,特征部件识别则更重要。另外,人脸上各部件对识别的贡献也不相同,如眼睛和嘴巴的重要程度大于鼻子。根据对人脑的研究表明,人脸的表情识别和人脸识别虽然存在联系,但总体说是分开、并行的处理过程。

    随着人脸的计算机处理技术(包括人脸检测和人脸识别)不断完善,利用计算机进行面部表情分析也就成为可能。总体而言,表情分析是一个非常困难的研究方向,主要体现在表情特征提取的准确性和有效性上。尤其是后者,因为各种表情本身体现在各个特征点运动上的差别就不是很大,例如:嘴巴张开并不代表就是笑,也有可能是哭和惊讶等。

    人脸表情识别技术目前主要的应用领域包括人机交互、安全、机器人制造、医疗、通信和汽车领域等。

    1971年,心理学家Ekman与Friesen的研究最早提出人类有六种主要情感,每种情感以唯一的表情来反映人的一种独特的心理活动。这六种情感被称为基本情感,由愤怒(anger)、高兴(happiness)、悲伤 (sadness)、惊讶(surprise)、厌恶(disgust)和恐惧(fear)组成。

    以下所讲到的一些方法都是从人脸识别演变而来,结合表情识别的特点而运用。

    目前所用到的识别特征主要有:灰度特征、运动特征和频率特征三种。灰度特征是从表情图像的灰度值上来处理,利用不同表情有不同灰度值来得到识别的依据。这种情况下要求图像对光照、角度等因素要进行充分的预处理,使获得的灰度值具有归一性。运动特征利用了不同表情情况下人脸的主要表情点的运动信息来进行识别。频域特征主要是利用了表情图像在不同的频率分解下的差别,速度快是其显著特点。

    在具体的表情识别方法上,方向主要有三个:整体识别法和局部识别法、形变提取法和运动提取法、几何特征法和容貌特征法。
    整体识别法中,无论是从脸部的变形出发还是从脸部的运动出发,都是将表情人脸作为一个整体来分析,找出各种表情下的图像差别。其中典型的方法有:基于特征脸的主分量分析(Principal Component Analysis,PCA)法、独立分量分析法(Independent Component Analysis,ICA)、Fisher线性判别法(Fisher’s Linear Discriminants,FLD)、局部特征分析(Local Feature Analysis,LFA)、Fisher运动法(Fisher Actions)、隐马尔科夫模型法(Hide Markov Model,HMM)和聚类分析法。

    局部识别法就是将人脸的各个部位在识别时分开,也就是说各个部位的重要性是不一样。比如说在表情识别时,最典型的部位就是眼睛、嘴、眉毛等,这些地方的不同运动表示了丰富的面部表情。相比较而言,鼻子的运动就较少,这样在识别时就可以尽量少的对鼻子进行分析,能加快速度和提高准确性。其中最典型的方法就是脸部运动编码分析法(Facial Actions Code System,FACS)和MPEG-4中的脸部运动参数法。其他的还有局部主分量分析法(Local PCA)、Gabor小波法和神经网络法。人脸运动编码系统FACS (Facial Action Coding System),根据面部肌肉的类型和运动特征定义了基本形变单元AU(Action Unit),人脸面部的各种表情最终能分解对应到各个AU上来,分析表情特征信息,就是分析面部AU的变化情况,

FACS有两个主要弱点:1.运动单元是纯粹的局部化的空间模板;2.没有时间描述信息,只是一个启发式信息

    形变提取法是根据人脸在表达各种表情时的各个部位的变形情况来识别的,主要的方法有:主分量分析法(PCA)、Gabor小波、运动模板法(Active Shape Model,ASM)[7]和点分布模型(Point Distribution Model,PDM)法。

    运动法是根据人脸在表达各种特定的表情时一些特定的特征部位都会作相应的运动这一原理来识别的。在上面提到的6种基本的表中,脸上一些固定的特征点(或部位)的运动方向或趋势是固定的,比如说人在恐惧的时候,眼睛张开的幅度应该比正常时要大,嘴一般是张开的等等,具体情况见表1。典型的识别方法有:光流法(Optical Flow)[8]和MPEG-4中的脸部运动参数法(Face Animation Parameter FAP)。

扫描二维码关注公众号,回复: 12481332 查看本文章

    几何特征法是根据人的面部的各个部分的形状和位置(包括嘴、眼睛、眉毛、鼻子)来提取特征矢量,这个特征矢量来代表人脸的几何特征。根据这个特征矢量的不同就可以识别不同的表情。重要的方法是:基于运动单元(AU)的主分量分析法。在容貌特征法中,主要是将整体人脸或者是局部人脸通过图像的滤波,以得到特征矢量。常用的滤波器是Gabor小波。

    当然,这三个发展方向不是严格独立,它们只是从不同侧面来提取所需要的表情特征,都只是提供了一种分析表情的思路,相互联系,相互影响。有很多种方法是介于两者甚至是三者之间。例如说面部运动编码系统法是局部法的一种,同时也是从脸部运动上考虑的等等。

人脸表情识别的过程和方法

1、表情库的建立

目前,研究中比较常用的表情库主要有:

美国CMU机器人研究所和心理学系共同建立的Cohn-Kanade AU-Coded Facial Expression Image Database(简称CKACFEID)人脸表情数据库;

日本ATR建立的日本女性表情数据库(JAFFE),它是研究亚洲人表情的重要测试库

fer2013人脸数据集,可以从kaggle网站上下载

更多库--->  参考链接

2、表情识别:

(1)图像获取:通过摄像头等图像捕捉工具获取静态图像或动态图像序列。  

(2)图像预处理:图像的大小和灰度的归一化,头部姿态的矫正,图像分割等。

目的:改善图像质量,消除噪声,统一图像灰度值及尺寸,为后序特征提取和分类识别打好基础

主要工作:人脸表情识别子区域的分割以及表情图像的归一化处理(尺度归一和灰度归一) 

(3)特征提取:将点阵转化成更高级别图像表述—如形状、运动、颜色、纹理、空间结构等, 在尽可能保证稳定性和识别率的前提下,对庞大的图像数据进行降维处理。

特征提取的主要方法有:提取几何特征、统计特征、频率域特征和运动特征等

1)采用几何特征进行特征提取主要是对人脸表情的显著特征,如眼睛、眉毛、嘴巴等的位置变化进行定位、测量,确定其大小、距离、形状及相互比例等特征,进行表情识别

优点:减少了输入数据量

缺点:丢失了一些重要的识别和分类信息,结果的精确性不高 

2)基于整体统计特征的方法主要强调尽可能多的保留原始人脸表情图像中的信息,并允许分类器发现表情图像中相关特征,通过对整幅人脸表情图像进行变换,获取特征进行识别。

主要方法:PCA(主成分分析)和ICA(独立主元分析)

PCA用一个正交维数空间来说明数据变化的主要方向 优点:具有较好的可重建性 缺点:可分性较差

ICA可以获取数据的独立成份,具有很好的可分性

基于图像整体统计特征的提取方法缺点:外来因素的干扰(光照、角度、复杂背景等)将导致识别率下降

3)基于频率域特征提取: 是将图像从空间域转换到频率域提取其特征(较低层次的特征)

 主要方法:Gabor小波变换

 小波变换能够通过定义不同的核频率、带宽和方向对图像进行多分辨率分析,能有效提取不同方向不同细节程度的图像特征并相对稳定,但作为低层次的特征,不易直接用于匹配和识别,常与ANN 或SVM 分类器结合使用,提高表情识别的准确率。 

4)基于运动特征的提取:提取动态图像序列的运动特征(今后研究的重点)

 主要方法:光流法

 光流是指亮度模式引起的表观运动,是景物中可见点的三维速度矢量在成像平面上的投影,它表示景物表面上的点在图像中位置的瞬时变化,同时光流场携带了有关运动和结构的丰富信息

 光流模型是处理运动图像的有效方法,其基本思想是将运动图像函数f(x, y,t)作为基本函数,根据图像强度守恒原理建立光流约束方程,通过求解约束方程,计算运动参数。

 优点:反映了表情变化的实质,受光照不均性影响较小

 缺点:计算量大 

4)分类判别:包括设计和分类决策

在表情识别的分类器设计和选择阶段,主要有以下方法:用线性分类器、神经网络分类器、支持向量机、隐马尔可夫模型等分类识别方法

5.1)线性分类器:假设不同类别的模式空间线性可分,引起可分的主要原因是不同表情之间的差异。

5.2)神经网络分类器:人工神经网络(Artificial Neural Network,ANN)是一种模拟人脑神经元细胞的网络结构,它是由大量简单的基本元件—神经元,相互连接成的自适应非线性动态系统。将人脸特征的坐标位置和其相应的灰度值作为神经网络的输入,ANN可以提供很难想象的复杂的类间分界面。

 神经网络分类器主要有:多层感知器、BP网、RBF网

 缺点:需要大量的训练样本和训练时间,不能满足实时处理要求

5.3)支持向量机(SVM)分类算法:泛化能力很强、解决小样本、非线性及高维模式识别问题方面表、新的研究热点

基本思想:对于非线性可分样本,首先通过非线性变换将输入空间变换到一个高维空间,然后在这个新空间中求取最优线性分界面。这种非线性变换通过定义适当的内积函数实现,常用的三种内积函数为:多项式内积函数、径向基内积函数、Sigmoid内积函数

5.4)隐马尔可夫模型(Hidden Markov Models, HMM):特点:统计模型、健壮的数学结构,适用于动态过程时间序列建模,具有强大的模式分类能力,理论上可处理任意长度的时序,应用范围非常广泛。

优点:运用HMM方法能够比较精确的描绘表情的变化本质和动态性能

5.5)其他方法:

  基于人脸物理模型的识别方法,将人脸图像建模为可变形的3D网格表面,把空间和灰度放在一个3D空间中同时考虑。

  基于模型图像编码的方法是使用遗传算法来编码、识别与合成各种不同的表情

四、研究展望

(1)鲁棒性有待提高:

外界因素(主要是头部偏转及光线变化的干扰)

采用多摄像头技术、色彩补偿技术予以解决,有一定效果,但并不理想

(2)表情识别计算量有待降低è确保实时性的要求

(3)加强多信息技术的融合

   面部表情不是唯一的情感表现方式,综合语音语调、脉搏、体温等多方面信息来更准确地推测人的内心情感,将是表情识别技术需要考虑的问题

附现阶段具体的人脸表情识别方法(其实,从这里可以看出,基本就是handcrafted Features + 浅层分类器)

人脸表情识别方法

方法简单描述

优点

缺点

稀疏表示

用稀疏表示法对样本库进行描述,建立超完备子空间,重构并观察残差,最后通过稀疏系数进行分类

操作简单,可以做前期的基础实验,有一定的鲁棒性

描述对象必须要是稀疏的,降低了实际应用价值,对于样本要求也比较高

Gabor变换

通过定义不同的核频率、带宽和方向对图像进行多分辨率分析,能有效提取不同方向不同细节程度的图像特征并相对稳定, 常与ANN 或SVM 分类器结合使用,提高表情识别的准确率

在频域和空间域都有较好的分辨能力,有明显的方向选择性和频率选择特性

作为低层次的特征,不易直接用于匹配和识别,识别准确率也不是很高,样本较少的条件下识别准确率也较低

主成分分析和线性判别

尽可能多的保留原始人脸表情图像中的信息,并允许分类器发现表情图像中相关特征,通过对整幅人脸表情图像进行变换,获取特征进行识别

具有较好的可重建性 缺点:可分性较差

外来因素的干扰(光照、角度、复杂背景等)将导致识别率下降

支持向量机

作为分类器做人脸识别,在表情识别时一般和Gabor滤波器一起使用作为分类器

在小样本下的识别效果较为理想,可以做实时性的表情识别

样本较大时,计算量和存储量都很大,识别器的学习也很复杂

光流法对运动特征提取

是将运动图像函数f (x,y,t)作为基本函数,根据图像强度守恒原理建立光流约束方程,通过求解约束方程,计算运动参数

反映了人脸表情变化的实际规律,受外界环境的影响较小,比如光照条件变化时,识别率不会有太大变化

识别模型和算法较复杂,计算量大

图像匹配法

通过使用弹性图匹配的方法将标记图和输入人脸图像进行匹配

允许人脸旋转,和能够实时处理

会受到其他部位特征的影响,如眼镜,头发等

隐马尔可夫模型

由观察的面部表情序列及模型去计算观察面部表情序列的概率,选用最佳准则来决定状态的转移;据观察的面部表情序列计算给定的模型参数

识别准确率较高,平均在97%以上

对前期的面部表情序列模型要求较高,这对表情识别算法的准确率影响也较大

其他方法如:矩阵分解法

以NMF为例,分解后的基图像矩阵和系数矩阵中的元素均是非负的。将表征人脸各部分的基图像进行线性组合从而表征整个表情图像。

需要的样本较少,在无遮挡时识别准确率90%以上

受外界环境影响较大,识别准确率在嘴巴受到遮挡时,准确率只有80%左右


% code optimized for the following assumptions:
% 1. Only one face in scene and it is the primary object
% 2. Faster noise reducion and face detection

% Originaly by Tolga Birdal
% Implementation of the paper:
% "A simple and accurate face detection algorithm in complex background"
% by Yu-Tang Pai, Shanq-Jang Ruan, Mon-Chau Shie, Yi-Chi Liu

% Additions by Tolga Birdal:
%  Minimum face size constraint
%  Adaptive theta thresholding (Theta is thresholded by mean2(theata)/4
%  Parameters are modified by to detect better. Please check the paper for
%  parameters they propose.
% Check the paper for more details.

% usage:
%  I=double(imread('c:\Data\girl1.jpg'));
%  detect_face(I);
% The function will display the bounding box if a face is found.


function [aa,SN_fill,FaceDat]=detect_face(I)

close all;
I=imread('./Test/Image029.jpg');
% No faces at the beginning
Faces=[];
numFaceFound=0;

I=double(I);

H=size(I,1);
W=size(I,2);

%%%%%%%%%%%%%%%%%% LIGHTING COMPENSATION %%%%%%%%%%%%%%%

C=255*imadjust(I/255,[0.3;1],[0;1]);

figure,imshow(C/255);
% title('Lighting compensation');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%% EXTRACT SKIN %%%%%%%%%%%%%%%%%%%%%%
YCbCr=rgb2ycbcr(C);
Cr=YCbCr(:,:,3);

S=zeros(H,W);
[SkinIndexRow,SkinIndexCol] =find(10<Cr & Cr<255);
for i=1:length(SkinIndexRow)
    S(SkinIndexRow(i),SkinIndexCol(i))=1;
end

m_S = size(S);
S(m_S(1)-7:m_S(1),:) = 0;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%% REMOVE NOISE %%%%
% figure;imshow(S);

SN=zeros(H,W);
for i=1:H-5
    for j=1:W-5
        localSum=sum(sum(S(i:i+4, j:j+4)));
        SN(i:i+5, j:j+5)=(localSum>20);
    end
end

%     figure;imshow(SN);
    
 Iedge=edge(uint8(SN));
 
%  figure;imshow(Iedge);
 
SE = strel('square',9);
SN_edge = (imdilate(Iedge,SE));


% 
% SN_edge =  SN_edge1.*SN;
 
%  figure;imshow(SN_edge);
 
 SN_fill = imfill(SN_edge,'holes');
 figure;imshow(SN_fill);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%% FIND SKIN COLOR BLOCKS %%%%

[L,lenRegions] = bwlabel(SN_fill,4);
AllDat  = regionprops(L,'BoundingBox','FilledArea');
AreaDat = cat(1, AllDat.FilledArea);
[maxArea, maxAreaInd] = max(AreaDat);

FaceDat = AllDat(maxAreaInd);
FaceBB = [FaceDat.BoundingBox(1),FaceDat.BoundingBox(2),...
    FaceDat.BoundingBox(3)-1,FaceDat.BoundingBox(4)-1];

aa=imcrop(rgb2gray(uint8(I)).*uint8(SN_fill),FaceBB);

 figure,imshow(aa);
 title('Identified Face');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

end

猜你喜欢

转载自blog.csdn.net/qq_34763204/article/details/113798696