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

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

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

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

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

1、项目介绍

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

识别分类:生气、厌恶、恐惧、快乐、伤心、惊讶、中性(7种)。

系统沿用经典“人脸检测→预处理→特征提取→分类”链路:先以AdaBoost快速粗裁,再用梯度积分投影+双阈值二值化精确定位人眼,经双线性插值尺度归一化与直方图均衡灰度归一化后,得到统一尺寸与灰度的表情图;网络方面以Gabor小波构造固定权值卷积层,SVM替换传统全连接,并用Fisher-PCA对特征降维,最后通过反向传播完成端到端训练。整套流程在FER公开数据集上训练25轮,7类表情平均准确率达到93%,可实时处理图片、视频与摄像头流,为课堂教学、心理评测、人机交互提供轻量级演示方案。

2、项目界面

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

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

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

(4)摄像头检测识别
(界面同视频检测,实时窗口显示识别结果)

3、项目说明

  1. 关键词:Python、TensorFlow、CNN、mini_XCEPTION、PyQt5、FER数据集
  2. 训练与预测代码、标注数据集已打包;qt_check为PyQt5桌面版,web_check为Django网页版(可选)
  3. TensorFlow 2.11 + PyQt5 5.15 环境一键安装,25轮迭代后模型约3.5 MB,适合笔记本与树莓派部署
  4. 系统支持图片、视频、摄像头三种输入;识别结果以汉字+置信度实时叠加,同时记录时间戳与类别到本地CSV,方便后续统计与可视化

首先运用AdaBoost算法对人脸面部表情图像进行粗略裁剪,再利用梯度积分投影和双阈值二值化定位人眼,实现精确裁剪;随后通过双线性插值完成尺度归一化,并用直方图均衡进行灰度归一化,得到统一尺寸与灰度的表情图。网络以Gabor小波构造固定权值卷积层,全连接层采用SVM,结合Fisher-PCA降维,最终通过反向传播训练得到适用于7类表情识别的轻量级CNN结构。实验表明,该方法在FER数据集上准确率和实时性均优于传统PCA+SVM方案;配套PyQt5 GUI支持图片、视频、摄像头实时识别,为表情识别教学、心理评测及友好的人机交互提供完整、可复现的代码与模型参考。

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  # 模型路径

    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(:/

5、源码获取方式

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

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

Logo

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

更多推荐