基于Python的面部表情识别分析系统

article/2025/10/26 10:43:31

资源下载地址:https://download.csdn.net/download/sheziqiong/85660758

面部表情识别

练习技能:

  • 爬虫
  • 数据清洗
  • 计算机视觉(图片基本处理,信息提取)
  • 深度学习

图像识别技术文档


一、项目概述

  • 项目名称:面部表情识别

  • 项目背景:在与客户交流的过程中,通过客户的面部表情来判断用户对话题是否感兴趣,营销人员或者沟通人员可以从中找到客户感兴趣的方面,或者判断客户的购买欲望

  • 图像识别是指利用计算机对图像进行处理、分析、理解,图像识别的过程可分为图像处理和图像分析两个过程
    图像处理是指对所需要分析的图像进行一系列的图形操作,包括拉伸缩放、旋转翻转、颜色变换、像素保留……,图像分析是指通过图像的特征来反馈图像信息并且分类,最简单的是基于统计的方法、最常用的是深度学习方法

  • 技术支持
    图像处理:VoTT、OpenCV、PIL
    图像分析:TensorFlow、Keras、CNN



二、应用领域

总体目标

  • 一级目标
    • 通过客户的面部表情变化,来抓住客户感兴趣的点,提高沟通效率
  • 二级目标
    • 学习图像识别的技术
  • 三级目标
    • 学习深度学习实现工具
  • 四级目标
    • 了解图像识别技术实现的步骤,技术原理

三、实验步骤

3.1 资源

  • 数据资源:本次实验为面部表情的二分类识别,情绪为高兴和沮丧,各表情图像 5000 张
  • 技术支持:Keras、TensorFlow、VoTT、OpenCV、PIL
Keras

Keras 是一个由 Python 编写的开源人工神经网络库,可以作为 Tensorflow、Microsoft-CNTK 和 Theano 的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化,Keras 的神经网络 API 是在封装后与使用者直接进行交互的 API 组件,在使用时可以调用 Keras 的其它组件。除数据预处理外,使用者可以通过神经网络 API 实现机器学习任务中的常见操作,包括人工神经网络的构建、编译、学习、评估、测试等。

TensorFlow

TensorFlow 由谷歌人工智能团队谷歌大脑(Google Brain)开发和维护,拥有包括 TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud 在内的多个项目以及各类[应用程序接口]( API) [2] 。自 2015 年 11 月 9 日起,TensorFlow 依据阿帕奇授权协议(Apache 2.0 open source license)开放源代码,TensorFlow 是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,谷歌大脑自 2011 年成立起开展了面向科学研究和谷歌产品开发的大规模深度学习应用研究,其早期工作即是 TensorFlow 的前身 DistBelief。

VoTT

VoTT 是一个用 TypeScript 编写的 React + Redux Web 应用程序。该项目是通过 Create React App 启动的,用于图像和视频资产的开源注释和标签工具,VoTT 可以作为本机应用程序安装,也可以从源代码运行。VoTT 也可以作为独立的 Web 应用程序使用,并且可以在任何现代 Web 浏览器中使用。

OpenCV

OpenCV 是一个基于 BSD 许可(开源)发行的跨平台计算机视觉库,可以运行在 Linux、Windows、Android 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了 Python、Ruby、MATLAB 等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

PIL

python 图像处理库,这个库支持多种文件格式,并提供了强大的图像处理和图形处理能力。


3.2 方法

3.2.1 试验阶段

  • 在项目开始初步试验阶段,通过人工百度搜索人像表情图像,利用 VoTT 工具进行裁切和标注,各表情 100 张,并按照 7,2,1 的比列把数据分为训练集、测试集、验证集。
  • 利用 Keras 深度学历框架搭建简单的 CNN 进行训练,结果显示 CNN 在图像处理领域效果很不错,在模型未经过调整前准确率能超过 50%。

3.2.2 中期工作

  • 扩大数据集,利用爬虫批量获取人像图片,在爬取百度图片的过程中,如果直接获取那最多只能获取到 30 张图像,之后程序就自动停止了,采用的解决方法是,通过观察 url 发现可以添加 page 页码这个选择来达到滚轮向下刷新图片的作用,因此添加一个页码循环来爬取图像。

    所以采用 VoTT 加 Python 的方式来完成图像标注和裁切,在 VoTT 新建项目,选择图像位置进行框选和标注,完成后保存导出 JSON 格式文件,在利用 Python 读取 JSON 文件,打开对应图像按照框选的大小进行裁切,然后转化为数组也就是像素保存,按照 6,2,2 的比例划分数据集保存 CSV 文件。


  • 打开 VoTT,选择新建项目




  • 新建连接点




  • 选择为添加位置




  • 选择图像所在文件夹位置,添加确认





  • 工作界面右上角区域为标签处理区域,可以进行标签的添加删除和位置更改操作




  • 正上方区域为框选工作区域




  • 左边为文件选项,可以选择框选图像已经导出




  • 标注好的图像导出为 JSON 格式




  • 卷积神经网络和普通神经网络的区别主要在于“卷积”二字,卷积也就是我们说的内积计算方式,就是将矩阵相乘再相加,卷积的操作是为了提取区域的主要特征,也是一种减少维度的方法,并且在图像识别中这种方式也是很合理的,卷积这个操作最开始来自于计算机波纹处理,后来应用到计算机视觉领域得到了显著的作用。










  • 卷积操作可以作为物体的边缘检测,这在图像识别上提供了很大的帮助,在将我们的滤波器放在选中的像素上之后,我们将卷积核中的每一个数值和图像中对应的数值成对相乘。最后将乘积的结果相加,然后把结果放在输出特征图的正确位置上。我们在上边的动画中可以以一个微观的形式看到这个运算的过程,但是更有趣的是我们在整幅图像上执行这个运算得到的结果。




  • “池化”操作是和“卷积”配合使用,池化操作也是一种提取重要特征的方式,但是在这一环节中没有权重产生,它的工作方式是指定池化的大小,对数据进行扫描保留区域内最大数值,这个操作也可以保留区域内的平均数值。除了卷积层,CNN 通常会用到所谓的池化层。它们最早被用来减小张量的大小以及加速运算。这些层是比较简单的——我们需要将我们的图像分成不同的区域,然后在每一个部分上执行一些运算。例如,对 Max Pool 层而言,我们会选择每个区域的最大值,并将它放到对应的输出区域。与卷积层的情况一样,我们有两个可用的超参数——滤波器大小和步长。最后但同样重要的一点是,如果你对一个多通道的图像执行池化操作,那么每一个通道的池化应该单独完成。







  • “全连接”,此操作是将图像数组进行平压之后全连接,之后的操作和普通的神经网络原理一致,最后的输出层利用逻辑函数进行预测。

  • 数据输入,在数据输入过程中添加 Keras 图像生成器模块,扩大数据集。

  • 效果展示












3.2.5 模型评估


  • 训练集

    01
    04749216
    12836933
    评估百分比
    真阳率96.98%
    假阳率3.02%
    真阴率5.62%
    假阴率94.38%
    召回率96.08%
  • 测试集

    01
    056264
    176803
    评估百分比
    真阳率92.62%
    假阳率7.38%
    真阴率11.91%
    假阴率88.09%
    召回率91.35%

  • 实时预测

    对面部表情进行实时识别需要计算机获取摄像头的信息,思路是通过获取计算机摄像头的权限,打开摄像头进行实时画面的捕捉,获取当前画面的一帧来做预测,根据刷新率不同识别的实时速率也不同
    
    #-*- coding: utf-8 -*-import cv2
    import sys
    import gc
    import json
    import numpy as np
    from keras.models import Sequential
    from keras.models import model_from_json
    root_path=os.path.abspath(".")
    model_path=root_path+'/model/'
    img_size=48
    emo_labels = ["happy", 'disgust']
    num_class = len(emo_labels)
    json_file=open(model_path+'model_json.json')
    loaded_model_json = json_file.read()
    json_file.close()
    model = model_from_json(loaded_model_json)
    model.load_weights(model_path+'model_weight.h5')if __name__ == '__main__':if len(sys.argv) == 1:print(len(sys.argv))print("Usage:%s camera_id\r\n" % (sys.argv[0]))sys.exit(0)#框住人脸的矩形边框颜色color = (0, 0, 2555)#捕获指定摄像头的实时视频流cap = cv2.VideoCapture(0)#人脸识别分类器本地存储路径cascade_path ="C:/ProgramData/Anaconda3/lib/site-packages/cv2/data/haarcascade_frontalface_alt.xml"#循环检测识别人脸while True:_, frame = cap.read()   #读取一帧视频#图像灰化,降低计算复杂度frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#使用人脸识别分类器,读入分类器cascade = cv2.CascadeClassifier(cascade_path)#利用分类器识别出哪个区域为人脸faceRects = cascade.detectMultiScale(frame_gray, scaleFactor = 1.1,minNeighbors = 1, minSize = (120, 120))if len(faceRects) > 0:for faceRect in faceRects:x, y, w, h = faceRectimages=[]rs_sum=np.array([0.0]*num_class)image = frame_gray[y: y + h, x: x + w ]image=cv2.resize(image,(img_size,img_size))image=image*(1./255)images.append(image)images.append(cv2.flip(image,1))images.append(cv2.resize(image[2:45,:],(img_size,img_size)))for img in images:image=img.reshape(1,img_size,img_size,1)list_of_list = model.predict_proba(image,batch_size=32,verbose=1)result = [prob for lst in list_of_list for prob in lst]rs_sum+=np.array(result)print(rs_sum)label=np.argmax(rs_sum)emo = emo_labels[label]print ('Emotion : ',emo)cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness = 2)font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(frame,'%s' % emo,(x + 30, y + 30), font, 1, (255,0,255),4)cv2.imshow("识别朕的表情!", frame)#等待10毫秒看是否有按键输入k = cv2.waitKey(30)#如果输入q则退出循环if k & 0xFF == ord('q'):break#释放摄像头并销毁所有窗口cap.release()cv2.destroyAllWindows()

资源下载地址:https://download.csdn.net/download/sheziqiong/85660758


http://chatgpt.dhexx.cn/article/F1KSPli8.shtml

相关文章

基于人脸面部检测的口罩识别系统

基于人脸面部检测的口罩识别系统 摘 要 作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情,人们生活秩…

[深度概念]·简述人脸识别开发原理

0、文章概述 我们知道人脸识别在这几年应用相当广泛,人脸考勤,人脸社交,人脸支付,哪里都有这黑科技的影响,特别这几年机器学习流行,使得人脸识别在应用和准确率更是达到了一个较高的水准。 下面将带着大家…

基于深度学习的人脸面部表情识别系统【含Python源码+PyqtUI界面+原理详解】

功能演示 摘要:面部表情识别(Facial Expression Recognition)是一种通过技术手段识别人物图像中人脸面部表情的技术。本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码、训练好的深度学习模型,并且通过Py…

2022年12月编程语言排行榜公布!

2022年迎来了最后一个月,我们可以看到,在这一年中编程语言起起伏伏,有的语言始终炙手可热,而有的语言却逐渐“没落”… 日前,全球知名TIOBE编程语言社区发布了12月编程语言排行榜,有哪些新变化&#xff1f…

html不是编程语言什么梗,html不是编程语言?

HTML究竟算不算是一门编程语言,这是争执已久的话题。其实,从本质来讲,HTML确实算不上是一门编程语言。 HTML全称,HyperText Markup Language。字面理解,HTML就是一种超文本语言,何谓超文本,就是…

2017年编程语言排名

https://spectrum.ieee.org发布了2017年编程语言排名,这个榜单是对数十种流行的编程语言进行排名。 请参考: https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2017 可以对排名规则进行选择 可选择的权重分别为&#xf…

【总结】编程语言的分类

一、计算机编程语言的分类 1、低级语言 机器语言(二进制代码)、汇编语言(面向机器的程序设计语言)和符号语言。汇编语言源程序必须经过汇编,生成目 标文件,然后执行。 机器语言优缺点如下…

编程语言排行榜 - 2020年度最热门编程语言盘点!

如今,广大用户更喜欢利用移动应用程序,来获取他们所关心的产品与信息。而移动应用程序也成为了企业在市场竞争中,保持领先地位的成功关键。据某项调查预测:到2020年,全英国移动应用的用户下载数量将增加到200亿次。当然…

IT培训分享:11种热门编程语言的主要用途

IT行业发展前景广阔,想进去IT领域的小伙伴也是与日俱增。但编程语言的种类那么多,具体学习哪个好呢?建议刚开始学习就要明白自己的目的来进行有针对性的学习。今天小千就以自己了解到的知识,来给大家简单介绍一下时下热门编程语言…

最受欢迎的八种编程语言

DevJobsScanner公司分析了2022年超过1200万份开发者工作需求,其中舍弃了对语言要求比较模糊的工作,有明确编程语言要求的工作有700万份,最终得出了目前行业需求量最高的 8 种编程语言。 让我们一起看看在目前的市场需求中,哪些语…

软件测试用例编写方法

软件测试学习导图如下: 软件测试的宗旨就是尽早地和不断地进行测试,更早、更快、更多的发现错误。 编写测试用例主要用到五种方法:等价类划分、边界值分析、因果图法、场景法(用户故事法)、错误推测 等价类划分&#…

编写测试用例方法之正交表分析法

今天我们再来介绍另外一个编写测试用例的方法:正交表分析法,这个方法是一种比较方便的方法。话不多说,开始整干货,老规矩,首先全图镇楼。 之前我们在对产品进行测试用例设计的时候,都是针对单个输入框。如果…

测试用例的编写方法

测试用例 买手机、买电脑,要试用一下:开机、屏幕、运行速度、内存大小;这就是生活中的测试用例! 测试用例(Test Case)是为特定的目的而设计的一组测试输入、执行条件和预期的结果,以便测试是否满足某个特定需求。通过大量的测试用例来检验软件的运行效果,它是指导测试工…

编写测试用例的方法,这个是真的很好用

大家测试过程中经常用的等价类划分、边界值分析、场景法等,并不能覆盖所有的需求,我们之前讲过很少用到的因果图法,下面就来讲另一种不经常用到但又非常重要的测试用例编写方法——测试大纲法。 测试大纲法适用于有多个窗口,每个…

亲测快捷高效的编写测试用例方法

目录 一、什么是测试用例? 二、设计用例是否有必要? 三、设计用例的益处? 四、一定要写测试用例吗? 五、测试用例怎么写? 六、用例必备4个方面? 七、用例设计理念? 八、没有需求文档&am…

测试用例的特性以及编写测试用例的方法

测试用例的特性以及编写测试用例的方法 测试用例的定义:什么是测试用例?测试用例的特征: 编写测试用例的好处:测试用例的作用: 测试用例的4个特性测试用例通常包括以下几个组成元素:编写测试用例的基本方法…

【软件测试】编写测试用例的方法,这个是真的很好用

大家测试过程中经常用的等价类划分、边界值分析、场景法等,并不能覆盖所有的需求,我们之前讲过很少用到的因果图法,下面就来讲另一种不经常用到但又非常重要的测试用例编写方法——测试大纲法。 测试大纲法适用于有多个窗口,每个…

编写测试用例常用的七大方法

测试用例格式包括十大特点 用例编号 测试项 测试标题 用例属性 重要级别:高中低 预置条件 测试输入 操作步骤 预期结果 实际结果 第一:等价类 1,等价类定义 2,等价类划分 3,等价类划分规则 4,进行…

【测试】编写测试用例的思路和方法

文章目录 1)什么是测试用例?1.1 测试用例的定义测试用例的内容: *为什么需要测试用例?测试用例的作用: 1.2 测试用例的元素测试目标(Why):测试对象(What)&…

编写测试用例常用方法

一、等价类划分法 1.概念:等价类划分法是将所有程序的输入域划分成若干个子集合(等价类),然后从每一个子集合中选取少数具有代表性的数据作为测试的输入数据。在该子集合中,所有的输入数据对于揭露软件中的错误都是等效的。等价类划分有效等…