目录
应用场景
实现组件
1. 硬件组件
2. 软件库与依赖
3. 功能模块
代码详解(实现思路)
导入必要的库
打开摄像头并初始化变量
主循环
FPS计算
情绪分析及结果展示
显示FPS和图像
退出条件
编辑
完整代码
效果展示
自然的
开心的
伤心的
恐惧的
惊讶的

效果展示
自然的

开心的

伤心的

恐惧的

惊讶的

应用场景
应用场景比较广泛,尤其是在需要了解和分析人类情感反应的场合。:
-
心理健康评估:在心理健康领域,可以通过长期监控和分析一个人的情绪变化来辅助医生进行诊断或治疗效果评估。
-
用户体验研究:在产品设计、广告制作或网站开发过程中,通过观察用户在使用过程中的情绪反应,来优化产品的用户体验。
-
互动娱乐:在游戏或虚拟现实应用中,根据玩家的情绪状态动态调整游戏难度或故事情节,以增加沉浸感和互动性。
-
安全监控:在公共安全领域,通过情绪识别技术可以早期发现异常行为或潜在威胁,例如在机场安检区域或者大型公共活动场所。
-
教育与培训:帮助教师了解学生在学习过程中的情绪状态,以便及时调整教学方法;也可用于职业培训中,通过模拟不同情境下的情绪反应来进行针对性训练。
-
智能助手:集成到智能家居系统或个人助理设备中,让设备能够感知用户的情绪状态,并据此提供更加个性化的服务或响应。
-
疲劳驾驶预测:对于司机情绪的分析,可以监控和作为一种影响因子判断出出司机的驾驶状态,以至于安全的驾驶。
总之,随着人工智能技术的发展,情绪识别作为一种重要的交互方式,在许多领域都有着巨大的潜力和广阔的应用前景。

实现组件
1. 硬件组件
- 摄像头:用于捕捉实时视频流,通常为电脑内置的摄像头或外接USB摄像头。
2. 软件库与依赖
-
OpenCV (
cv2):一个开源的计算机视觉和机器学习软件库。它提供了大量的图像处理和计算机视觉算法,这里主要用于捕获摄像头视频流、处理图像以及在图像上绘制矩形框和文字。 -
time:Python标准库的一部分,用于计算时间间隔,进而计算FPS(每秒帧数)。
-
numpy (
np):虽然在这段代码中没有直接使用,但它是进行科学计算的基础库,通常与OpenCV一起用于更复杂的图像处理任务。 -
DeepFace:这是一个深度学习库,专门用于面部识别及其相关任务(如年龄、性别、情绪等属性的预测)。在这个应用中,DeepFace被用来对每一帧视频中的人脸进行情绪分析。
3. 功能模块
- 视频捕捉与处理模块:
- 使用
cv2.VideoCapture(0)打开摄像头,并通过循环不断读取视频帧。 - 对每一帧图像进行处理,包括计算FPS、进行情绪分析以及在图像上标注结果。
- 使用
- FPS计算模块:
- 利用
time.time()获取当前时间戳,通过计算连续两帧之间的时间差来计算瞬时FPS,并采用滑动平均方法平滑FPS值。
- 利用
- 情绪分析模块:
- 调用
DeepFace.analyze()函数对每一帧中的所有人脸进行情绪分析。分析结果包含每个人脸的位置、主导情绪及置信度。
- 调用
- 结果显示模块:
- 使用OpenCV提供的绘图函数(如
cv2.rectangle()和cv2.putText())在视频帧上标记出人脸位置、显示情绪信息及置信度,并展示当前的FPS值。
- 使用OpenCV提供的绘图函数(如
- 用户交互模块:
- 通过监听键盘输入(
cv2.waitKey(1)),允许用户按下q键退出程序。
- 通过监听键盘输入(

代码详解(实现思路)
主要是通过摄像头捕捉实时视频流,然后使用深度学习模型对捕捉到的**每一帧进行情绪分析**,然后在视频上标记出检测到的**情绪和置信度**,并显示当前的FPS(每秒帧数)。下面是对代码各个部分的详细解释:
导入必要的库
import cv2
import time
import numpy as np
from deepface import DeepFace
cv2:OpenCV库,用于处理图像和视频流。time:用于计算时间间隔,进而计算FPS。numpy:虽然在这段代码中没有直接使用,但通常与OpenCV一起用于图像处理。DeepFace:一个基于深度学习的面部识别和分析库。
打开摄像头并初始化变量
cap = cv2.VideoCapture(0)
prev_time = time.time()
fps = 0
alpha = 0.9
cv2.VideoCapture(0):打开默认摄像头(0代表第一个摄像头设备)。prev_time和fps:用于计算FPS的变量。prev_time保存上一帧的时间戳,而fps保存当前帧率。alpha:用于滑动平均计算FPS的权重值。
主循环
while True:
ret, frame = cap.read()
if not ret: break
...
cap.release()
cv2.destroyAllWindows()
- 这个无限循环不断从摄像头读取帧(
cap.read())。如果读取失败(ret为False),则退出循环。 - 循环体内部实现了帧的获取、FPS计算、情绪分析、结果绘制以及画面显示。
FPS计算
current_time = time.time()
delta_time = current_time - prev_time
prev_time = current_time
if delta_time > 0:
instant_fps = 1.0 / delta_time
fps = alpha * fps + (1 - alpha) * instant_fps
- 计算自上次迭代以来经过的时间(
delta_time),然后根据这个时间差计算瞬时FPS(instant_fps)。 - 使用滑动平均更新总体FPS(
fps)。
情绪分析及结果展示
result = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False)
...
- 对每一帧调用
DeepFace.analyze()方法进行情绪分析。actions=['emotion']指定只执行情绪分析。 - 遍历返回的结果,在画面上标出人脸的位置(
cv2.rectangle)和识别出的情绪信息(cv2.putText)。
显示FPS和图像
cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2)
cv2.imshow("Emotion Detection", frame)
- 在图像上显示当前的FPS。
- 使用
cv2.imshow()显示带有标注的图像。
退出条件
if cv2.waitKey(1) & 0xFF == ord('q'):
break
- 如果按下键盘上的
q键,则退出循环结束程序。
最后,释放摄像头资源(cap.release())并关闭所有窗口(cv2.destroyAllWindows())。
完整代码
import cv2
import time
import numpy as np
from deepface import DeepFace
# 打开摄像头
cap = cv2.VideoCapture(0)
# FPS 计算参数
prev_time = time.time()
fps = 0
alpha = 0.9 # 滑动平均权重,数值越大,FPS 越平稳
while True:
ret, frame = cap.read()
if not ret:
break
# 计算 FPS
current_time = time.time()
delta_time = current_time - prev_time
prev_time = current_time
if delta_time > 0:
instant_fps = 1.0 / delta_time
fps = alpha * fps + (1 - alpha) * instant_fps # 计算滑动平均 FPS
try:
# 进行表情识别
result = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False)
for face in result:
x, y, w, h = face['region']['x'], face['region']['y'], face['region']['w'], face['region']['h']
emotion = face['dominant_emotion']
confidence = face['emotion'][emotion] # 获取表情的置信度
# 绘制人脸矩形框
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 在人脸上方显示情绪信息
text = f'{emotion} ({confidence:.2f}%)'
cv2.putText(frame, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
except Exception as e:
print("无法检测到人脸:", e)
# 显示 FPS(平滑更新)
cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2)
# 显示图像
cv2.imshow("Emotion Detection", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()

总结
核心在于结合了OpenCV进行视频处理和DeepFace进行面部情绪分析的能力。通过这些组件,实现从摄像头实时捕捉视频、分析视频中人物的情绪状态并在视频画面上直观地展示分析结果的功能。
这不仅展示了如何利用现有的AI库快速构建实用的应用程序,也为进一步开发基于情感识别的复杂系统提供了基础框架或者是组件。
零基础入门AI大模型
今天贴心为大家准备好了一系列AI大模型资源,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
有需要的小伙伴,可以点击下方链接免费领取⬇️⬇️⬇️【保证100%免费】
1.学习路线图

如果大家想领取完整的学习路线及大模型学习资料包,可以扫下方二维码获取

👉2.大模型配套视频👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。(篇幅有限,仅展示部分)

大模型教程
👉3.大模型经典学习电子书👈
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(篇幅有限,仅展示部分,公众号内领取)

电子书
👉4.大模型面试题&答案👈
截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(篇幅有限,仅展示部分,公众号内领取)

大模型面试
**因篇幅有限,仅展示部分资料,**有需要的小伙伴,可以点击下方链接免费领取⬇️⬇️⬇️【保证100%免费】
**或扫描下方二维码领取 **



3725

被折叠的 条评论
为什么被折叠?



