在人机交互和情感计算领域,人脸表情识别一直是一个备受关注的研究方向。随着深度学习技术的快速发展,特别是目标检测和图像分类算法的进步,实时、高精度的人脸表情识别系统已经成为可能。本文将详细介绍一个基于YOLOv11的人脸表情识别系统,该系统不仅能够实现实时人脸检测,还能准确识别多种表情状态,具有广泛的应用前景。
项目地址:https://github.com/AND-Q/Facial-Expression-Recognition
本文介绍的人脸表情识别系统是一个完整的端到端解决方案,主要包含以下核心功能:
本系统采用YOLOv11(You Only Look Once)作为人脸检测的核心算法。YOLO系列算法是目前最先进的目标检测算法之一,具有速度快、精度高的特点,特别适合实时应用场景。
YOLOv11相比早期版本,在网络结构和训练策略上都有显著改进:
在本系统中,我们使用专门针对人脸检测任务微调的YOLOv11模型(yolov11n-face.pt),该模型能够在各种光照条件和角度下准确检测人脸。
表情识别采用基于YOLO架构的分类模型。我们训练了多个模型以适应不同场景:
训练过程中采用了多种先进技术以提高模型性能:
系统采用模块化设计,主要包含以下几个核心模块:
图形用户界面是系统的交互入口,基于PyQt5开发,主要功能包括:
核心类:
VideoThread
:视频处理线程,负责实时视频流的处理FaceDetectionApp
:主应用窗口,提供用户界面和控制功能负责人脸检测的核心功能,包括:
主要函数:
download_face_model()
:下载YOLOv11人脸检测模型detect_faces_video()
:视频人脸检测(摄像头)detect_faces_image()
:图像人脸检测detect_faces_video_file()
:视频文件人脸检测负责表情识别的核心功能,包括:
主要函数:
recognize_emotion()
:识别图片中的人脸表情负责训练表情识别模型,主要特点:
人脸检测是表情识别的第一步,系统使用YOLOv11模型检测图像或视频中的人脸:
# 使用YOLOv11检测人脸
results = face_model(frame, conf=0.8)
# 处理检测结果
for result in results:
boxes = result.boxes
for box in boxes:
# 获取边界框坐标
x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int)
# 扩大边界框(调整人脸框大小)
frame_height, frame_width = frame.shape[:2]
# 计算边界框的扩展量(框的20%)
expand_x = int((x2 - x1) * 0.2)
expand_y = int((y2 - y1) * 0.2)
# 应用扩展,但确保不超出图像边界
x1_expanded = max(0, x1 - expand_x)
y1_expanded = max(0, y1 - expand_y)
x2_expanded = min(frame_width, x2 + expand_x)
y2_expanded = min(frame_height, y2 + expand_y)
# 绘制扩大后的人脸框
cv2.rectangle(frame, (x1_expanded, y1_expanded), (x2_expanded, y2_expanded), (0, 255, 0), 2)
值得注意的是,系统对检测到的人脸区域进行了扩展(约20%),这有助于捕获更完整的面部特征,提高表情识别的准确率。
表情识别采用以下步骤:
# 提取扩大后的人脸区域
face_roi = frame[y1_expanded:y2_expanded, x1_expanded:x2_expanded]
# 将人脸区域转换为灰度图像,与训练数据保持一致
face_roi_gray = cv2.cvtColor(face_roi, cv2.COLOR_BGR2GRAY)
# 将灰度图像转换为3通道,因为YOLO模型需要3通道输入
face_roi_gray_3ch = cv2.cvtColor(face_roi_gray, cv2.COLOR_GRAY2BGR)
# 使用YOLO模型进行表情识别
emotion_results = emotion_model(face_roi_gray_3ch)
# 获取预测结果
probs = emotion_results[0].probs.data.tolist()
class_id = probs.index(max(probs))
confidence = max(probs)
# 获取表情标签
emotion = emotion_labels[class_id]
# 在图像上显示预测结果
text = f"{emotion}: {confidence:.2f}"
为了避免UI卡顿,系统使用多线程处理视频流:
class VideoThread(QThread):
"""视频处理线程,避免UI卡顿"""
change_pixmap_signal = pyqtSignal(np.ndarray)
progress_signal = pyqtSignal(int)
def __init__(self, mode='camera', file_path=None):
super().__init__()
self.mode = mode
self.file_path = file_path
self.running = True
self.face_model = None
self.emotion_model = None
self.conf_threshold = 0.5
这种设计使得UI保持响应,同时后台进行计算密集型的视频处理任务。
表情识别模型的训练采用ultralytics库,配置了一系列高级参数以优化模型性能:
results = model.train(
data="fer2013plus",
epochs=200,
batch=256,
imgsz=224,
workers=6,
# 优化器设置
optimizer="AdamW", # 使用具有自适应动量的现代优化器
lr0=0.001, # 初始学习率
lrf=0.001, # 最终学习率因子
warmup_epochs=5, # 逐渐预热以防止早期不稳定
cos_lr=True, # 余弦退火学习率调度
# 正则化
weight_decay=0.0005, # L2正则化
dropout=0.2, # 添加dropout以提高泛化能力
# 数据增强
augment=True, # 启用内置增强
mixup=0.1, # 应用mixup增强
# 训练管理
patience=20, # 早停耐心值
save_period=10, # 每10个epoch保存一次检查点
)
该系统可应用于多种场景:
系统需要以下环境:
可以使用以下命令安装依赖:
pip install ultralytics opencv-python PyQt5 pillow numpy torch torchvision
启动图形界面:
python UI.py
命令行使用(单张图片表情识别):
python image_emotion_recognition.py 图片路径
命令行使用(人脸检测):
python yolo_face_detection.py --image 图片路径 # 图片模式
python yolo_face_detection.py --video 视频路径 # 视频模式
python yolo_face_detection.py --camera # 摄像头模式
该系统还有很大的改进和扩展空间:
本文介绍的基于YOLOv11的人脸表情识别系统,通过深度学习技术实现了高效准确的人脸检测和表情识别。系统采用模块化设计,提供友好的用户界面,支持多种输入源和多个预训练模型,具有广泛的应用前景。
随着人工智能技术的不断发展,人脸表情识别将在人机交互、情感计算等领域发挥越来越重要的作用。我们期待这个系统能为相关研究和应用提供有价值的参考。
以上就是基于YOLOv11的实时人脸表情识别系统的详细介绍。如果您对该系统有任何疑问或建议,欢迎在评论区留言交流!