宁夏做网站建设公司,山东手机app开发公司,电商运营培训机构哪家好,徐州英才网基于人脸关键点的多表情实时检测系统
在计算机视觉领域#xff0c;人脸表情识别技术已经取得了显著的进展。它不仅可以用于娱乐应用#xff08;如动态表情包生成#xff09;#xff0c;还能在心理健康监测、智能安防、人机交互等领域发挥重要作用。今天#xff0c;我将分…基于人脸关键点的多表情实时检测系统
在计算机视觉领域人脸表情识别技术已经取得了显著的进展。它不仅可以用于娱乐应用如动态表情包生成还能在心理健康监测、智能安防、人机交互等领域发挥重要作用。今天我将分享一个基于人脸关键点的多表情实时检测系统该系统能够通过摄像头实时识别微笑、大笑、哭泣和愤怒等多种表情。
1. 项目背景与动机
人脸表情是人类情感的重要外在表现形式。通过分析人脸的表情我们可以更好地理解他人的情绪状态。传统的表情识别方法主要依赖于深度学习模型这些模型虽然精度高但计算复杂度较高难以在资源受限的设备上实现实时检测。相比之下基于人脸关键点的方法更加轻量级通过分析关键点的位置关系来推断表情状态适合在实时系统中应用。
本项目的目标是开发一个实时系统能够通过摄像头捕捉人脸图像并根据人脸关键点的位置关系判断当前的表情状态。我们将重点实现微笑、大笑、哭泣和愤怒这四种常见表情的检测。
2. 技术栈与工具
为了实现这个项目我们使用了以下技术和工具
Python作为主要的开发语言Python 提供了丰富的库支持便于快速开发和调试。OpenCV用于图像处理和视频流操作能够高效地读取摄像头数据并进行图像绘制。dlib提供了强大的人脸检测和关键点定位功能是实现人脸关键点提取的核心工具。scikit-learn用于计算欧几里得距离帮助我们分析关键点之间的空间关系。Pillow用于在图像上绘制中文文本方便在实时视频中显示识别结果。
3. 关键技术实现
3.1 人脸检测与关键点提取
人脸检测是表情识别的第一步。我们使用 dlib 提供的 get_frontal_face_detector 方法来检测图像中的人脸区域。一旦检测到人脸我们再利用 shape_predictor 模型提取人脸的 68 个关键点。这些关键点包括眼睛、眉毛、鼻子、嘴巴等部位的特征点为后续的表情分析提供了基础数据。
detector dlib.get_frontal_face_detector() # 构造脸部位置检测器
predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) # 读取人脸关键点定位模型
faces detector(frame, 0) # 获取人脸
for face in faces: # 循环遍历每一个人脸shape predictor(frame, face) # 获取关键点shape np.array([[p.x, p.y] for p in shape.parts()]) # 将关键点转换为坐标(x,y)的形式3.2 表情特征计算
为了判断不同表情我们定义了多个特征指标包括嘴宽比MWR、嘴高比MHR和眼睛宽高比EAR等。
嘴高比MHR计算嘴巴的平均高度与嘴巴宽度的比值。嘴巴的高度通过关键点 50、51、52 与 58、57、56 的距离计算嘴巴宽度通过关键点 48 和 54 的距离计算。当 MHR 超过一定阈值时可能表示大笑。嘴宽比MWR计算嘴巴宽度与下颌宽度的比值。嘴巴宽度通过关键点 48 和 54 的距离计算下颌宽度通过关键点 3 和 13 的距离计算。当 MWR 超过一定阈值时可能表示微笑。眼睛宽高比EAR计算眼睛的宽高比用于检测眼睛闭合程度。当 EAR 小于一定阈值时可能表示眼睛闭合进而推断出哭泣等表情。
def MAR(shape):A euclidean_distances(shape[50].reshape(1, 2), shape[58].reshape(1, 2))B euclidean_distances(shape[51].reshape(1, 2), shape[57].reshape(1, 2))C euclidean_distances(shape[52].reshape(1, 2), shape[56].reshape(1, 2))D euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))return ((A B C) / 3) / Ddef MJR(shape):M euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2)) # 嘴宽度J euclidean_distances(shape[3].reshape(1, 2), shape[13].reshape(1, 2)) # 下颌宽度return M / Jdef EAR(shape):A euclidean_distances(shape[37].reshape(1, 2), shape[41].reshape(1, 2))B euclidean_distances(shape[38].reshape(1, 2), shape[40].reshape(1, 2))C euclidean_distances(shape[36].reshape(1, 2), shape[39].reshape(1, 2))return (A B) / (2.0 * C)3.3 实时视频流处理
我们通过 OpenCV 的 VideoCapture 方法获取摄像头的实时视频流并在每一帧图像上进行人脸检测和表情识别。识别结果会以中文文本的形式显示在视频窗口中同时绘制嘴巴的凸包轮廓以便直观地观察嘴巴的形状变化。
cap cv2.VideoCapture(0)
while True:ret, frame cap.read()if not ret:breakgray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces detector(gray, 0)for face in faces:shape predictor(gray, face)shape np.array([[p.x, p.y] for p in shape.parts()])mar MAR(shape)mjr MJR(shape)ear EAR(shape)result 正常if mar 0.5:result 大笑elif mjr 0.45:result 微笑elif ear 0.2: # 眼睛闭合可能是在哭result 哭elif euclidean_distances(shape[19].reshape(1, 2), shape[24].reshape(1, 2)) 20: # 眉毛距离变小可能是在愤怒result 愤怒print(MAR:, mar, \tMJR:, mjr, \tEAR:, ear, \t表情:, result)mouthHull cv2.convexHull(shape[48:61])frame cv2AddChineseText(frame, result, (mouthHull[0, 0][0], mouthHull[0, 0][1] - 20))cv2.drawContours(frame, [mouthHull], -1, (0, 255, 0), 1)cv2.imshow(Frame, frame)if cv2.waitKey(1) 27: # 按ESC退出breakcv2.destroyAllWindows()
cap.release()5. 总结
通过本项目我们成功实现了一个基于人脸关键点的多表情实时检测系统。这个项目不仅展示了人脸关键点在表情识别中的应用还为后续的扩展和优化提供了基础。希望这个项目能够为对人脸表情识别感兴趣的朋友提供一些参考和启发。