python实现情绪识别模块,并将模块封装成可执行文件

目录:

  • 1.源码:
  • 2.情绪识别模型运行流程:
  • 3.模型封装需要注意的地方:
  • 4.未解决问题:

1.源码:

https://gitcode.com/xyint/deep_learning.git

2.情绪识别模型运行流程:

需要获取用户摄像头权限,摄像头会捕获用户的面部视频流,程序会在每一定时间内抽取一帧做处理,将图片与训练好的模型进行张量运算,最后输出各个情绪可能的百分比,取最高百分比的情绪为本次图片的情绪

由于人的情绪相对来说变化的不会很频繁所以情绪识别结果逻辑实现上是做了一个统计,即每30次情绪识别作为一个整体取其中占比最高的情绪作为本段时间用户的真实情绪,这样可以降低单次运算结果对整体结果的影响

import cv2
import logging
from EmotionDetection import DeepFace
from collections import defaultdict# 配置日志
logging.basicConfig(level=logging.ERROR,  # 仅记录ERROR及以上级别的日志format='%(asctime)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler("emotion_recognition.log"),  # 将日志输出到文件logging.StreamHandler()  # 仅在出现ERROR时在控制台输出]
)# 定义情绪与字母的对应关系
emotion_labels = {"angry": "a","disgust": "b","fear": "c","happy": "d","sad": "e","surprise": "f","neutral": "g"
}def update_active_emotion(emotion):# 获取对应字母label = emotion_labels.get(emotion, '?')  # 如果情绪不在列表中,用 '?' 表示try:# 打开文件并写入对应字母with open("active_emotion", "w") as f:f.write(label)except Exception as e:logging.error(f"无法更新 active_emotion 文件: {e}")def main():# 初始化摄像头(0为默认摄像头)cap = cv2.VideoCapture(0)if not cap.isOpened():logging.error("无法打开摄像头")return# 可选:设置摄像头分辨率cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1024)# 初始化分析频率控制frame_count = 0analyze_every_n_frames = 5  # 每隔5帧进行一次情绪分析# 情绪统计emotion_buffer = []  # 用于存储30次情绪结果current_dominant_emotion = "neutral"  # 当前主导情绪region = {'x': 0, 'y': 0, 'w': 100, 'h': 100}  # 初始化区域以避免未定义错误while True:ret, frame = cap.read()if not ret:logging.error("无法读取帧")breaktry:if frame_count % analyze_every_n_frames == 0:# DeepFace 分析当前帧results = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False,detector_backend='opencv'  # 可根据需要更改)# 如果检测到多张人脸,可以遍历 resultsif isinstance(results, list):faces = resultselse:faces = [results]face_detected = Falsefor face in faces:if face['region'] is None:# 未检测到人脸logging.error("未检测到人脸")continueface_detected = Trueregion = face['region']emotions = face['emotion']dominant_emotion = face['dominant_emotion']emotion_score = emotions[dominant_emotion]# 将当前情绪添加到缓冲区emotion_buffer.append(dominant_emotion)# 如果缓冲区达到30次,统计主要情绪并清空缓冲区if len(emotion_buffer) >= 30:# 统计每种情绪的出现次数emotion_counter = defaultdict(int)for emotion in emotion_buffer:emotion_counter[emotion] += 1# 找出出现次数最多的情绪if emotion_counter:new_dominant_emotion = max(emotion_counter, key=emotion_counter.get)if new_dominant_emotion != current_dominant_emotion:current_dominant_emotion = new_dominant_emotionlogging.error(f"主要情绪已更新为: {current_dominant_emotion}")# 更新 active_emotion 文件update_active_emotion(current_dominant_emotion)# 清空缓冲区emotion_buffer = []current_emotions = emotionsif not face_detected:# 没有检测到任何人脸,保持上一次的结果passexcept Exception as e:logging.error(f"处理帧时出错: {e}")# 仅在出现错误时显示提示cv2.putText(frame, "检测出错", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)# # 绘制当前情绪信息(如果有)# if current_emotions:#     x, y, w, h = region['x'], region['y'], region['w'], region['h']#     cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)#     text = f"{dominant_emotion} ({current_emotions[dominant_emotion]:.2f})"#     cv2.putText(frame, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)#     # 可选:显示所有情绪分数#     offset = 0#     for emotion, score in current_emotions.items():#         cv2.putText(frame, f"{emotion}: {score:.2f}", (x, y + h + 20 + offset),#                     cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 1)#         offset += 20# else:#     # 显示提示#     cv2.putText(frame, "未检测到人脸", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)# # 显示视频帧# cv2.imshow('Real-time Emotion Recognition', frame)# 按下 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):breakframe_count += 1# 释放资源cap.release()cv2.destroyAllWindows()if __name__ == "__main__":main()

在这里插入图片描述

按上述逻辑去处理发现识别效果还可

本次没有用太大的模型,大的模型相应的会对算力要求有所提高,占据的资源也会比较大

3.模型封装需要注意的地方:

为什么要封装?封装是为了将程序转换成设备可直接阅读并执行的二进制文件就像c文件一样通过gcc编译成可执行文件,那么没有c环境的设备也能通过可执行文件直接运行编辑好的程序,那么将这个情绪识别模型转换成可执行文件部署到jetson上的时候就不用下载相关python库了

封装好的模型直接做一个函数来使用了,也就是获取用户情绪函数,让它单独做一个进程去使用,将用户的情绪结果放置到active_emotion文件中,其他进程需要使用到用户情绪的时候直接打开文件读取即可为了读取方便可以用a、b、c、d…对应相应情绪

注意:
直接用pyinstaller 封装main.py会导致找不到锁定人脸的xml文件和未能将模型封装到可执行文件中所以要先编辑一下.spec文件,这个文件是告诉pyinstaller如何打包,告诉他要把这些重要文件也打包了

# -*- mode: python ; coding: utf-8 -*-a = Analysis(['main.py'],  # 主脚本路径pathex=[],    # 附加路径(可选)binaries=[],  # 二进制依赖(可选)datas=[       # 额外的数据文件('/home/saisi/Desktop/emotional/pth/best_model_CNN_RGB_size96.h5', 'pth'),  # 权重文件路径('/home/saisi/.pyenv/versions/narnat/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml', 'cv2/data'),  # Haar 文件路径('/home/saisi/.pyenv/versions/narnat/lib/python3.8/site-packages/cv2/data/haarcascade_eye.xml', 'cv2/data')],hiddenimports=[],  # 隐藏的依赖模块(可选)hookspath=[],      # 自定义 hook 脚本路径(可选)hooksconfig={},    # hook 配置(可选)runtime_hooks=[],  # 运行时 hook(可选)excludes=[],       # 排除的模块(可选)noarchive=False,   # 是否禁用归档(可选)optimize=0,        # 优化级别(可选)
)pyz = PYZ(a.pure)exe = EXE(pyz,a.scripts,[],exclude_binaries=True,name='main',          # 生成的可执行文件名debug=False,          # 是否启用调试模式bootloader_ignore_signals=False,strip=False,          # 是否剥离符号表upx=True,             # 是否启用 UPX 压缩console=True,         # 是否显示控制台窗口disable_windowed_traceback=False,argv_emulation=False,target_arch=None,     # 目标架构(可选)codesign_identity=None,entitlements_file=None,
)coll = COLLECT(exe,a.binaries,a.datas,strip=False,upx=True,upx_exclude=[],       # 排除 UPX 压缩的文件(可选)name='main',          # 生成的可执行文件名
)
    datas=[       # 额外的数据文件('/home/saisi/Desktop/emotional/pth/best_model_CNN_RGB_size96.h5', 'pth'),  # 权重文件路径('/home/saisi/.pyenv/versions/narnat/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml', 'cv2/data'),  # Haar 文件路径('/home/saisi/.pyenv/versions/narnat/lib/python3.8/site-packages/cv2/data/haarcascade_eye.xml', 'cv2/data')],

这里是说明这些模型的位置.h5是训练好的模型,xml是opencv锁定人脸的文件,将这俩东西位置指定好后再用pyinstaller打包项目就能正常使用了

# README# pth存放训练好的模型
# EmotionDetection内是依赖函数
# main.py是主程序
# Main.py用于检测摄像头是否正常
# active_emotion存储主要情绪,用字母对应方便读取
# emotion_recognition.log存储log信息
# 其他无用的东西全部被删掉了|"requirements.txt"|
|begin|deepface
Werkzeug
Pillow
requests
opencv-python
numpy
# already install in deepface
# Flask
# opencv-python
# numpy
# tqdm|end|### 上述用于下载依赖库## 直接使用
git clone https://gitee.com/daetz_0/emotion_detection_client_server.git
cd emotion_detection_client_server
pip install -r requirements.txt
python main.py
# use the "q" exit### 本识别情绪模型接口是最简洁的模型接口删掉了很多不必要的垃圾
### 这个模块做一个接口使用,类似一个函数
### 预计是将其封装成可执行文件,部署到ubantu测试看能否跑通,不行就直接部署要下载库很麻烦
### main.spec用于将此模块封装成可执行文件运行在Linux系统之上
### 打包命令 pyinstaller main.spec
### 需要模型 best_model_CNN_RGB_size96.h5
### https://gitee.com/daetz_0/emotion_detection_client_server/releases/download/model-weight-data-upload/best_model_CNN_RGB_size96.h5

4.未解决问题:

目前用不了GPU,应该是python库版本问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15087.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络防御高级02-综合实验

web页面: [FW]interface GigabitEthernet 0/0/0 [FW-GigabitEthernet0/0/0]service-manage all permit 需求一,接口配置: SW2: [Huawei]sysname SW2 1.创建vlan [sw2]vlan 10 [sw2]vlan 20 2.接口配置 [sw2]interface GigabitEther…

Arbess基础教程-创建流水线

Arbess(谐音阿尔卑斯) 是一款开源免费的 CI/CD 工具,本文将介绍如何使用 Arbess 配置你的第一条流水线,以快速入门上手。 1. 创建流水线 根据不同需求来创建不同的流水线。 1.1 配置基本信息 配置流水线的基本信息,如分组,环境&…

MySQL下载过程

MySQL Enterprise Edition Downloads | Oracle mysql官方下载网址(9.2版本) 下面的示例是5.7的包,过程是一样的 port:3308(默认的是3306,笔者下了一个占用了该端口) root:123456 问题…

StochSync:可在任意空间中生成360°全景图和3D网格纹理

StochSync方法可以用于在任意空间中生成图像,尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型,以实现零-shot生成,消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization(DS&…

Windows逆向工程入门之汇编环境搭建

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…

【多模态大模型】系列1:CLIP【多模态领域开山之作】

目录 1 模型结构2 伪代码3 Loss计算方法 官方网站:https://openai.com/index/clip/ 论文:Learning Transferable Visual Models From Natural Language Supervision GitHub:https://github.com/openai/CLIP Colab:https://colab.r…

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现 目录 SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来(优…

idea整合deepseek实现AI辅助编程

1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号,DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息,File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…

k8s部署elasticsearch

前置环境:已部署k8s集群,ip地址为 192.168.10.1~192.168.10.5,总共5台机器。 1. 创建provisioner制备器(如果已存在,则不需要) 制备器的具体部署方式,参考我之前的文章:k8s部署rab…

(done) openMP学习 (Day13: 线程私有数据和如何支持库(Pi again),蒙特卡洛计算 Pi,线性同余法)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 视频:https://www.bilibili.com/video/BV1SW411s7ST?s…

借助AI,轻松读好书

读书笔记 AI可以帮助我们写读书笔记,通过智能化的分类和标注技术,将我们的笔记进行分类整理,使其更加清晰易懂,帮助我们高效,准确,深入的总结和掌握书中的知识,实现更好的学习和成长。 《异类》…

【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯语言模型的发展历程:从统计方法到大规模预训练模型的演化1 统计语言模型(Statistical Language Model, SLM):统…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识

课程介绍 参加“Azure 在线技术公开课:基础知识”活动,培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动,扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…

python 语音识别方案对比

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…

C# OpenCvSharp 部署MOWA:多合一图像扭曲模型

目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA:多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…

【Java】线上故障排查实战

引言 JVM命令详细可以看前一篇文章,本篇文章基于之前的命令做一次简单的线上故障排查分析 JVM常见命令 实战 1. 一般显示都是Linux系统,我们排查winodows系统想知道CPU和内存使用情况,打开任务管理器就可以出现图形化界面,而L…

编译spring 6.2.2

如何编译Spring 6.2.2 下载spring 6.2.2 首先,下载spring 6.2.2,地址:下载 解压到你的目录下。 下载gradle 下载gradle,这是spring项目的依赖管理工具,本文下载的是8.12.1 gradle下载 下载合适的JDK 本文下载的是…

深度求索(DeepSeek)的AI革命:NLP、CV与智能应用的技术跃迁

Deepseek官网:DeepSeek 引言:AI技术浪潮中的深度求索 近年来,人工智能技术以指数级速度重塑全球产业格局。在这场技术革命中,深度求索(DeepSeek)凭借其前沿的算法研究、高效的工程化能力以及对垂直场景的…

Android Studio超级详细讲解下载、安装配置教程(建议收藏)

博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…