OpenCV DNN 实战:PFLD 实现疲劳检测

张开发
2026/4/22 17:42:09 15 分钟阅读

分享文章

OpenCV DNN 实战:PFLD 实现疲劳检测
疲劳驾驶是交通事故的主要诱因之一。如果能在事故发生前及时预警,或许能挽救无数生命。今天,我们将使用 OpenCV 的 DNN 模块加载 PFLD(Practical Facial Landmark Detector)模型,实现一个轻量级、高精度的疲劳检测系统。一、为什么选择 PFLD?在疲劳检测领域,人脸关键点检测的精度和速度至关重要。PFLD 算法的出现解决了几个核心痛点:精度高:在 300W 和 AFLW 等主流数据集上达到当时最先进的精度速度快:在 ARM 安卓设备上可达 140fps,CPU 上比同类算法快 2000 倍模型小:模型文件仅 2.1MB,适合移动端部署鲁棒性强:针对大姿态、极端光照、遮挡等场景进行了优化PFLD 的网络结构由主网络和辅助网络两部分组成:主网络:使用轻量级 MobileNet-V2 Block 替代传统卷积,预测关键点位置辅助网络:训练时预测人脸姿态(yaw、pitch、roll 三个欧拉角),用于修正损失函数,测试时不参与这种设计既保证了精度,又兼顾了推理速度。二、疲劳检测原理基于 PFLD 的疲劳检测主要依赖三个特征参数:2.1 眼部特征——眨眼频率通过眼部关键点计算眼睛纵横比(EAR,Eye Aspect Ratio):textEAR = (||p2-p6|| + ||p3-p5||) / (2 * ||p1-p4||)当 EAR 低于阈值时判定为闭眼,统计单位时间内闭眼次数即可得到眨眼频率。2.2 嘴部特征——打哈欠嘴部纵横比(MAR,Mouth Aspect Ratio)的检测方式类似:textMAR = (||p2-p8|| + ||p3-p7|| + ||p4-p6||) / (3 * ||p1-p5||)当 MAR 超过阈值且持续时间较长时,判定为打哈欠。2.3 头部姿态——点头频率PFLD 的辅助网络可以输出头部欧拉角(yaw、pitch、roll),通过 pitch 角的变化可检测点头动作。2.4 多特征融合单一特征容易误判,学术界普遍采用多特征融合策略。改进的 PERCLOS 算法综合考虑眨眼、哈欠、点头三个维度,可达到 90% 以上的疲劳识别率。三、环境准备3.1 安装依赖bashpip install opencv-python opencv-contrib-python numpy3.2 下载模型PFLD 的 ONNX 模型可以从以下地址获取:官方项目页:https://sites.google.com/view/xjguo/fld或使用转换后的 ONNX 版本(推荐)将模型文件 pfld.onnx 放在项目目录下的 models/ 文件夹中。3.3 定义关键点索引PFLD 通常输出 106 个或 68 个关键点。以下以 68 点模型为例,定义眼部和嘴部的关键点索引:python68点关键点索引定义EYE_INDICES = {

更多文章