用openCV实现基础的人脸检测与情绪识别
一.引言
人脸检测与情绪识别技术在当今现代社会有着举足轻重的地位,这篇文章将会从一个新手小白的角度,一步一步教会如何实现一个简单的人脸检测和情绪识别的技术。
二.使用的软件与环境的搭建
1.vscode
(1)下载网址:
Visual Studio Code - Code Editing. Redefinedhttps://code.visualstudio.com/
(2)安装建议:建议在安装时勾选所有内容:
2.python解释器
(1)下载网址:
Python Releases for Windows | Python.orghttps://www.python.org/downloads/windows/
(2)安装建议(一定要注意):
请务必要点击Add Python 3.9 to PATH!
3.在vscode中安装插件
(1)配置中文:
(2)安装python插件:
4.opencv
(1)openCV的介绍:
OpenCV是一个免费的开源工具,能帮电脑轻松处理图片和视频,比如识别人脸或检测物体。它支持多种编程语言,包括Python、C++和Java,让你能用熟悉的语言快速上手开发。OpenCV的强大之处在于它功能超全且社区庞大,比如有数千种预建算法,让图像处理任务变得简单高效,新手也能快速实现酷炫效果。
(2)openCV的安装:
请按照菜鸟教程的此页来一步一步安装openCV:
OpenCV 安装 | 菜鸟教程 (runoob.com)https://www.runoob.com/opencv/opencv-install.html
三.从零开始完成一个人脸检测和情绪识别技术(无脑版)
1.在桌面建一个文件夹,并且命名:
2.打开vscode,找到刚才新建好的文件夹并且打开:
3.点击终端,弹出如下窗口:
4. 创建虚拟环境,输入以下代码,回车:
python -m venv face_venv
5. 激活虚拟环境,输入以下代码,回车:
.\face_venv\Scripts\activate
在虚拟环境被激活后,会在前面出现绿色的代码:
6.安装必要的库,输入以下代码,回车:
pip install opencv-python mediapipe deepface matplotlib
7.如果有提示信息,升级pip,并尝试重新安装mediapipe,如果没有,请跳过这一步:
输入以下代码,更新pip:
python.exe -m pip install --upgrade pip
输入以下代码,重新安装mediapipe:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mediapipe
8. 安装tensorflow,输入以下代码,回车:
pip install tensorflow
9. 安装tf-keras,输入以下代码,回车:
pip install tf-keras
10. 分别创建以下几个文件:
main.py # 主程序入口
face_detector.py # 人脸检测模块
emotion_detector.py # 情绪识别模块
utils.py # 工具函数
requirements.txt # 依赖库清单
11. 将以下代码分别复制到不同的文件里:
main.py:
import cv2
from face_detector import FaceDetector
from emotion_detector import EmotionDetector# 初始化检测器
face_detector = FaceDetector()
emotion_detector = EmotionDetector()# 打开摄像头并设置较低分辨率(优化性能)
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) # 降低宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 降低高度while True:ret, frame = cap.read()if not ret:break# 人脸检测和关键点检测(每帧都进行)frame, faces = face_detector.detect(frame)# 对每个检测到的人脸进行情绪识别for (x, y, w, h) in faces:face_roi = frame[y:y+h, x:x+w]if len(face_roi) > 0:# 情绪检测emotion, confidence = emotion_detector.detect_emotion(face_roi)# 在原图上显示情绪结果cv2.putText(frame, f"Emotion: {emotion} ({confidence:.2f})",(x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 显示帧率信息(帮助监控性能)fps = cap.get(cv2.CAP_PROP_FPS)cv2.putText(frame, f"FPS: {fps:.1f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)# 显示结果cv2.imshow('Face and Emotion Detection', frame)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()
face_detector.py:
import cv2
import mediapipe as mpclass FaceDetector:def __init__(self, min_detection_confidence=0.5, min_tracking_confidence=0.5):# 人脸检测模型(用于边界框)self.mp_face_detection = mp.solutions.face_detectionself.face_detection = self.mp_face_detection.FaceDetection(min_detection_confidence=min_detection_confidence)# 人脸关键点模型(468点,复用官方示例逻辑)self.mp_face_mesh = mp.solutions.face_meshself.face_mesh = self.mp_face_mesh.FaceMesh(static_image_mode=False,max_num_faces=1,refine_landmarks=True, # 必须开启!优化关键点min_detection_confidence=min_detection_confidence,min_tracking_confidence=min_tracking_confidence)self.mp_drawing = mp.solutions.drawing_utils # 官方绘制工具def detect(self, image):# 转换为RGB(Mediapipe要求)image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)h, w, c = image.shape# 1. 人脸边界框检测(原功能)face_results = self.face_detection.process(image_rgb)faces = []if face_results.detections:for detection in face_results.detections:bbox = detection.location_data.relative_bounding_boxx, y, w_box, h_box = int(bbox.xmin * w), int(bbox.ymin * h), \int(bbox.width * w), int(bbox.height * h)faces.append((x, y, w_box, h_box))# 绘制人脸边界框(绿色)cv2.rectangle(image, (x, y), (x + w_box, y + h_box), (0, 255, 0), 2)# 2. 人脸关键点检测(复用官方示例的绘制逻辑)mesh_results = self.face_mesh.process(image_rgb)if mesh_results.multi_face_landmarks:for face_landmarks in mesh_results.multi_face_landmarks:# 用官方工具绘制关键点(和 test_face_mesh.py 效果一致)self.mp_drawing.draw_landmarks(image=image,landmark_list=face_landmarks,connections=self.mp_face_mesh.FACEMESH_TESSELATION, # 绿色网格landmark_drawing_spec=None,connection_drawing_spec=self.mp_drawing.DrawingSpec(color=(0, 255, 0), # 绿色thickness=1, circle_radius=1))return image, faces
emotion_detector.py :
from deepface import DeepFace
import cv2class EmotionDetector:def __init__(self):# 支持的情绪类别self.emotions = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral']def detect_emotion(self, face_image):try:# 使用DeepFace进行情绪分析result = DeepFace.analyze(face_image, actions=['emotion'], enforce_detection=False)emotion = result[0]['dominant_emotion']emotion_probability = result[0]['emotion'][emotion]return emotion, emotion_probabilityexcept Exception as e:print(f"Error detecting emotion: {e}")return "neutral", 0.5
utils.py:
import cv2def draw_text(image, text, position, font_scale=1, color=(0, 255, 0), thickness=2):# 在图像上绘制文本cv2.putText(image, text, position, cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, thickness, cv2.LINE_AA)return image
requirements.txt:
opencv-python
mediapipe
deepface
matplotlib
12.最后,打开main.py模块,点击运行并稍等片刻,就可以显示实时动态情绪了:
四. 从技术的层面解释上述操作
1.人脸检测技术解析:
人脸检测是整个系统的基础,这里使用了 Mediapipe 库来实现这一功能:
# 人脸检测模型(用于边界框)
self.mp_face_detection = mp.solutions.face_detection
self.face_detection = self.mp_face_detection.FaceDetection(min_detection_confidence=min_detection_confidence
)
技术原理:
Mediapipe 的人脸检测采用了轻量级神经网络模型,它基于单次多框检测器 (SSD) 架构,通过以下步骤工作:
- 首先使用卷积神经网络提取图像特征
- 然后在不同尺度的特征图上检测人脸
- 最后通过边界框回归精确定位人脸位置
除了边界框,还使用了 Mediapipe 的人脸网格模型检测 468 个面部关键点:
# 人脸关键点模型(468点)
self.mp_face_mesh = mp.solutions.face_mesh
self.face_mesh = self.mp_face_mesh.FaceMesh(refine_landmarks=True, # 开启精细化关键点...
)
这些关键点覆盖了眼睛、眉毛、鼻子、嘴巴等面部结构,对于后续的情绪分析非常重要。
2.情绪识别技术解析 :
情绪识别是系统的核心功能,这里使用了 DeepFace 库:
def detect_emotion(self, face_image):result = DeepFace.analyze(face_image, actions=['emotion'], enforce_detection=False)emotion = result[0]['dominant_emotion']return emotion, emotion_probability
DeepFace 是一个强大的人脸识别和分析库,它的情绪识别功能基于以下技术:
- 面部特征提取:使用预训练的卷积神经网络 (CNN) 提取面部图像的特征向量
- 情绪分类:将提取的特征向量输入到分类器中,识别出 7 种基本情绪
- 愤怒 (angry)
- 厌恶 (disgust)
- 恐惧 (fear)
- 快乐 (happy)
- 悲伤 (sad)
- 惊讶 (surprise)
- 中性 (neutral)
DeepFace 的情绪识别模型在多个公开数据集上训练,包括:
- FER2013:包含 28,709 张人脸图像,标注了 7 种基本情绪
- RAF-DB:包含 29,672 张人脸图像,提供了更精细的情绪标注
- AffectNet:包含超过 1,000,000 张人脸图像,是目前最大的面部表情数据集
3. 系统整体工作流程:
-
初始化阶段:
- 创建 FaceDetector 和 EmotionDetector 实例
- 打开摄像头并设置分辨率
-
循环处理阶段:
- 读取摄像头帧
- 使用 Mediapipe 检测人脸边界框和关键点
- 对每个检测到的人脸区域:
- 提取人脸图像
- 使用 DeepFace 分析情绪
- 在原图上标注情绪结果
- 显示处理后的图像和 FPS 信息
-
资源释放:
- 释放摄像头资源
- 关闭所有 OpenCV 窗口
五. 从新手的角度解释基础
1. VSCode - 你的代码编辑器
VSCode 是一个专门用来写代码的软件,就像 Word 文档编辑器一样,但它是用来写程序的。你可以把它想象成一个「超级记事本」:
- 特点:
- 有很多颜色和格式(代码高亮),让不同类型的代码看起来不一样
- 可以安装各种插件(比如 Python 支持、自动补全、错误检查)
- 能直接运行和调试代码
你为什么需要它:
写代码不能用普通记事本,因为普通记事本没有代码的颜色和格式,也不能帮你检查错误。VSCode 让写代码变得又快又容易。
2. Python - 你使用的编程语言
Python 是一种编程语言,就像英语、中文一样,只是它是和计算机交流的语言。
- 特点:
- 语法简单,容易学习(用英文单词和符号,不需要复杂的符号)
- 功能强大,可以做网站、数据分析、人工智能等
- 有很多「库」可以直接用
你为什么需要它:
你写的人脸检测和情绪识别程序就是用 Python 写的。没有 Python,计算机就看不懂你写的代码。
3. OpenCV - 计算机视觉的工具箱
OpenCV 是一个专门用于「计算机视觉」的 Python 库。什么是计算机视觉?就是让计算机「看」和理解图像内容。
- OpenCV 能做什么:
- 读取和显示图片 / 视频(比如你用它打开摄像头)
- 处理图像(比如裁剪、缩放、调整颜色)
- 识别物体(比如人脸、猫、狗等)
- 分析运动(比如跟踪一个人在画面中的移动)
在你的代码里:
import cv2 # 这行代码就是在导入OpenCV库# 下面这行是用OpenCV打开摄像头
cap = cv2.VideoCapture(0)
4. Mediapipe 和 DeepFace - 预训练好的 AI 模型库
Mediapipe 和 DeepFace 都是别人已经训练好的「人工智能模型库」,它们就像现成的工具包,你拿过来就能用。
Mediapipe 是 Google 开发的库,专门用于检测人脸、手部、姿势等。
DeepFace 是专门用于人脸识别和分析的库,它可以:
-
识别情绪(开心、难过、生气等)
-
识别面部特征(眼睛、鼻子、嘴巴的形状)
-
判断两张脸是否是同一个人
5. 虚拟环境 - 代码的「隔离房间」
虚拟环境 是一个独立的、隔离的空间,你可以在里面安装特定版本的 Python 和库。
- 为什么需要虚拟环境:
- 不同的项目可能需要不同版本的库
- 虚拟环境可以避免库之间的冲突
- 方便分享项目,别人可以完全复制你的环境
如何创建虚拟环境(以 Windows 为例):
# 1. 打开命令提示符
# 2. 进入你的项目文件夹
cd C:\path\to\your\project# 3. 创建虚拟环境
python -m venv myenv# 4. 激活虚拟环境
myenv\Scripts\activate # Windows
source myenv/bin/activate # macOS/Linux
6. 安装各种库 - 就像安装手机应用
在 Python 里,安装库非常简单,用一个叫 pip
的工具(类似于手机的应用商店)。
安装你项目需要的库:
# 确保你的虚拟环境已激活# 安装OpenCV
pip install opencv-python# 安装Mediapipe
pip install mediapipe# 安装DeepFace
pip install deepface# 安装Matplotlib(用于绘图,你的代码里可能会用到)
pip install matplotlib
为什么需要这些库:
opencv-python
:处理图像和视频mediapipe
:人脸检测和关键点识别deepface
:情绪识别matplotlib
:数据可视化(比如绘制情绪分析结果)
7. 总结 - 整个流程像搭积木
你的项目就像一个积木塔,每一层都是一个工具或技术:
-
底层工具:
- VSCode:写代码的编辑器
- Python:编程语言
- 虚拟环境:隔离的工作空间
-
中间层库:
- OpenCV:处理图像和视频
- Mediapipe:人脸检测和关键点识别
- DeepFace:情绪识别
-
顶层应用:
- 你的代码:把上面所有工具组合起来,实现人脸情绪识别的功能