当前位置: 首页 > news >正文

基于深度学习的面部表情分类识别系统

:温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

1. 项目简介

        面部表情识别是计算机视觉领域的一个重要研究方向, 它在人机交互、心理健康评估、安全监控等领域具有广泛的应用。近年来,随着深度学习技术的快速发展, 面部表情识别的准确性和实时性得到了显著提升。本项目以 MobileNetV2 为基础模型构建面向面部表情识别的卷积神经网络, 完成模型的训练、验证和测试,面部表情识别准确率达到 85%以上。并利用 Flask + Bootstrap 框架搭建交互式分析平台,方便用户进行表情的识别。

        B站视频详情及代码下载:基于深度学习的面部表情分类识别系统_哔哩哔哩_bilibili

基于深度学习的面部表情分类识别系统

2. 面部表情数据集读取与预处理

        利用 opencv 读取面部表情图像数据,并转换为 numpy 数组,图片为灰度图:

def prepare_data(ori_data):"""像素数组转成 numpy array"""image_array = np.zeros(shape=(ori_data.shape[0], img_size, img_size))image_label = np.array(list(map(int, ori_data['emotion'])))for i, row in ori_data.iterrows():image = np.fromstring(row['pixels'], dtype=int, sep=' ')image = np.reshape(image, (img_size, img_size))image_array[i] = imagereturn image_array, image_label

         读取的数据集,可视化部分样例数据:

3. 数据集制作与样本均衡处理

        数据集共包含:生气(Angry)、厌恶(Disgust)、恐惧(Fear)、开心(Happy)、悲伤(Sad)、惊讶(Surprise)和中性(Neutral)七种类型,其样本数量分布如下:

        可以看出,样本类别极具不均衡,如不处理样本均衡问题,将影响模型的训练,样本少的类别会得不到充分的学习。

         通过对样本进行采样,并切分出训练集、验证集和测试集:

class_data = [data[data['emotion'] == i] for i in range(7)]# 对每个类别进行过采样,以匹配平均类别数量
oversampled_data = [resample(class_df, replace=True, n_samples=int(average_class_count), random_state=42) for class_df in class_data]
# 将过采样后的数据合并为一个平衡的数据集
balanced_data = pd.concat(oversampled_data)
# 重置索引并直接在原数据框上进行修改
balanced_data.reset_index(drop=True, inplace=True)# 准备数据,将特征和标签分离
all_x, all_y = prepare_data(balanced_data)
# 重塑特征数据,以匹配输入形状
all_x = all_x.reshape((all_x.shape[0], img_size, img_size, 1))
# 将标签转换为独热编码格式
all_y = to_categorical(all_y)# 将数据分为训练集和临时集,其中20%用于测试
x_train, x_temp, y_train, y_temp = train_test_split(all_x, all_y, test_size=0.2)
# 将临时集进一步分为验证集和测试集,各占50%
x_val, x_test, y_val, y_test = train_test_split(x_temp, y_temp, test_size=0.5)print('训练集:{},验证集:{},测试集:{}'.format(x_train.shape[0], x_val.shape[0], x_test.shape[0]))

        可以看出,七种类型的样本数量已基本均衡,有利于神经网络的训练。

4. 面部表情识别卷积神经网络构建

4.1 MobileNetV2 基础模型

        MobileNetV2 是一种轻量级的深度神经网络模型,由Google在2018年发布,旨在用于移动和边缘设备上的高效图像识别任务。它是MobileNetV1的改进版,继承了其轻量级和高效的特点,并在多个方面进行了优化。以下是MobileNetV2模型的主要特点和结构:

        主要特点:

  1. 深度可分离卷积(Depthwise Separable Convolution): MobileNetV2依然采用了深度可分离卷积来减少模型参数和计算量。这种卷积将标准的卷积分解为两个步骤:深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。

  2. 线性瓶颈(Linear Bottlenecks): 在MobileNetV2中,作者引入了线性瓶颈的概念,即在网络的最后几层使用了线性激活函数(ReLU6)而不是传统的ReLU,这有助于减少信息的损失。

  3. 倒残差结构(Inverted Residuals): MobileNetV2采用了倒残差结构,即先通过一个逐点卷积扩展维度,然后进行深度卷积,最后再用逐点卷积减少维度。这种结构有助于提高网络的表达能力。

  4. 轻量级: 由于采用了上述结构,MobileNetV2在保持精度的同时大大减少了模型的参数数量和计算量,使其非常适合在资源受限的设备上运行。

4.2 基于迁移学习的卷积神经网络构建

        以 MobileNetV2 为 base 模型,加载利用 ImageNet 大规模数据集预训练的 MobileNetV2 模型权重,构建

base_model = tf.keras.applications.MobileNetV2(weights='./pretrained_models/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_96_no_top.h5', include_top=False,input_shape=(96,96,3)
)# Inputlayer
input = tf.keras.layers.Input(name='0_Input',shape=(img_size, img_size, 1))# Preprocessing stage
x = tf.keras.layers.Resizing(name='1_Preprocessing_1',height = 96, width = 96)(input)
x = tf.keras.layers.Rescaling(name='1_Preprocessing_2',scale = 1/127.0, offset=-1)(x)
x = tf.keras.layers.RandomRotation(name='1_Preprocessing_3',factor=0.20,seed=100)(x)
x = tf.keras.layers.RandomFlip(name='1_Preprocessing_4',mode="horizontal",seed=100)(x)......# Feature extracting stage
x = base_model(x)
x = tf.keras.layers.Flatten(name='3_Classification_1')(x)# Classification stage
x = tf.keras.layers.Dense(name='3_Classification_2',units=256,kernel_regularizer=tf.keras.regularizers.l2(l2=regularization_rate),kernel_initializer = 'he_uniform',activation='relu')(x)......# Prediction stage
predictions = tf.keras.layers.Dense(name='4_Prediction',units = 7,kernel_initializer = 'zeros',activation=tf.nn.softmax)(x)model = Model(inputs=input, outputs=predictions)model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate),loss='categorical_crossentropy',metrics=['acc'])
model.summary()

5. 模型训练与验证

5.1 模型训练 

        利用切分的训练集进行模型的训练,验证集进行模型的验证评估,并保存 val_acc 最高的模型权重:

checkpoint = ModelCheckpoint('save_models/best_model.h5', monitor='val_acc', verbose=1, mode='max',save_best_only=True)
early = EarlyStopping(monitor="val_acc", mode="max",restore_best_weights=True, patience=5)
lrp_reducer = ReduceLROnPlateau(monitor='val_loss', factor=lrp_factor, patience=lrp_patience, verbose=1)callbacks_list = [checkpoint, early, lrp_reducer]history = model.fit(x_train, y_train, batch_size=batch_size,epochs=epochs,steps_per_epoch=x_train.shape[0] // batch_size,verbose=1,callbacks=callbacks_list,validation_data=(x_val, y_val),validation_steps=x_val.shape[0]//batch_size
)

5.2 测试集预测结果的 AUC 得分与 ROC score 分布

        模型预测测试集的 AUC 得分,并绘制 ROC 曲线:

# 获取疾病标签名称列表
labels = list(emotions.values())# 创建一个范围,表示 x 轴上每个标签的位置
x = np.arange(len(labels))
# 设置柱状图的宽度
width = 0.80
fig, ax = plt.subplots(figsize=(20, 8), dpi=120)
rects = ax.bar(x, cate_auc, width, color='#EEC900')
ax.set_ylabel('AUC Score', fontsize=20)
ax.set_xlabel('标签', fontsize=20)
ax.set_title('不同类别模型预测 AUC Score 分布', fontsize=30)
ax.set_xticks(x, labels, fontsize=20)
ax.bar_label(rects, padding=3, fontsize=16)
fig.tight_layout()
plt.show()

5.3 困惑矩阵 Confusionmatrix

from matplotlib.colors import LogNorm
import seaborn as snstrue_labels = np.argmax(y_test, axis=1)
predictions = np.argmax(pred_test, axis=1)
conf_matrix = confusion_matrix(true_labels, predictions)plt.figure(figsize=(10, 8))
sns.heatmap(conf_matrix, annot=True, cmap='GnBu', fmt='g', xticklabels=[emotions[i] for i in range(len(conf_matrix))], yticklabels=[emotions[i] for i in range(len(conf_matrix))], norm=LogNorm())plt.title('Confusion Matrix')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()

6. 基于深度学习的面部表情分类识别系统

        利用 Flask + Bootstrap 框架搭建响应式布局的交互分析 web 系统,利用 keras load_model 加载训练好的性能最佳的模型,提供标准化 rest api,提供面部表情的在线识别功能。

6.1 系统首页

6.2 面部表情在线识别

        通过上传待测试面部表情图片,提交预测后,后端调用模型进行表情预测,预测结果返回给前端进行渲染可视化,展示预测的标签类别,及各类标签预测的概率分布。

7. 结论

        本项目以 MobileNetV2 为基础模型构建面向面部表情识别的卷积神经网络, 完成模型的训练、验证和测试,面部表情识别准确率达到 85%以上。并利用 Flask + Bootstrap 框架搭建交互式分析平台,方便用户进行表情的识别。

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

1. Python数据挖掘精品实战案例

2. 计算机视觉 CV 精品实战案例

3. 自然语言处理 NLP 精品实战案例

相关文章:

基于深度学习的面部表情分类识别系统

:温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 面部表情识别是计算机视觉领域的一个重要研究方向, 它在人机交互、心理健康评估、安全监控等领域具有广泛的应用。近年来,随着深度学习技术的快速发展&#xf…...

日志远程同步实验

目录 一.实验环境 二.实验配置 1.node1发送方配置 (1)node1写udp协议 (2)重启服务并清空日志 2.node2接收方配置 (1)node2打开接受日志的插件,指定插件用的端口 (2&#xff…...

数据结构之《二叉树》(中)

在数据结构之《二叉树》(上)中学习了树的相关概念,还了解的树中的二叉树的顺序结构和链式结构,在本篇中我们将重点学习二叉树中的堆的相关概念与性质,同时试着实现堆中的相关方法,一起加油吧! 1.实现顺序结构二叉树 在…...

php json_encode 参数 JSON_PRETTY_PRINT

https://andi.cn/page/621642.html...

【UE 网络】Gameplay框架在DS架构中的扮演的角色

目录 0 引言1 核心内容1.1 Gameplay各部分创建的流程1.2 Gameplay框架在DS和客户端的存在情况1.3 数据是独立存在于DS和客户端的 2 Gameplay框架各自负责的功能2.1 GameMode2.2 GameState2.3 PlayerController2.4 PlayerState2.5 Pawn2.6 AIController2.7 Actor2.8 HUD2.9 UI &…...

【云原生】StatefulSet控制器详解

StatefulSet 文章目录 StatefulSet一、介绍与特点1.1、介绍1.2、特点1.3、组成部分1.4、为什么需要无头服务1.5、为什么需要volumeClaimTemplate 二、教程2.1、创建StatefulSet2.2、查看部署资源 三、StatefulSet中的Pod3.1、检查Pod的顺序索引3.2、使用稳定的网络身份标识3.3、…...

使用 Python 制作一个属于自己的 AI 搜索引擎

1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…...

rust读取csv文件,匹配搜索字符

1.代码 use std::fs::File; use std::io::{BufRead, BufReader}; use regex::{Regex};fn main() {let f File::open("F:\\0-X-RUST\\1-systematic\\ch2-fileRead\\data\\test.csv").unwrap();let mut reader BufReader::new(f);let re Regex::new("45asd&qu…...

隐藏采购订单类型

文章目录 1 Introduction2 code 1 Introduction The passage is that how to hiden purchase type . 2 code DATA: ls_shlp_selopt TYPE ddshselopt. IF ( sy-tcode ME21N OR sy-tcode ME22N OR sy-tcode ME23N or sy-tcode ME51N OR sy-tcode ME52N OR sy-tcode ME5…...

ESP32人脸识别开发- 基础介绍(一)

一、ESP32人脸识别的方案介绍 目前ESP32和ESP32S3都是支持的,官方推的开发板有两种,一种 ESP-EYE ,没有LCD 另一种是ESP32S3-EYE,有带LCD屏 二、ESP32人脸识别选用ESP32的优势 ESP32S3带AI 加速功能,在人脸识别的速度是比ESP32快了不少 | S…...

编程学习指南:语言选择、资源推荐与高效学习策略

目录 一、编程语言选择 1. Java:广泛应用的基石 2. C/C:深入底层的钥匙 3. Python:AI与大数据的宠儿 4. Web前端技术:构建交互界面的艺术 二、学习资源推荐 1. 国内外在线课程平台 2. 官方文档与教程 3. 书籍与电子书 4…...

AWS开发人工智能:如何基于云进行开发人工智能AI

随着人工智能技术的飞速发展,企业对高效、易用的AI服务需求日益增长。Amazon Bedrock是AWS推出的一项创新服务,旨在为企业提供一个简单、安全的平台,以访问和集成先进的基础模型。本文中九河云将详细介绍Amazon Bedrock的功能特点以及其收费方…...

CentOS 8 的 YUM 源替换为国内的镜像源

CentOS 8 的 YUM 源替换为国内的镜像源 1.修改 DNS 为 114.114.114.1141.编辑 /etc/resolv.conf 文件:2.在文件中添加或修改如下内容:3.保存并退出编辑器。 2.修改 YUM 源为国内镜像1.备份原有的 YUM 源配置:2.下载新的 YUM 源配置3.清理缓存…...

网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程

前言 1.入行网络安全这是一条坚持的道路,三分钟的热情可以放弃往下看了。2.多练多想,不要离开了教程什么都不会了,最好看完教程自己独立完成技术方面的开发。3.有时多百度,我们往往都遇不到好心的大神,谁会无聊天天给…...

浅学爬虫-爬虫维护与优化

在实际项目中,爬虫的稳定性和效率至关重要。通过错误处理与重试机制、定时任务以及性能优化,可以确保爬虫的高效稳定运行。下面我们详细介绍这些方面的技巧和方法。 错误处理与重试机制 在爬虫运行过程中,网络不稳定、目标网站变化等因素可…...

STM32G070系列芯片擦除、写入Flash错误解决

在用G070KBT6芯片调用HAL_FLASHEx_Erase(&EraseInitStruct, &PageError)时,调试发现该函数返回HAL_ERROR,最后定位到FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE)函数出现错误,pFlash.ErrorCode为0xA0,即FLASH错误标…...

08.02_111期_Linux_NAT技术

NAT(network address translation)技术说明 IP报文在转发的时候需要考虑 源IP地址 和 目的IP地址, IP报文每到达一个节点,就会更改一次IP地址和目的IP地址,其中节点是指主机、服务器、路由器 那么这个更改是如何进行的呢? 除了…...

【2024蓝桥杯/C++/B组/小球反弹】

题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; (其中k1, k2为整数) Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x); 目标1:根据k1与k2的关系,找出一组最小整数组(k1, k2)&#xff…...

PHP中如何实现函数的可变参数列表

在PHP中,实现函数的可变参数列表主要有两种方式:使用func_get_args()函数和使用可变数量的参数(通过...操作符,自PHP 5.6.0起引入)。 1. 使用func_get_args()函数 func_get_args()函数用于获取传递给函数的参数列表&…...

串---链串实现

链串详解 本文档将详细介绍链串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南,读者将了解如何使用链串进行各种字符串操作。 1. 什么是链串? 链串是一种用于存储字符串的数据结构,它使用一组动态分配的节点来保存字符串中的…...

科技赋能生活——便携气象站

传统气象站往往庞大而复杂,需要专业人员维护,它小巧玲珑,设计精致,可以轻松放入背包或口袋,随身携带,不占空间。无论是城市白领穿梭于高楼大厦间,还是户外爱好者深入山林湖海,都能随…...

Golang——GC原理

1.垃圾回收的目的 将未被引用到的对象销毁,回收其所占的内存空间。 2.根对象是什么 全局变量:在编译器就能确定的存在于程序整个生命周期的变量。 执行栈:每个goroutine都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配…...

OpenStack概述

一、初识OpenStack OpenStack Docs: 概况 一)OpenStack架构简述 1、理解OpenStack OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集&…...

机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测

总结:本文为和鲸python 可视化探索训练营资料整理而来,加入了自己的理解(by GPT4o) 原活动链接 原作者:vgbhfive,多年风控引擎研发及金融模型开发经验,现任某公司风控研发工程师,对…...

PS 2024 百种常用插件下载安装教程【免费使用,先到先得】

文章目录 软件介绍软件下载安装步骤 专栏推荐: 超多精品软件(持续更新中…) 软件推荐: PS 2024 PR 2024 软件介绍 PS常用插件 此软件整合了市面近百款ps处理插件,可实现:一键制作背景,一键抠图…...

逻辑推理之lora微调

逻辑推理微调 比赛介绍准备内容lora微调lora微调介绍lora优势代码内容 start_vllm相关介绍调用 运行主函数提交结果总结相应连接 比赛介绍 本比赛旨在测试参与者的逻辑推理和问题解决能力。参与者将面对一系列复杂的逻辑谜题,涵盖多个领域的推理挑战。 比赛的连接:…...

前端-防抖代码

//防抖debounce(fn, time 1000) {let timer null;return function (...args) {if (timer) clearTimeout(timer);timer setTimeout(() > {fn.apply(this, args);}, time);};},// 输入变化处理函数async inputChange(value) {if (!this.debouncedInputChange) {this.deboun…...

langchain 入门指南 - 让 LLM 自动选择不同的 Prompt

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 让 LLM 自动选择不同的 Prompt 在上一篇文章中,我们学会了如何让 langchain 来自动选择不同的 LLM Chain,以便回…...

web浏览器播放rtsp视频流,海康监控API

概述 这里记录一下如何让前端播放rtsp协议的视频流 ​ 项目中调用海康API,生成的视频流(hls、ws、rtmp等)通过PotPlayer播放器都无法播放,说明视频流有问题,唯独rtsp视频流可以播放。 但是浏览器本身是无法播放rtsp视频的,即使…...

操作系统原理:程序、进程、线程的概念

文章目录 程序、进程、线程的概念程序(Program)进程(Process)线程(Thread)关系总结 在日常对操作系统的使用中,大家肯定对程序、进程和线程多少有所耳闻。作为操作系统的重要一部分,…...

湖南做网站360o/最好用的磁力搜索神器

导语 很多情况下,为了能够观察到数据之间的内部的关系,可以使用绘图来更好的显示规律。 比如在下面的几张动图中,使用matplotlib中的三维显示命令,使得我们可以对于logistic回归网络的性能与相关参数有了更好的理解。 下面的动图…...

黄页网站推广效果怎么样/系统优化助手

粤教版高中信息技术必修4.1.1 《认识计算机与程序》教学设计.docx文档编号:416422文档页数:4上传时间: 2018-09-28文档级别:普通资源文档类型:docx文档大小:18.20KB4.1.1 认识计算机与程序教学设计 共 1 学…...

网站备案信息变更/网页优化包括

一.体验Stream流 Stream流通常和Lambda结合使用 1.原本的方式 2.Stream流来改进 二.Stream流的常见生成方式 Collection体系的集合就是list set queue 三.Stream流中间操作 注意这几个方法中的参数好多要求的是函数式接口,这些函数式接口直接使用的Lambda方式实现…...

专门做海外服装购的网站有哪些/软件制作平台

这里我们介绍一下form元素与表单提交方面的知识。form元素form元素的DOM接口是HTMLFormElement,继承自HTMLElement,因而它与其他的HTML元素拥有相同的默认属性,不过它自身还有几个独有的属性和方法:属性值说明accept-charset服务器…...

百科网站开发/外链官网

2019独角兽企业重金招聘Python工程师标准>>> /** * * author caryt * */ public class test { /** * param args */ public static void main(String[] args) { // TODO Auto-generated method stub //结尾: System.out.println("舍入截尾测试&…...

商务网站建设项目的技术可行性/今日重大财经新闻

前提,用vscode和微信小程序工具同时编写代码 第一步:下载easy less 首先打开vscode,搜索easy less ,下载 如下 第二步:配置 点击右上角打开json设置 最后面补充输入以下代码: "less.compile"…...