news 2026/5/15 14:08:30

用Python的face_recognition库,5分钟搞定人脸关键点提取与疲劳检测(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python的face_recognition库,5分钟搞定人脸关键点提取与疲劳检测(附完整代码)

用Python的face_recognition库快速实现人脸关键点提取与疲劳检测

人脸识别技术正在从实验室走向日常生活,而face_recognition库让开发者能够轻松调用这项能力。今天我们就来探索如何用不到50行代码,构建一个实时疲劳检测系统。这个方案特别适合需要长时间盯着屏幕的程序员、司机等职业人群。

1. 环境准备与库安装

首先需要配置Python环境。推荐使用Python 3.7及以上版本,这个版本的兼容性最好。face_recognition库底层依赖dlib,而dlib的安装有时会遇到麻烦。以下是经过验证的安装方案:

pip install cmake # 必须先安装cmake pip install dlib==19.22.0 # 指定这个稳定版本 pip install face_recognition opencv-python

注意:如果在Windows上安装dlib失败,可以尝试先安装Visual Studio Build Tools中的C++开发组件

验证安装是否成功:

import face_recognition print(face_recognition.__version__) # 应该输出类似1.3.0的版本号

常见问题排查:

  • 报错关于numpy版本:尝试pip install numpy==1.21.0
  • 报错关于CMake:确保安装了最新版CMake并添加到系统PATH
  • Mac用户可能需要先运行xcode-select --install

2. 人脸关键点提取实战

face_recognition库内置了68点人脸特征检测模型,我们先用静态图片演示:

import face_recognition import cv2 image = face_recognition.load_image_file("person.jpg") face_landmarks = face_recognition.face_landmarks(image) # 可视化关键点 image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) for landmark in face_landmarks: for feature, points in landmark.items(): for point in points: cv2.circle(image, point, 2, (0,255,0), -1) cv2.imshow("Landmarks", image) cv2.waitKey(0)

关键点分布对应的人脸部位:

点范围对应部位应用场景
0-16下巴轮廓人脸对齐、姿态估计
17-21右眉毛表情识别
22-26左眉毛表情识别
27-35鼻梁和鼻尖3D建模、活体检测
36-41右眼疲劳检测、视线追踪
42-47左眼疲劳检测、视线追踪
48-67嘴唇轮廓唇语识别、表情分析

3. 疲劳检测算法实现

基于眼睛纵横比(Eye Aspect Ratio, EAR)的算法是疲劳检测的经典方法。原理很简单:当人疲劳时眨眼频率会变化,眼睛闭合时间变长。

计算EAR的公式:

def eye_aspect_ratio(eye_points): # 计算两组垂直距离 A = np.linalg.norm(eye_points[1] - eye_points[5]) B = np.linalg.norm(eye_points[2] - eye_points[4]) # 计算水平距离 C = np.linalg.norm(eye_points[0] - eye_points[3]) return (A + B) / (2.0 * C)

完整疲劳检测流程:

  1. 获取视频流(摄像头或视频文件)
  2. 逐帧检测人脸和关键点
  3. 计算双眼EAR值
  4. 设定阈值判断眼睛闭合
  5. 统计连续闭合帧数判断疲劳

实现代码核心部分:

# 初始化参数 EAR_THRESHOLD = 0.25 # 需根据实际调整 CONSEC_FRAMES = 15 # 连续多少帧低于阈值算疲劳 frame_counter = 0 alarm_on = False while True: _, frame = video_capture.read() rgb_frame = frame[:, :, ::-1] # BGR转RGB face_landmarks = face_recognition.face_landmarks(rgb_frame) for landmarks in face_landmarks: left_eye = landmarks["left_eye"] right_eye = landmarks["right_eye"] left_ear = eye_aspect_ratio(left_eye) right_ear = eye_aspect_ratio(right_eye) ear = (left_ear + right_ear) / 2.0 if ear < EAR_THRESHOLD: frame_counter += 1 if frame_counter >= CONSEC_FRAMES: if not alarm_on: print("疲劳警告!") alarm_on = True else: frame_counter = 0 alarm_on = False

4. 性能优化与实用技巧

在实际部署时,我们需要考虑性能和用户体验。以下是几个关键优化点:

多尺度检测优化

# 调整检测参数提高速度 face_locations = face_recognition.face_locations( rgb_frame, number_of_times_to_upsample=0, model="cnn")

参数调优经验值

场景EAR阈值连续帧数检测间隔
驾驶员监测0.2220每帧检测
电脑前疲劳提醒0.2515隔帧检测
移动端应用0.2810降分辨率

实用增强功能

  • 添加声音报警:使用winsound(Windows)或pygame.mixer
  • 保存疲劳片段:检测到疲劳时自动保存前后10秒视频
  • 多线程处理:将视频采集和检测分离到不同线程
# 简单的多线程实现 import threading def detection_thread(): while True: # 检测逻辑 pass capture_thread = threading.Thread(target=detection_thread) capture_thread.daemon = True capture_thread.start()

5. 扩展应用与进阶方向

这个基础框架可以扩展出许多实用功能:

眨眼计数实现

blink_counter = 0 eye_closed = False if ear < EAR_THRESHOLD and not eye_closed: blink_counter += 1 eye_closed = True elif ear >= EAR_THRESHOLD: eye_closed = False

头部姿态估计

利用solvePnP算法和3D模型点,可以估计头部旋转角度:

# 3D模型参考点 model_points = np.array([ (0.0, 0.0, 0.0), # 鼻尖 (0.0, -330.0, -65.0), # 下巴 # 其他关键点... ], dtype=np.float64) # 2D图像点 image_points = np.array([ landmarks["nose_tip"][0], landmarks["chin"][8], # 其他对应点... ], dtype=np.float64) # 计算旋转向量和平移向量 _, rotation_vec, translation_vec = cv2.solvePnP( model_points, image_points, camera_matrix, dist_coeffs)

结合其他生理指标

  • 打哈欠检测:通过嘴巴纵横比(MAR)
  • 头部倾斜检测:利用眉毛和下巴关键点
  • 心率估计:通过面部微小颜色变化

在实际项目中,我发现将EAR值与头部姿态结合能显著提高检测准确率。当系统检测到头部持续前倾(可能是打瞌睡)同时伴随EAR值降低时,触发警报的可靠性更高。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 14:08:03

BGA四角填充加固胶:提升通讯计算卡可靠性的关键技术解析

1. 项目概述&#xff1a;从“虚焊”到“可靠”的最后一公里在电子制造领域&#xff0c;尤其是通讯设备这类高可靠性要求的行业&#xff0c;一块小小的计算卡&#xff0c;其稳定运行背后是无数个精密焊点的默默支撑。我从业十几年&#xff0c;处理过太多因焊点失效导致的现场故障…

作者头像 李华
网站建设 2026/5/15 14:02:25

书匠策AI官网www.shujiangce.com|论文写作“裸奔时代“结束了!

哈喽各位还在跟论文死磕的朋友们&#xff0c;我是你们的论文科普搭子。 今天咱们换个玩法——不讲理论&#xff0c;不说大道理&#xff0c;我就拿书匠策AI&#xff08; 官网直达&#xff1a;www.shujiangce.com&#xff09; 的期刊论文功能当一台"时光机"&#xff0…

作者头像 李华
网站建设 2026/5/15 13:59:49

【独家首发】Gemini 2.0 Python SDK深度测评:对比OpenAI/Claude在代码理解准确率、上下文保持力、错误定位精度三大维度的硬核数据报告

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini 2.0 Python SDK的核心架构与演进脉络 Gemini 2.0 Python SDK 是 Google 推出的全新一代多模态大模型客户端库&#xff0c;其架构设计以“模块解耦、协议抽象、运行时可插拔”为三大支柱&#xf…

作者头像 李华
网站建设 2026/5/15 13:56:06

Rust重构PDF解析器pdf_oxide:安全、高性能的底层引擎实践

1. 项目概述&#xff1a;一个用Rust重写的PDF解析器最近在折腾一个需要深度处理PDF文档的内部项目&#xff0c;遇到了一个老生常谈的痛点&#xff1a;现有的PDF解析库要么性能堪忧&#xff0c;要么内存占用巨大&#xff0c;要么就是绑定在某个特定的语言生态里&#xff0c;跨平…

作者头像 李华