Python实现人脸表情识别

 

LCNsyXdX.jpg

1. 系统概述

本项目实现了一个实时人脸表情识别系统,通过摄像头实时捕获视频流,检测人脸位置并识别表情。系统使用 DeepFace 进行表情分析,支持7种基本表情的识别:开心、难过、生气、恐惧、惊讶、平静和厌恶。

2. 核心功能

  • 实时人脸检测:使用 face_recognition 库实时定位人脸
  • 表情识别:使用 DeepFace 分析人脸表情
  • 多人脸处理:支持同时识别多个人脸的表情
  • 中文显示:支持中文标签显示
  • 置信度显示:显示表情识别的置信度
    vFr-Pk20.jpg

3. 技术实现

核心库介绍

  • DeepFace:基于深度学习的人脸分析库
    • • 支持多种表情识别
    • • 预训练模型性能好
    • • API简单易用
  • face_recognition:人脸检测和定位
  • OpenCV (cv2):视频流处理和图像绘制
  • PIL:中文文本渲染

关键步骤解析

  1. 1.初始化和预加载
# 预加载模型减少首次识别延迟
DeepFace.analyze(
    np.zeros((48483), dtype=np.uint8),
    actions=['emotion'],
    enforce_detection=False
)
  1. 2.表情识别处理
# 使用DeepFace分析表情
result = DeepFace.analyze(
    face_image, 
    actions=['emotion'],
    enforce_detection=False,
    silent=True
)
  1. 3.中文标签映射
self.emotion_map = {
    'happy''开心',
    'sad''难过',
    'angry''生气',
    'fear''恐惧',
    'surprise''惊讶',
    'neutral''平静',
    'disgust''厌恶'
}

4. 性能优化

图像处理优化

  • • 缩小输入图像加快处理速度
  • • 预加载模型减少延迟
  • • 使用 silent 模式减少输出

识别准确度优化

  • • 使用 enforce_detection=False 提高容错性
  • • 添加异常处理确保稳定运行
  • • 置信度过滤提高准确性

5. 使用说明

环境准备

# Python 3.10环境(推荐)
conda create -n face_rec python=3.10
conda activate face_rec

# 安装依赖
pip install deepface tensorflow
pip install face_recognition opencv-python pillow

运行步骤

  1. 1. 确保摄像头可用
  2. 2. 运行程序:
python emotion_recognition_df.py
  1. 3. 使用说明:
    • • 程序启动后会自动打开摄像头
    • • 实时显示检测到的人脸和表情
    • • 显示表情类型和置信度
    • • 按'q'键退出程序

6. 注意事项

  • • 确保光线充足
  • • 保持适当的人脸距离
  • • 避免剧烈运动
  • • 首次运行可能需要下载模型
  • • CPU占用较高是正常现象

7. 技术特点

  • • 实时处理:支持实时视频流分析
  • • 多人识别:可同时处理多个人脸
  • • 高精度:使用预训练深度学习模型
  • • 中文支持:显示中文表情标签
  • • 开发友好:代码结构清晰,易于扩展

8. 源代码

"""
emotion_recognition_df.py

人脸表情识别系统

本程序实现了一个实时人脸表情识别系统,主要功能包括:
1. 实时人脸检测
2. 表情识别分析
3. 多人脸同时处理
4. 中文结果显示

作者:[Jojo]
版本:1.0.0
日期:2025-02-12
"""

import cv2
import numpy as np
from deepface import DeepFace
import face_recognition
from PIL import Image, ImageDraw, ImageFont

classEmotionRecognizer:
    """
    表情识别器类
    
    实现了人脸表情识别的核心功能,包括:
    - 表情识别和分析
    - 中文标签映射
    - 结果可视化
    """
    
    def __init__(self):
        """初始化表情识别器"""
        # 表情标签映射字典
        self.emotion_map = {
            'happy''开心',
            'sad''难过',
            'angry''生气',
            'fear''恐惧',
            'surprise''惊讶',
            'neutral''平静',
            'disgust''厌恶',
            'happiness''开心',
            'sadness''难过',
            'anger''生气',
            'scared''害怕',
            'surprised''惊讶',
            'disgusted''厌恶',
            'calm''平静'
        }
        
        # 预加载模型以减少首次识别延迟
        print("正在预加载模型...")
        try:
            DeepFace.analyze(
                np.zeros((48483), dtype=np.uint8),
                actions=['emotion'],
                enforce_detection=False
            )
        except:
            pass
        
    def cv2_add_chinese_text(self, img, text, position, textColor=(02550), textSize=30):
        """
        在图像上添加中文文本
        
        参数:
            img (ndarray): 输入图像
            text (str): 要显示的文本
            position (tuple): 文本位置 (x, y)
            textColor (tuple): 文本颜色 (B, G, R)
            textSize (int): 文本大小
            
        返回:
            ndarray: 添加文本后的图像
        """
        if isinstance(img, np.ndarray):
            img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        
        draw = ImageDraw.Draw(img)
        fontStyle = ImageFont.truetype("Arial Unicode.ttf", textSize, encoding="utf-8")
        draw.text(position, text, textColor, font=fontStyle)
        
        return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
        
    def predict_emotion(self, face_image):
        """
        预测人脸表情
        
        使用DeepFace分析人脸表情,返回表情类型和置信度。
        
        参数:
            face_image (ndarray): 人脸图像区域
            
        返回:
            tuple: (表情类型, 置信度)
        """
        try:
            result = DeepFace.analyze(
                face_image, 
                actions=['emotion'],
                enforce_detection=False,
                silent=True
            )
            
            if isinstance(result, list):
                result = result[0]
                
            emotion = result['dominant_emotion']
            emotions = result['emotion']
            confidence = emotions[emotion] / 100.0
            
            emotion_zh = self.emotion_map.get(emotion.lower(), '未知')
            return emotion_zh, confidence
            
        except Exception as e:
            print(f"预测出错: {str(e)}")
            return "未知"0.0

def main():
    """主程序入口"""
    # 初始化表情识别器
    print("正在初始化表情识别器...")
    emotion_recognizer = EmotionRecognizer()
    
    # 打开摄像头
    print("正在启动摄像头...")
    cap = cv2.VideoCapture(0)
    
    if not cap.isOpened():
        print("错误:无法打开摄像头")
        return
        
    print("开始运行,按 'q' 键退出")
    
    while True:
        # 读取视频帧
        ret, frame = cap.read()
        if not ret:
            print("错误:无法获取视频帧")
            break
            
        # 图像预处理
        small_frame = cv2.resize(frame, (00), fx=0.25, fy=0.25)
        rgb_frame = cv2.cvtColor(small_frame, cv2.COLOR_BGR2RGB)
        
        # 人脸检测
        face_locations = face_recognition.face_locations(rgb_frame)
        
        # 处理每个检测到的人脸
        for (top, right, bottom, left) in face_locations:
            # 坐标转换
            top *= 4
            right *= 4
            bottom *= 4
            left *= 4
            
            # 提取人脸区域
            face_image = frame[transform: translateY(bottom, left:right]
            
            # 表情识别
            em)otion, confidence = emotion_recognizer.predict_emotion(face_image)
            
            # 结果可视化
            color = (02550)
            cv2.rectangle(frame, (left, top), (right, bottom), color, 2)
            
            # 显示表情和置信度
            text = f"{emotion} ({confidence:.2%})"
            frame = emotion_recognizer.cv2_add_chinese_text(
                frame, 
                text, 
                (left, max(top - 400)),
                textColor=(02550),
                textSize=30
            )
        
        # 显示结果
        cv2.imshow('Emotion Recognition', frame)
        
        # 检查退出条件
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # 释放资源
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

 



  • 《计算机视觉》
《计算机视觉》第1篇 Python调用智谱GLM-4V-Flash多模态大模型进行生物识别《计算机视觉》第2篇 Python实现人脸检测《计算机视觉》第3篇 基于face_recognition和Streamlit的人脸识别系统《计算机视觉》第4篇 Python实时人脸识别
 
posted @ 2025-03-19 13:29  知识天地  阅读(92)  评论(0)    收藏  举报