版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
广东东软学院本科生毕业设计(论文)基于深度学习的人脸表情分析内容摘要人脸表情是人类在没有语言交流时的一种表达感情的方式,而且是最常见与最容易表达的,对于计算机来说,所谓的人脸表情识别就是输入一张图片给计算机,计算机通过一些特征提取,数值计算,最后得出表情的类别,面部表情识别是基于人工智能的人机交互技术的重要组成部分。表情识别在现实中应用的场景甚多,例如零售业中通过识别顾客的表情,获取他对商品的喜好,或者在游戏中,可以识别用户的表情,进行人机交互体验等等。本文将会利用目标检测算法YOLOV3和图像识别算法VGGNET对图片中的人进行一个表情识别。关键词:深度学习神经网络特征提取表情识别目标检测目标识别卷积神经网络AbstractTherecognitionoffacialexpressionsisthatartificialintelligenceisanimportantpartofhuman-computerinteractiontechnology.Facialexpressionsareoneoftherichestresourcesinourdailynon-verbalcommunicationandtheeasiestway.Expressionsareexpressedinacertainway.Foracomputer,facialexpressionrecognitionisanimageinputbyacomputer.Thecomputerhassomefeatureextraction,numericalcalculation,andcategoryanalysisexpressions.Therearemanyscenariosinwhichfacialexpressionrecognitionisappliedinreality.Forexample,intheretailindustry,customers'facialexpressionscanberecognizedtoobtaintheirpreferencesforgoods,orinthegame,users'facialexpressionscanberecognizedtoconductman-machineinteractionexperience.Inthispaper,targetdetectionalgorithmYOLOV3andimagerecognitionalgorithmVGGNETwillbeusedtocarryoutanexpressionrecognitionofpeopleinthepicture.Keywords:DeeplearningNeuralNetworksFeatureextractionExpressionrecognitionTargetDetectionTargetRecognitionConvolutionalNeuralNetwork目录TOC\o"1-2"\h\u4591一、绪论 绪论1.1研究背景与意义深度学习自2012年以来越来越火爆,人类逐渐将深度学习应用到各个领域,因为只要有足够好的资料,计算机就有可能发挥出比人还要好的效果,本次我们将研究一下基于深度学习的人脸表情分析。人脸识别会涉及到一个很广的领域,是一个交叉的学科,它的领域非常广泛其能工作的领域也很广,例如在国家安全、军事安全、公安、司法、金融、海关、等等。那么人脸表情能具体任用到哪里呢?例如,对于多通道的人机交互界面来说,可以把跟踪得到的人脸表情用来作为一种人际交互的手段。人脸识别主要作用是:实现自动实时识别人脸表情通过人机接口。实现人脸表情实时识别和实时的追踪。实现(人体、自然)语言的融合。人脸情感识别是从面部表情中检测人类情感的过程。人脑可以自动识别情绪,现在已经开发了可以识别情绪的软件。这项技术一直在变得越来越精确,最终将能够像我们的大脑一样读取情绪。人工智能可以通过学习每个面部表情的含义并将该知识应用于呈现给它的新信息来检测情绪。情感人工智能或情感AI是一种能够读取,模仿,解释和响应人类面部表情和情感的技术。表1-1面部表情的含义表情额头、眉毛眼睛脸的下半部惊奇1、眉毛抬起、变高变弯1、眼睛睁大,上眼皮抬高,下眼皮下落下颚下落,嘴张开,唇和牙齿分开,但嘴部不紧张,也不拉伸2、眉毛下的皮肤被拉伸2、眼白可能在瞳孔的上边和/或下边露出来3、皱纹可能横跨额头恐惧1、眉毛抬起并皱在一起上眼睑抬起,下眼皮拉紧嘴张,嘴唇或轻微紧张,向后拉或者拉长,同时向后拉2、额头的皱纹只在集中在中间中部,而不是横跨整个额头厌恶眉毛压低,并压低上眼睑在下眼皮下部出现横纹,脸颊推动其向上,当然并不紧张1、上唇抬起2、下唇与上唇紧闭,推动上唇向上,嘴角下拉,唇轻微凸起3、鼻子皱起4、脸颊抬起愤怒1、眉毛皱在一起,压低1、下眼皮垃紧,抬起或不抬起1、唇有两种基本的状态:紧闭、唇角垃直或向下,张开,仿佛要喊2、在眉宇之间出现竖直皱纹2、上眼皮垃紧2、鼻孔可能张大高兴眉毛参考:稍微下弯1、下眼睑下边可能有皱纹,可能鼓起但是并不紧张1、唇角向后拉并抬高2、鱼尾纹从外眼角向外扩张2、嘴可能被张大,牙齿可能露出3、一道皱纹从鼻子一直延伸到嘴角外部4、脸颊被抬起悲伤眉毛内角皱在一起,抬高,带动眉毛下的皮肤眼内角的上眼皮抬高1、嘴角下拉2、嘴角可能颤抖图1-1.传统人脸表情识别了解情境情感对社会和商业都有广泛的影响。在公共领域,政府组织可以充分利用检测罪恶感,恐惧和不确定性等情绪的能力。不难想象,TSA会自动扫描航空公司乘客的恐怖主义迹象,并在此过程中使世界变得更加安全。很多公司一直在利用情感识别来推动业务成果。对于《玩具总动员5》,迪士尼计划使用面部识别来判断观众的情绪反应。苹果甚至在iPhoneX上发布了一项名为Animoji的新功能,您可以在其中获得计算机模拟的表情符号来模仿您的面部表情。假设他们很快将在其他应用程序中使用这些功能并不是什么遥不可及的事情。这是组织和企业可以用来了解其客户并创建人们喜欢的产品的所有可行信息。但是,在实践中获得像这样的产品并不是一件容易的事。有两个主要问题阻碍了情感计算的有意义的进展:训练/标签问题和要素工程问题。出于多种原因,情感识别在社会中得到了应用。
从麻省理工学院分离出来的Affectiva提供人工智能该软件可提高人们手动完成以前完成的任务的效率,主要用于收集与观看者同意共享此信息的特定上下文有关的面部表情和声音信息。例如,您不必同意冗长地调查观看教育视频或广告的每个点的感觉,而可以同意让相机注视您的脸部并聆听您的讲话,并注意在体验的哪些部分显示诸如无聊,兴趣,困惑或微笑的表情。(请注意,这并不意味着它正在阅读您的内心世界,它只是在阅读您向外表达的内容。)Affectiva的其他用途包括帮助自闭症儿童,帮助盲人阅读面部表情,帮助机器人与人进行更智能的互动以及在开车时监控注意力迹象,以提高驾驶员的安全性。对于本文的人脸表情识别是基于深度学习,大概流程可以表示为,输入人脸图像之后,第一判断图像中有没有人脸,假如存在的话呢,下一步就要所有人的脸的位置在哪里,然后再把这些人脸送进分类器进行表情分类。1.2本文主要工作首先当然是数据集的选择,用于目标检测的数据集,我选择了FDDB:FaceDetectionDataSetandBenchmark这样的一个数据集,用于表情识别的数据集,我选择了在kaggle上的ChallengesinRepresentationLearning:FacialExpressionRecognitionChallenge数据集。首先FER2013数据集,既是用于表情识别的数据集是存在一些问题,尝试使用百度api进行重新标注,但是由于重新标注后合格的图片太少了,于是没有进行这一步操作,对于模型的话,选择了VGG16Net,训练的时候采用数据增强的方式进行训练。对于FDDB数据集,需要通过标注工具自行标注人脸,模型采用比较流行的yolov3模型。通过训练图像识别模型和目标检测模型之后,需要组合两个模型,就是先得出图像中人的位置,再通过裁剪人的位置输入到图像识别模型进行一个分类操作。深度学习介绍2.1深度学习简介神经网络是一种机器学习,可以根据人脑对自身进行建模,从而创建一个人工神经网络,该神经网络可以通过算法允许计算机通过合并新数据进行学习。尽管如今有大量的人工智能算法,但神经网络能够执行所谓的深度学习。大脑的基本单位是神经元,而人工神经网络的基本组成部分是感知器,可以完成简单的信号处理,然后将这些感知器连接到大型网状网络中。带有神经网络的计算机被教导通过分析训练示例来完成任务,这些训练示例先前已预先标记,学习对新图像进行分类。Hubel和Wiesel还提出了这两种类型的单元的级联模型,以用于模式识别任务。CNN架构的起源是福岛邦彦(KunihikoFukushima)在1980年提出的。它的灵感来自于Hubel和Wiesel的上述工作。新认知加速器在CNN中引入了两种基本类型的层:卷积层和下采样层。卷积层包含其接收场覆盖前一层补丁的单元。这种单位的权重向量(自适应参数集)通常称为过滤器。单位可以共享过滤器。下采样层包含其接收场覆盖先前卷积层补丁的单元。这样的单元通常计算其补丁中这些单元的激活平均值。这种下采样有助于在视觉场景中正确地对对象进行分类,即使对象已移动也是如此。J.Weng等人在新认知电子的一个变体中称为cresceptron,而不是使用福岛的空间平均。引入了一种称为最大池化的方法,其中降采样单元计算其补丁中各单元的激活次数最大值。在现代CNN中经常使用最大池化。在过去的几十年中,已经提出了几种有监督和无监督的学习算法来训练新认知加速器的权重。[6]但是,今天,CNN架构通常通过反向传播进行训练。新认知机是第一个CNN,它要求位于多个网络位置的设备具有相同的权重。1988年,将新认知加速器用于分析时变信号。虽然CNN提出时间比较早,但是在很长的一段时间里面没有取得重大的突破,不需要人工提取特征。在2012年之后每年的计算机视觉大赛,都会有更好的模型推出,随着GPU计算能力加强,卷积神经网络也慢慢火了起来,到现在,其应用到生活各处,未来估计能替代传统的图像识别技术。2.2神经网络简介我们谈谈神经网络的基本模型。神经网络的基本模型可以分为四种类型。第一个是直接神经网络,第二个是反馈神经网络,第三个是随机神经网络。四是自组织竞争神经网络。首先,输入前馈神经网络。先进的神经网络是一个人工神经网络,其中节点之间的连接不会循环。因此,它与它的后代不同:循环神经网络。高级神经网络是设计的第一个也是最简单的人工神经网络。在此网络中,信息仅沿一个方向移动,即从输入节点移动到隐藏节点(如果有)再到输出节点。网络上没有周期。前馈神经网络模型如下:图2-1.前向神经网络然后下面介绍反馈型神经网络,它的节点全部是计算单元,如下图所示,可以向外面输出,也会接受输入。图2-2.反馈神经网络Hopfield网络是典型代表在反馈型网络中。它由一个包含一个或多个完全连接的循环神经元的单层组成。Hopfield网络通常用于自动关联和优化任务。前向型和反馈型的神经网络都是确定性的结构,换句话说,只要给定神经元的输入,这个输出是确定的。图2-3.随机型神经网络然后就是随机型神经网络,其是由ErolGelenbe发明的,并与排队网络的G网络模型以及基因调控网络模型相关联。每个细胞状态用一个整数表示,当细胞收到兴奋性尖峰时其值会增加,而当收到抑制性尖峰时其值会下降。峰值可能源自网络外部本身,也可以来自网络中的其他小区。内部兴奋状态为正值的单元格可以根据特定的依赖单元格的频率向网络中的其他单元格发送任何一种尖峰信号。该模型在稳态下具有数学解决方案,该数学解决方案根据每个单元被激发并能够发出峰值的个体概率来提供网络的联合概率分布。RNN是递归模型,即允许具有复杂反馈回路的神经网络。计算此解决方案的基础是求解一组非线性代数方程,其参数与单个小区的峰值速率及其与其他小区的连接性以及网络外部尖峰的到达速率有关。如下图所示,玻尔兹曼机是一个典型的随机神经网络,其具有随机输出值单元的随机神经网络,它按照概率曲线的能量分布进行状态的转移。图2-4.玻尔兹曼机神经网络的最后一种类型是自组织竞争神经网络。在人脑中,刺激信号的某些方面对不同细胞的敏感性必须不同。自组织神经网络会自动查找样本中的内在规律和基本属性,如下图所示,这一种网络可以识别环境的特征,并且会自动聚类。成功应用到特征抽取和大规模数据处理当中。图2-5.自组织竞争型神经网络2.3卷积神经网络简介卷积神经网络主要有一下概念:局部感受野,共享权重,池化层。对于局部感受野,假设输入的是28*28的像素值:图2-6.局部感受野对于第一个隐含层,每一个隐含层神经元与输入层中5*5的神经元连接:图2-7.感受视野这个5*5的区域就叫做感受视野,表示一个隐含层神经元在输入层的感受区域。这5*5=25个所连接对应着25个权重参数,还有一个全局的bias。当感受野沿着整个输入图片向右(向下)滑动的时候,每一个感受野在第一个隐含层都对应着一个隐藏神经元。图2-8.第一个感受野图2-9.第二个感受野卷积层第二个概念就是共享权重,上面提到,每一个隐含层神经元所对应的5*5=25个权重参数w和一个bias,实际上我们规定,每一个隐含层神经元的25个权值w和b都共享,也就是说隐藏层神经元共享权值。共享权重有什么好处呢,参数个数的大大减少和平移的不变性都是得益于共享权重。卷积层的最后一个层就是池化层,池化层一般都是接在卷积层后面,其作用是用于是一个下采样,例如,下图就是使用max-pooling把四个神经元压缩为一个神经元:取其最大的像素值,其它丢弃。(当然也有其它的pooling例如
L2pooling是把2x2的区域值平方,求和,开根号)。上图24x24的特征图经过2x2的max-pooling之后变成了12x12的特征图。图2-10.池化层2.4目标检测简介目标检测和跟踪是从复杂的背景中检测目标并进行跟踪预测等,以提供信息以进行进一步的分析和处理。所以目标检测与跟踪技术是单摄像机多目标跟踪技术的基础。该模块的性能将对单摄像机多目标跟踪系统的性能产生重大影响。目标检测是指从复杂的图像(视频)背景中定位出目标,并分离背景,对目标进行分类,找到感兴趣的目标,从而更好地完成后续的跟踪、信息处理与响应等任务。目标检测在很多领域都有应用,比如对于脸部、行车、路人等物体的检测,以及一些交叉领域的应用,比如自动驾驶领域交通标志的识别、工程领域里材质表面的缺陷检测,农作物病害检测和医学图像检测等等,所以对目标检测的研究很有实际价值。图2-11.单目标检测与多目标检测除了图像分类,目标检测要解决的核心问题如下。首先,目标可以出现在图像中的任何位置。其次,镜头有各种尺寸。第三,目标可以采取多种形式。如果使用矩形定义物镜,则矩阵具有不同的纵横比。由于镜头的纵横比不同,因此使用经典的滑动窗口和图像缩放方案来解决一般镜头检测问题的成本可能会相对较高。目前来说,基于深度学习的目标检测算法主要分为以下两类。第一类叫做TwoStage目标检测算法,这一类算法一般都是先进行区域生成(regionpropsal)(一个有可能包含待检测物体的预选框),通过卷积神经网络进行样本分类,常见的TwoStage目标检测算法有:R-CNN、SPP-Net、FastR-CNN、FasterR-CNN和R-FCN等。第二类是OneStage目标检测算法,这一种算法是可以直接在网络中提取特征来预测物体分类的位置,常见的OneStage目标检测算法有:OverFeat、YOLO、SSD、RetinaNet等等。2.5图像分类简介对于人类来说,图像分来的问题一眼就能看出了,不过对于计算机而言,她很难分析图像的内容,因为计算机看到的图像是一个很好的数字矩阵,并且对图像的思想,含义和知识一无所知。图像分类任务是给出图像并正确给出图像所属的类别。对于超强大的人类视觉系统,很容易识别图像的类型,但是对于计算机,则不可能获得像人眼一样的图像的语义信息。为了让计算机能够理解图像的内容,我们必须应用图像分类,这是使用计算机视觉和机器学习算法从图像中抽取意义的任务,这一个操作可以理解为一张图像分配一个标签,比如猫、狗还是大象,或者也可以高级到解析图像的内容并且返回一个人类可读的句子。三、实验环境搭建3.1Keras框架简介Keras是基于Theano的一个深度学习框架,它的设计参考了Torch,Keras使用Python语言编写,是一个高度模块化的神经网络库,它还可以支持CPU和GPU。Keras是一个高层神经网络API为什么使用keras框架呢,因为keras高度封装了Tensorflow,深度学习初学者使用tensorflow会出现各种各样的问题,所以从keras入手是一个非常不错的选择。3.2搭建Keras框架3.2.1系统环境本文所在的环境是Windows10系统,python3.6版本,python的安装我推荐是Anaconda,它是一个适用于科学计算的版本,集成了很多需要用到的库,编译环境的话我推荐是Pycharm,Pycharm的社区版就已经可以满足需求。3.2.2CUDA和CUDNNCudaToolkit是一个基础的工具包,是由NVIDIA公司面向GPU编程提供的,如果使用的是CPU加速的话,就不需要安装CUDA和CUDNN,如果使用的是GPU的话,就需要用到CUDA和CUDNN了,而且你的显卡还要是NVIDIA,根据你的显卡驱动来选择CUDA的版本,在下载之后,按照步骤安装,环境不需要配置,安装程序会自动配置好。接下来的是CUDNN,CUDNN的话需要根据CUDA的版本一一对应,cudnn下载的是一个压缩包,下载解压出来是名为cuda的文件夹,里面有bin、include、lib,将三个文件夹复制到安装CUDA的地方覆盖对应文件夹。3.2.3Keras框架搭建在CMD命令行或者Powershell中输入:#GPU版本pipinstalltensorflow-gpu#CPU版本pipinstalltensorflowGPU和CPU版本任选其一。#Keraspipinstallkeras上述步骤完成后,在自己的编译器里面执行以下代码importkeras,如果没有报错的话就说明安装成功。3.3基于Keras的开源YOLOV3框架Yolov3是一种目标检测算法,本文的人脸目标检测使用的是yolov3的算法,接下来介绍一下主要使用的py文件。图3-1.YOLOV3框架font文件夹对应着是字体的格式,model_data文件夹对应着的是classes和anchors的相关文件,yolo3文件夹里面包含的是一些yolov3的结构源代码,之后我会介绍一些主要用到的python文件,convert.py是用来转化在yolo官网上下载的权重,我猜想是转换成这个keras框架可用的权重,kmeans.py文件是一个kmeans聚类算法的文件,用来得出你需要训练的数据集的anchors,train.py文件无疑是训练的python代码,yolo.py里面是一些构建yolov3的代码,yolo_video.py里面是用来使用yolov3去相关实践,yolov3.cfg是yolov3框架的配置文件。3.4基于keras的VGG16模型VGG16这个框架相信大家都比较熟,VGG16的结构非常简单首先VGG模型根据卷积核的大小和卷积层数目的不同,可以分为A,A-LRN,B,C,D,E六个配置,其中D和E的配置比较常用,被称为VGG16和VGG19,下图给出VGG的六种配置图:图3-2.VGGNet结构图由于本文使用的是VGG16模型,所以对VGG16模型进行讨论。观看上图的配置图可以发现,VGG16包含了13个卷积层,3个全连接层,5个池化层,因为池化层不存在参数,所以只有卷积层和全连接层存在参数,13+3=16,因此给称之为VGG16模型,VGG16模型特点是简单,因为只有普通的卷积层,全连接层,池化层所构成的网络,只是层数相对有点多而已,当然,对于现在的网络来说16层是非常浅的网络了,但是在2014年的时候,16层的网络已经算是非常深了。图中的block称为结构块,可以看到block1和block2的结构是差不多的,两层卷积层加一个最大池化层,只是卷积层的filters个数不一样,block3,block4,block5就是三个卷积层和一个最大池化层,也只是卷积层的filters参数不一样,VGG16还有一个特点就是参数量比较大,VGG16具有如此之大的参数数量,也可以预测得出它的拟合能力,但缺点也是非常明显的,也就是训练时间过长,调参难度比较大,接下来给出keras里面的VGG16模型的相关参数,然后VGG16的介绍就到此为止了。四、详细实现4.1数据集介绍本文选取的数据集是fer2013表情识别数据集和FDDB人脸目标检测数据集,fer2013数据集非常简单,就是一个包含7种表情的数据集,有生气、厌恶、恐惧、开心、伤心、惊讶、中性,该数据集是一个csv文件,里面有图片图像的像素和对应的标签,每张图片的尺寸是48*48,对应的是灰度图片。FDDB数据集一共包含2845张图片,其中包含彩色图片和灰度的图片,其中人脸的总数达到5500个以上,而且这些人脸的图片所呈现的状态多样,包含遮挡、罕见姿势、低分辨率的情况,由于该数据集采用的是椭圆标记法:图4-1.椭圆标注因此需要转换成矩形标记法的格式,转换也是比较简单的,只需要写一个普通的python脚本既可以转换,首先椭圆标记法给出的是椭圆的中心点坐标和椭圆的长轴半径和短轴半径,因此很容易转换成矩形标记法,FDDB数据集中还给出了一个偏移角度,经过观察,偏移角度一般都很小,所以就直接忽略这个参数。4.2数据的预处理对于fer2013的数据集而言,我们需要对其进行像素转换成图片的操作,并且按标签的索引值放进每一个文件夹中,具体代码如下:defcsv_to_jpg():train=pd.read_csv('train.csv')os.chdir('F://DataSet/expression/img')foriinrange(len(train)):data=train.loc[i]img=np.array(data['pixels'].split()).astype(np.uint8).reshape((48,48,1))cv2.imwrite('{}.jpg'.format(i+1),img)图4-2.csv转jpg代码执行完之后去到对应目录就可以看到以下:因为后面我们是使用keras的ImageDataGenerator的图片生成器,所以需要划分训练集和验证集defsplit_train_to_valid():os.chdir('F:\Py_Code\Expression\\train')foriinrange(10):base_path=os.path.join(os.getcwd(),str(i))end_path=base_path.replace('train','test')len_arr=os.listdir(base_path)need_copy=np.random.choice(np.arange(len(len_arr)),int(len(len_arr)*0.2),replace=False)forjinneed_copy:a=os.path.join(base_path,len_arr[j])b=os.path.join(end_path,len_arr[j])shutil.copy(a,b)forjinneed_copy:os.remove(os.path.join(base_path,len_arr[j]))每一个种类的表情划分0.8的训练集0.2的测试集,所以需要用一个random来进行随机选取每一类的百分之20的图片,然后利用shutil的库来进行对应的图片复制到vaild文件夹,然后再将train复制到valid的图片删除,完成了划分训练集和测试集,弄成这个模式是因为ImageDataGenerator里面有一个非常好的功能是flow_from_directory,可以不需要将图片全部读进去内存,非常的好用,弄成这个格式就是方便使用这个函数。对于FDDB的数据集,只需要把椭圆标注转换成矩形标注就可以了。4.3目标检测yolov3yolov3发现需要5样东西即可进行训练,第一个是训练的数据路径和坐标框,写在一个txt文件里面,第二个是对yolov3.cfg配置文件进行修改,第三个是classes.txt文件,里面是你这个训练集的标签,第四个是anchors.txt文件,里面是你这个数据集通过kmeans聚类得出的9个anchors框,最后一个是需要在yolo官网上下载yolov3的预训练权重,之后用里面一个convert.py文件进行转换成这个框架可以用的权重。完成这5个东西之后就可以进行训练yolov3了。通过训练网络,效果非常不错。下面给出一些模型效果图和训练的loss和val_loss变化图。图4-5.yolov3检测效果图4-6.yolov3训练loss变化4.4图像分类VGG16对于VGG16的训练是比较简单的,下面贴出训练代码:inputs=Input(shape=(224,224,3))vggnet16=vgg16.VGG16(input_tensor=inputs,classes=7,include_top=False,weights='vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5')net=GlobalAveragePooling2D()(vggnet16.layers[-1].output)net=Dense(7,activation='softmax')(net)model=Model(inputs,net)pile(optimizer=SGD(),loss=categorical_crossentropy,metrics=['accuracy'])model.summary()train_generator,valid_generator=get_data_generate()model.fit_generator(train_generator,steps_per_epoch=1000,verbose=2,epochs=50,validation_data=valid_generator,validation_steps=100,callbacks=[ModelCheckpoint('model/VGG16_{epoch:03d}_{val_loss:.4f}.h5',monitor='val_loss',verbose=1,mode='auto',save_best_only=True),ReduceLROnPlateau(factor=0.8,patience=3,verbose=1,mode='auto',monitor='val_loss'),CSVLogger('model/train.log')])第一行的Input是一个输入层,结合Model类使用,第二行是定义VGG16模型,类别是有7类,所以classes参数设定为7,因为文档上写明,如果classes不为1000的话,include_top这个参数必定要设置为False,否则会报错,然后添加一个GlobalAveragePooling2D层,这个是一个全局平均池化层,可以用于卷积层和全连接层的连接处,因为一般的卷积层输出是多维的,这个全局平均池化层可先将每一张特征图的全局平均值求出来,然后再连接起来,最后变成一个一维向量,第四行代码是一个全连接层的操作,激活函数是softmax,因为是多分类,然后下一行是利用一个Model类把input和output结合起来,变成一个model,下一行是定义模型的损失函数,损失函数使用交叉熵,优化器经过测试,使用SGD效果是最好的,再把metrics定义好,添加精度的计算(accuracy),这里采用的是利用keras的ImageDataGenerator,train_datagen
=
ImageDataGenerator(
rotation_range=30,
#
旋转角度
width_shift_range=0.1,
#
宽度的偏移
height_shift_range=0.1,
#
高度的偏移
rescale=1
/
255.0,
#
归一化
horizontal_flip=True,
#
水平翻转
)
train_generator
=
train_datagen.flow_from_directory(
'F://DataSet/expression/train',
target_size=(224,
224),
#
图像大小
batch_size=32,
#
batch大小
class_mode='categorical',
#
多分类模式
shuffle=True,
#
打乱数据
)
valid_datagen
=
ImageDataGenerator(
rescale=1
/
255.0,
)
valid_generator
=
valid_datagen.flow_from_directory(
'F://DataSet/expression/valid',
target_size=(224,
224),
batch_size=32,
class_mode='categorical',
#
color_mode='grayscale',
shuffle=True,
)训练50次,添加了3个callbacks函数,一个是ModelCheckPoint,这个是用来根据val_loss保存最好的模型,ReduceLROnPlateau是用来如果val_loss多少个patience次没减少,就把学习率*factor,意思就是当多少次val_loss还没有下降,就把模型的学习率乘以factor参数,CSVLOGGER是用来记录训练过程中的loss和acc变化。因为VGG16模型训练时间非常长,所以我只训练了20次,下面贴出一些结果:图4-9.VGGNet训练模型是存在过拟合的,不过对于这个数据集,kaggle上的第一也只是0.71,所以我这个val_acc能达到0.66我觉得也不错了,因为数据集中有些很乱的图片,估计是数据集的问题,但是实际效果也还行:图4-10.测试VGG模型用图对于这张图片的输出是happiness。4.5结合模型yolov3和vgg16训练完成后,最后只需要把两个代码结合起来。yolov3=YOLO()vgg16=load_model('model/VGG16.h5')since=time.time()PIL_img=Image.open(img_path)cv2_img=cv2.imread(img_path)face_rectangle,_img,font=yolov3.detect_image(PIL_img.copy())draw=ImageDraw.Draw(PIL_img)forfaceinface_rectangle:top,left,bottom,right=face[:4]face_img=cv2_img[top:bottom,left:right]face_img=cv2.resize(face_img,(224,224))face_img=np.array(face_img).reshape((-1,224,224,3))/255.0face_img_label=fer2013[np.argmax(vgg16.predict(face_img)[0],axis=0)]print(face_img_label)draw.rectangle([left,top,right,bottom])draw.text(face[4],face_img_label,fill=(0,0,0),font=font)print(time.time()-since)PIL_img.show()首先需要把yolo模块导入进来,然后再加载vgg16模型,具体做法是把yolo预测出来的人脸框从图片中截取出来,然后进行一些操作再给vgg16模型,vgg16用来预测表情,yolov3负责寻找人脸,最后再通过一些ImageDraw在图片上添加标注,下面给出效果图:图4-12.组合模型效果图上面三张图分别是开心,伤心,惊讶,效果还是可以的。五、总结5.1工作总结本文的主要工作有以下内容:对于图像分类来说,数据集fer2013是一个csv文件,所以第一步需要将它转为图片文件,并且按标签分好类,之后需要划分训练集和验证集,训练模型的话,其实我也训练过VGG16,VGG19还有自己搭建的模型,最后采纳了VGG16,其实VGG16和VGG19模型效果差不多,但是VGG16模型会比VGG19模型小一点,所以最后采纳了VGG16的模型,训练的时候利用了ImageDataGenerator来增强数据,使模型更具鲁棒性。对于目标检测的话,数据集FDDB使用的是椭圆标注,所以第一步需要将椭圆标注转换成矩形标注,然后就把yolov3需要的东西都弄好,例如anchors.txt,classes.txt,train.txt,修改yolov3.cfg文件等等。然后就开始进行训练。训练的时候一般是先采用fine-tune操作,就是只训练最后的输出层,如果能得到一个较好的结果的话,就不用训练整个网络,但是发现如果只训练最后的输出层效果非常差,之后我就训练了整个网络,训练整个网络的效果就比较不错。最后的话模型结合,这个的话相对比较简单,就是把yolov3预测出来的坐标框从图像中截取出来,然后放进去VGG16里面进行预测表情结果。5.2不足其实本次实验的不足还是有挺多的,对于图像分类的话,由于表情识别的数据集实在是很难找,这个fer2013的数据集估计是噪音很多,因此验证集的精度一直提不上去,我认真看了下数据集,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026四川绵阳市安州区中医院第二次人才招聘10人备考题库及参考答案详解
- 2026年安徽省中考数学试卷(含答案及解析)
- 豚鼠分泌性中耳炎模型构建:咽鼓管咽口阻塞法的深度解析与应用
- 谷崎润一郎“嗜美”美学的多维审视与深度剖析
- 调节性T细胞与浆细胞样树突状细胞:甲状腺乳头状癌免疫逃逸机制及治疗新策略探究
- 成人创伤性休克的急救处理
- 2026陕西移动“陕耀梦想+”实习生招聘考试模拟试题及答案详解
- 2026江苏连云港市连云区招聘新兴领域专职党务工作者4人笔试模拟试题及答案详解
- 语音信号可视化技术的原理、方法与应用探究
- 语篇背诵赋能高职预科英语写作:理论、实践与成效探究
- (正式版)JBT 106-2024 阀门的标志和涂装
- 《静静的顿河》课件
- 人工智能技术在图像识别中的应用
- GB/T 5072-2023耐火材料常温耐压强度试验方法
- 制药用水设备行业营销策略方案
- 高校思想政治理论课教学与研究
- 落水管更换施工方案
- 智能网联汽车技术PPT完整全套教学课件
- 胫骨远端骨折治疗演示
- 导尿管相关尿路感染(CAUTI)预防与控制措施
- 公交车驾驶员岗位安全操作规程
评论
0/150
提交评论