TensorFlow+SVM+迁移学习 实现基于人脸表情识别的音乐播放器

介绍

      本项目使用深度神经网络对人面进行特征提取,再通过SVM进行表情分类,先判断出人表现出的表情,再通过隐马尔科夫模型,判断人的情绪状态,进而根据人物的情绪来播放相应的音乐,使使用者能获得更好的音乐享受。

     首先,在3s内通过摄像头采集人物面部图像10张,先分别进行人脸识别并裁剪出五官图像,然后通过深度卷积神经网络完成特征提取,再通过支持向量机对其进行分类,这里所使用的支持向量是由7500张带标签的训练表情图像得到的。这里采用了机器学习方法中的SVM(支持向量机),实验结果表明在此处采用SVM具有更高的正确识别率。将识别结果进行分类,分类标签为人类五大情绪,即:快乐、惊讶、平静、伤心、愤怒五种,通过分类结果获得一个人脸表情观测序列。

        引入隐马尔科夫模型,可知此观测序列有与之相对应的隐藏情绪序列,通过维特比算法求得此隐藏情绪序列,然后取出现最多的情绪状态作为最终情绪输出状态。根据最终判断结果的情绪来播放相关音乐,让使用者听到符合心情的歌曲,从而达到心理舒适的状态。


实现方案

本作品开发使用的编程语言是python。

1.   获取数据集:

(1)网上大部分是以愤怒,恐惧,快乐,伤心,厌恶,惊讶,平静七种类别为标准的。但是,通过分析和验证,发现恐惧和惊讶, 厌恶和平静,相似程度很高,而且分类效果比较差,所以最终把面部表情确定为快乐、惊讶、平静、伤心、愤怒五种。

(2)网上公开的面部表情数据集,大部分是黑白的,用于比赛或者研究使用的。而这个作品,需要能识别用户的彩色照片,所以这些公开数据集并不能满足。我们的数据集初始图片是用各大搜索引擎搜索得到的,并且有意选择了东方面孔,不同年龄段,不同性别且表情的程度分布均匀的数据集一千多张。

(3)使用了python中的face_recognition库,用来进行人脸检测,识别图像中的人脸并剪切下来,大小统一保存为224X224。淘汰了一部分识别不出人脸的图片。

(4)对这些剩下的人脸图片进行人工标注。

(5)因为数据集太小,且各类别数量差别大,我们使用了数据增强方法,左右翻转;亮度、饱和度、锐度的变换;加高斯噪声。

2.   用深度神经网络来提取特征:

        采用了tensorflow的深度学习框架,由于算力很强大的服务器,所以只能用迁移学习的方法来实现特征提取。在网络结构的选择上,比较了很多种,发现VGG16在特征提取上效果很好,但是它的网络参数太多,在我的渣电脑上,每次建立模型都要一分钟以上的时间,大大地影响了使用体验,退而求其次,选择了特征提取效果一般,但参数较少的inceptionV3模型。经过inceptionV3深度卷积神经网络处理的表情图片得到其特征向量。关于迁移学习的实现方法和模型获取,网上有很多资料......。

3.   选择图片特征的分类方法:

        SVM是一种有监督的学习模型,对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心,支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量,SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。相对于全连接网络来说,SVM基于结构风险最小化原则,这样就避免了过学习问题,泛化能力强。所以我们使用了SVM的分类模型来对已经经过深度卷积神经网络提取特征的面部表情图片进行分类。

    这里使用了sklearn库中的svm.LinearSVC()来分类。但因为目标是多分类,所以就有两种实现方法:

        1.第一种是求取5个一对多的支持向量,分别将每一种情绪与其它4种情绪分开来,使用时将图片特征分别与这5个支持向量做乘积,有且只有一个结果是整数,此分类即为最准确的分类。

          2.第二种方法是两两情绪之间进行分类,求取10个支持向量。使用时将图片特征分别与这10个支持向量做乘积,再统计10个乘积结果为正数的所对应的情绪,对应正数最多的情绪即为最准确分类,若正数个数相同,则比较乘积结果,最小的即为最大可能属于的情绪分类。

4.   用隐马尔科夫模型确定情绪:

        人类的情感是十分复杂的,根据对人脸面部表情图像提取特征,SVM分类确定了五种基本表情。为提高音乐播放器对使用者情绪判断的准确性,引入马尔科夫人工情感计算模型。通过建立情绪状态自发转移过程的马尔科夫链,确定分类后的五种人脸表情所隐含的情绪。首先提出以下基本假设。

假设1:我们所获取的五种人脸表情可确定N种基本情绪状态,N=5,设定1=快乐,2=惊讶,3=平静,4=伤心,5=愤怒。

假设2:使用者的任意两种情绪状态之间可以相互转换。

假设3:各种情绪基本状态之间互相排斥。即当情绪状态i(i=1,2,3,4,5)的强度增强时,其他情绪状态j的强度减弱。

假设4:情绪状态自发转移趋势总是向着平静状态转移。

假设情绪初始概率分布:每种表情概率相等,这个假设是符合最大熵原理的,因为这样做保留了最大的不确定性,即让熵达到了最大......。

        由于条件限制,没有进行相应的实验来获得隐马尔可夫模型的参数,目前的模型参数只是根据经验主观假设所得。由深度卷积神经网络和SVM分类之后得到一个观测到的人脸表情序列,根据此序列及A,B可以由维特比算法得到概率最大的隐藏情绪状态序列。最后通过判断哪个情绪出现次数最多,来决定这一过程中使用者的情绪真实情况......。

5.   根据情绪识别结果来推荐合适音乐:

        我们的设计很简单,力求不与使用者的情绪相冲突,又不能让使用者长时间处于过于不好的状态。经过查阅资料,并分析各个流行的播放器的音乐情感类别得到结果......。

6.   跨平台GUI界面开发:

      选择了tkinter进行GUI开发,tkinter是Python的一个模块,一个功能强大的跨平台的脚本图形界面接口。Python的GUI开发有许多选择,包括标准GUI库tkinter,wxPython, PyQT,Jython,MFC。鉴于我们的音乐播放器界面要实现的功能比较简单,tkinter是Python配备的标准GUI库,操作简单,可以良好适用于windows操作系统,而且显示风格是本地化的,所以最终选择了tkinter。

        我们的音乐播放器主要实现两大功能:情绪识别和音乐播放。窗口顶层设置菜单栏,分为四栏:识别情绪、推荐音乐、本地音乐、我的收藏(暂未实现)。主界面(如图1)添加一个button,点击可开始进行情绪识别,一个label用于显示识别结果。音乐播放器界面(如图2)可实现选择音乐,播放音乐,上一曲下一曲选择及音量调节功能



拓展:

      我们使用了树莓派3B+,系统为官方支持的操作系统Raspbian,它是基于Linux的Debian发行版。这里我们参考了一个开源的树莓派中文智能音箱项目:叮当。他能接入百度语音识别、语音合成、图灵机器人等。可以实现智能语音控制,而且我们可以自由地编写自己的插件。所以我们就写了一个面部表情识别智能播放音乐的插件,实现了功能。


总结:

        作品完成后我们对其让不同的人进行了测试,发现识别准确率不太高,有时候会误识别,原因应该是训练选取不够随机,而且数量太少只有一千多张,尽管经过了数据增强,但还是无法得到泛化性很强的SVM模型。所以提高识别率的方法也很明显:1、增加优质的样本,2、修改更好的模型参数,3、改进算法。


猜你喜欢

转载自blog.csdn.net/LongLongWei_CsDn/article/details/80947867
今日推荐