- 注:实现本文Python代码需要的包:opencv、numpy、matplotlib、sklearn、os,Python版本为Python3.7
- 为了使每段代码效果更直观,本文将会以类似jupyter notebook的形式,在部分代码后展示运行结果。
人脸情绪识别在日常生活中有着极其广泛的用途,例如智慧课堂应用场景中识别学生的面部表情从而给予老师关于课程的反馈、家用监控系统中识别儿童的异常情绪等等。
本文中的情绪识别技术基于JAFFE数据集实现,可以监测识别开心、悲伤、愤怒、厌恶、害怕、惊讶、中性这7种情绪,应用目标则是通过家用监控设备采集到的视频,实现自闭症儿童异常负面情绪的监测。
首先调用需要的包:
import
一、 基于图像特征提取和传统机器学习算法的情绪识别
0.人脸位置的检测
在进行人脸情绪识别时,首要任务就是抓取到图片中的目标人脸区域,再对人脸进行特征提取。在特征提取前,我们采用opencv包中自带的人脸检测文件进行目标区域的检测。将opencv包安装路径的cascades文件夹置于项目目录下,即可调用其中现有的模型。(cascades文件夹也会在本文末尾的GitHub中给出)
下面的detect函数展示了如何调用人脸检测的xml文件。
import
目标区域提取完毕,下面是重头戏——特征提取。
1.1 利用Gabor变换进行图像特征提取
数字图像处理中最常用的方法无疑是傅立叶变换,它将任意信号分解为许多不同频率正弦波的组合,可以实现信号在时域和频域的相互转换,但它最大的缺陷就是无法用于变化的非确定、非稳定信号。对于人脸图像这种非确定、非稳定信号,常用的一种特征提取方法是Gabor变换,它也被称为“窗口Fourier变换”。
Gabor变换的本质就是把信号划分成许多个小的间隔,再对每个小间隔进行傅立叶变换,从而兼顾信号在时域和频域的特性。对于二维情况下的图像,将小波变换与Gabor变换结合,得到的二维Gabor变换能够抓取图像中不同位置、不同频率、不同方向上的特征。换言之,二维Gabor变换在人脸图像中,可以较好地提取出人脸的眉毛、鼻子、嘴等面部关键区域的信息。
总而言之,Gabor滤波器是一种在图像处理领域极为优越的特征提取方法。
下面介绍Gabor变换的表达式。
二维Gabor变换的表达式如下所示:
其中各个参数的意义如下:
是波长;
是角度;
是高斯分布标准差;
是椭圆率(横纵比),一般取0.5;
是相位偏移。
公式的后半部分用欧拉公式展开是一个正弦函数的形式,因此该公式实质上是一个高斯分布和一个正弦函数的乘积。
先从
处入手看公式:
如果
,那么Gabor滤波器的内核是一个圆形。
当椭圆率
变动时,Gabor滤波器的内核随之变为不同的椭圆。
话不多说,直接上代码,利用opencv包实现基于Gabor滤波器的特征提取。
首先是一个滤波器的图像展示:
#参数初始化
下面依次尝试增加ksize和
的值:
(注意,当
过大时,可能会错过小图像中的一些特征)
ksize
改变滤波器角度
:
ksize