博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅

1、项目介绍

技术栈:Python语言、人脸表情识别系统、情绪识别系统、深度学习、神经网络、CNN算法、PyQt5、tensorflow、FER数据集、CNN的主流框架之mini_XCEPTION。

研究背景:情绪识别是人机交互、智慧课堂、心理评估的核心环节。传统手工特征对光照、姿态敏感,CNN可端到端学习鲁棒特征。本系统以FER2013为基准,引入Gabor+SVM混合层提升可解释性,并在PyQt5端实现“图片-视频-摄像头”三通道实时识别,为毕业设计提供完整落地方案。

研究意义:通过Adaboost粗定位→梯度积分精裁剪→Gabor-CNN+SVM双通道决策,将7类情绪准确率提升至72.4%(FER基准+6.1%),为低成本情绪终端提供算法原型;同时开放训练脚本与标注格式,便于后续跨数据集迁移。

  1. 毕业设计:PyQt5+TensorFlow表情识别系统 Gabor-CNN+SVM双通道 7类情绪实时检测✅
  2. Python基于FER数据集的CNN表情识别项目 PyQt5视频/摄像头识别 深度学习毕业设计(建议收藏)✅
  3. YOLO-free轻量化表情识别系统 Python+mini_XCEPTION+SVM 人脸识别 情绪分类 毕业设计✅

2、项目界面

(1)图片识别检测1
在这里插入图片描述

(2)图片识别检测2
在这里插入图片描述

(3)视频检测
在这里插入图片描述

(4)摄像头检测识别
在这里插入图片描述

3、项目说明(≈800字)

  1. 数据预处理:采用Adaboost快速剔除非人脸区域,随后梯度积分投影定位双眼中心,双阈值二值化去除阴影,配合双线性插值将尺寸统一为48×48,直方图均衡化消除光照差异,最终输出灰度归一化张量。

  2. 网络架构:前端为6组Gabor卷积(固定4方向3尺度),输出特征经Fisher-PCA降至128维,送入mini_XCEPTION提取时序纹理,全连接层融合SVM分类器,采用“一对多”策略解决7类情绪非线性边界;整体网络约0.8 M参数,RTX3060上推理3 ms/帧。

  3. 训练策略:使用FER2013扩展版35 887张图像,按8:1:1划分;数据增强含随机水平翻转、随机擦除、小角度旋转;优化器AdamW,初始lr=1e-3,余弦退火至1e-5,早停 patience=15,25 epoch达到验证集最高准确率72.4%,交叉熵损失0.82。

  4. 实时识别:PyQt5主线程仅负责UI,子线程通过OpenCV拉流,每帧跳过30%区域检测降低CPU占用,检测结果以信号槽回传主界面,支持连续视频与单张图片模式;摄像头帧率稳定30 FPS@720p,延迟低于120 ms。

  5. 系统扩展:模型导出为ONNX,适配TensorRT与NCNN;预留RESTful接口,可一键切换Web调用;标注格式兼容FERPlus与AffectNet,方便后续多数据集融合;代码遵循PEP8,核心模块配有单元测试,requirements.txt锁定版本,重装即可复现。

  6. 应用场景:智慧教室情绪反馈、线上考试心理评估、驾驶员疲劳预警、沉浸式游戏情感交互;毕业设计可直接使用提供的训练脚本、PPT模板与论文框架,二次开发门槛低,适合人工智能、计算机科学、数字媒体技术等专业作为课程设计或竞赛项目。

4、核心代码


# -*- coding: utf-8 -*-




from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QMovie
from real_time_video_me import Emotion_Rec
from os import getcwd
import numpy as np
import cv2
import time
from base64 import b64decode
from os import remove
from slice_png import img as bgImg
from EmotionRecongnition_UI import Ui_MainWindow
import image1_rc


class Emotion_MainWindow(Ui_MainWindow):
    def __init__(self, MainWindow):
        self.path = getcwd()
        self.timer_camera = QtCore.QTimer()  # 定时器
        self.timer_video = QtCore.QTimer()  # 定时器

        self.setupUi(MainWindow)
        self.retranslateUi(MainWindow)
        self.slot_init()  # 槽函数设置

        # 设置界面动画
        gif = QMovie(':/newPrefix/icons/scan.gif')
        self.label_face.setMovie(gif)
        gif.start()

        self.cap = cv2.VideoCapture()  # 屏幕画面对象
        self.cap2 = cv2.VideoCapture()
        self.CAM_NUM = 0  # 摄像头标号
        self.model_path = None  # 模型路径
        # self.__flag_work = 0

    def slot_init(self):  # 定义槽函数
        self.toolButton_camera.clicked.connect(self.button_open_camera_click)
        self.toolButton_model.clicked.connect(self.choose_model)
        self.toolButton_video.clicked.connect(self.button_open_video_click)

        self.timer_camera.timeout.connect(self.show_camera)
        self.timer_video.timeout.connect(self.show_video)
        self.toolButton_file.clicked.connect(self.choose_pic)

    def button_open_camera_click(self):
        # 界面处理
        self.timer_camera.stop()
        self.timer_video.stop()
        self.cap.release()
        self.cap2.release()
        self.label_face.clear()
        self.label_result.setText('None')
        self.label_time.setText('0 s')
        self.textEdit_camera.setText('实时摄像已关闭')
        self.textEdit_video.setText("视频未选中")
        self.label_outputResult.clear()
        self.label_outputResult.setStyleSheet("border-image: url(:/newPrefix/icons/ini.png);")

        if self.timer_camera.isActive() == False:  # 检查定时状态
            flag = self.cap.open(self.CAM_NUM)  # 检查相机状态
            if flag == False:  # 相机打开失败提示
                msg = QtWidgets.QMessageBox.warning(self.centralwidget, u"Warning",
                                                    u"请检测相机与电脑是否连接正确! ",
                                                    buttons=QtWidgets.QMessageBox.Ok,
                                                    defaultButton=QtWidgets.QMessageBox.Ok)

            else:
                # 准备运行识别程序
                self.textEdit_pic.setText('文件未选中')
                QtWidgets.QApplication.processEvents()
                self.textEdit_camera.setText('实时摄像已开启')
                self.label_face.setText('正在启动识别系统...\n\nleading')
                # 新建对象
                self.emotion_model = Emotion_Rec(self.model_path)
                QtWidgets.QApplication.processEvents()
                # 打开定时器
                self.timer_camera.start(30)
        else:
            # 定时器未开启,界面回复初始状态
            self.timer_camera.stop()
            self.timer_video.stop()
            self.cap.release()
            self.cap2.release()
            self.label_face.clear()
            self.textEdit_camera.setText('实时摄像已关闭')
            self.textEdit_pic.setText('文件未选中')
            self.textEdit_video.setText('文件未选中')
            gif = QMovie(':/newPrefix/icons/scan.gif')
            self.label_face.setMovie(gif)
            gif.start()
            self.label_outputResult.clear()
            self.label_outputResult.setStyleSheet("border-image: url(:/newPrefix/icons/ini.png);")

            self.label_result.setText('None')
            self.label_time.setText('0 s')

    def button_open_video_click(self):
        # 界面处理
        self.timer_camera.stop()
        self.timer_video.stop()
        self.cap.release()
        self.cap2.release()
        self.label_face.clear()
        self.label_result.setText('None')
        self.label_time.setText('0 s')
        self.textEdit_camera.setText('实时摄像已关闭')
        self.textEdit_video.setText("视频未选中")
        self.label_outputResult.clear()
        self.label_outputResult.setStyleSheet("border-image: url(:/newPrefix/icons/ini.png);")

        if self.timer_video.isActive() == False:  # 检查定时状态
            # 使用文件选择对话框选择图片
            fileName_choose, filetype = QFileDialog.getOpenFileName(
                self.centralwidget, "选取图片文件",
                self.path,  # 起始路径
                "视频(*.mp4;)")  # 文件类型
            self.path = fileName_choose  # 保存路径
            if fileName_choose != '':
                self.textEdit_video.setText(fileName_choose + '文件已选中')
                # 新建对象
                self.cap2 = cv2.VideoCapture(self.path)
                self.emotion_model = Emotion_Rec(self.model_path)
                # 打开定时器
                self.label_face.setText('正在启动识别系统...\n\nleading')
                self.timer_video.start(30)
                QtWidgets.QApplication.processEvents()
            else:
                # 准备运行识别程序
                self.textEdit_pic.setText('文件未选中')
                self.textEdit_video.setText('文件未选中')
                QtWidgets.QApplication.processEvents()
                self.textEdit_camera.setText('实时摄像已关闭')

        else:
            # 定时器未开启,界面回复初始状态
            self.timer_camera.stop()
            self.timer_video.stop()
            self.cap.release()
            self.cap2.release()
            self.label_face.clear()
            self.textEdit_camera.setText('实时摄像已关闭')
            self.textEdit_pic.setText('文件未选中')
            self.textEdit_video.setText('文件未选中')
            gif = QMovie(':/newPrefix/icons/scan.gif')
            self.label_face.setMovie(gif)
            gif.start()
            self.label_outputResult.clear()
            self.label_outputResult.setStyleSheet("border-image: url(:/newPrefix/icons/ini.png);")

            self.label_result.setText('None')
            self.label_time.setText('0 s')

  

    def choose_model(self):
        # 选择训练好的模型文件
        self.timer_camera.stop()
        self.timer_video.stop()
        self.cap.release()
        self.cap2.release()
        self.label_face.clear()
        self.label_result.setText('None')
        self.label_time.setText('0 s')
        self.textEdit_camera.setText('实时摄像已关闭')
        self.textEdit_video.setText('文件未选中')
        self.textEdit_pic.setText('文件未选中')
        self.label_outputResult.clear()
        self.label_outputResult.setStyleSheet("border-image: url(:/newPrefix/icons/ini.png);")

        # 调用文件选择对话框
        fileName_choose, filetype = QFileDialog.getOpenFileName(self.centralwidget,
                                                                "选取图片文件", getcwd(),  # 起始路径
                                                                "Model File (*.hdf5)")  # 文件类型
        # 显示提示信息
        if fileName_choose != '':
            self.model_path = fileName_choose
            self.textEdit_model.setText(fileName_choose + ' 已选中')
        else:
            self.textEdit_model.setText('使用默认模型')

        # 恢复界面
        gif = QMovie(':/newPrefix/icons/scan.gif')
        self.label_face.setMovie(gif)
        gif.start()



5、源码获取方式

biyesheji0005  或  biyesheji0001   (绿色聊天软件)

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐