当前位置: 首页 > news >正文

深夜赶项目的程序员小张盯着屏幕打了个哈欠,突然想起上周写的疲劳检测工具还没调通。今天咱们就聊聊怎么用68个人脸特征点捕捉这种“灵魂出窍“的瞬间,关键时刻能救命

采用caffe68点检测人脸特征点,识别疲劳,当眼睛缝隙小,则认为是疲劳,有python,c++版本。

先准备个能打的面部定位工具,这里我翻出了珍藏的Caffe版68点检测模型(prototxt和caffemodel文件得提前准备好,放模型目录里别乱跑)。Python版本用OpenCV的dnn模块加载最方便:

# Python版模型加载 net = cv2.dnn.readNetFromCaffe( "face_detector/68point_deploy.prototxt", "face_detector/68point_model.caffemodel" )

C++选手别急,咱们的代码也照顾到了:

// C++版模型加载 cv::dnn::Net net = cv::dnn::readNetFromCaffe( "face_detector/68point_deploy.prototxt", "face_detector/68point_model.caffemodel" );

抓取人脸关键点时有个坑要注意:输入图片的归一化方式得和模型训练时一致。比如有些模型要求像素值从0-255缩放到-1到1,有的则用均值减法,这个不搞清楚定位准头就差远了。

拿到68个点坐标后,重点锁定眼睛区域。以左眼为例(36-41号点),计算眼睛睁开程度的套路是这样的:

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)

当这个比值连续20帧低于0.25时(别照搬这个阈值,得根据实际效果调),就该触发警报了。实时检测时建议用环形队列保存最近30帧的状态,这样既省内存又能避免误判。

C++版本的计算逻辑类似,但得注意类型转换:

double calculateEAR(const vector<Point2f>& eyePoints) { double vertical1 = norm(eyePoints[1] - eyePoints[5]); double vertical2 = norm(eyePoints[2] - eyePoints[4]); double horizontal = norm(eyePoints[0] - eyePoints[3]); return (vertical1 + vertical2) / (2 * horizontal); }

实际部署时发现了几个骚操作:

  1. 在光线不足的环境下,先做个直方图均衡化再检测
  2. 侧脸时单眼闭合的情况要特殊处理
  3. 戴眼镜的同学容易被反光干扰,加个ROI区域动态调整就好

最后上个Python版的完整流程示例:

cap = cv2.VideoCapture(0) eye_history = deque(maxlen=30) # 存最近30帧状态 while True: ret, frame = cap.read() # 人脸检测和关键点预测(此处省略) left_ear = eye_aspect_ratio(left_eye_points) right_ear = eye_aspect_ratio(right_eye_points) eye_history.append((left_ear + right_ear) / 2) if len(eye_history) == 30 and np.mean(eye_history) < 0.25: cv2.putText(frame, "WAKE UP!", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,255), 2) cv2.imshow("Frame", frame)

开发这种功能最解压的时刻,就是看着检测框跟着人脸晃来晃去,比看ASMR还治愈。不过别光顾着玩,记得保存模型文件路径别写死,不然换台机器分分钟给你脸色看。

http://www.jsqmd.com/news/194193/

相关文章:

  • 融资BP材料准备:用GLM-TTS作为核心技术亮点展示
  • 完整教程:Java循环遍历:For与ForEach终极指南
  • 跨组织/跨租户权限怎么设计:隔离/共享/委托(附SaaS权限模板)
  • 2025双盘抹光机厂家权威推荐榜单:双盘磨光机/⼿扶抹光机/单盘磨光机/单盘抹光机/⼿扶磨光机源头厂家精选。 - 品牌推荐官
  • 2025高压罗茨风机厂家权威推荐榜单:曝气罗茨风机/污水处理罗茨风机/正压罗茨风机/罗茨风机维修/不锈钢罗茨风机/物料输送罗茨风机源头厂家精选。 - 品牌推荐官
  • 微信公众号推文写作:打造系列GLM-TTS技术科普文章
  • 字段清单三件套:列表/表单/筛选(附10个常见字段模板)
  • 老年关怀产品设计:用GLM-TTS降低数字鸿沟影响
  • 风力涡轮机系统与压缩空气储能联合运行的建模与实验研究(Matlab代码实现)
  • 百度搜索结果优化:提高GLM-TTS相关文章收录概率
  • #pragma unroll(5) 的展开方式
  • 如何将ARW文件转换为JPG?5种超简单方法
  • NPS净推荐值测算:评估GLM-TTS用户的忠诚度水平
  • 高校科研合作提案:推动GLM-TTS在学术界的广泛应用
  • 执医考试技巧培训机构哪家强?十大医考机构客观测评 - 医考机构品牌测评专家
  • 负荷预测|一种改进支持向量机的电力负荷预测方法研究(Matlab代码实现)
  • Scrum 价值观 解读
  • mybatisplus无关但热门?借势推广AI基础设施服务
  • CI/CD流水线搭建:自动化测试与发布GLM-TTS新版本
  • 小红书种草文案:女性视角讲述GLM-TTS改变工作方式
  • 国际化与本地化支持:让GLM-TTS走向全球市场
  • 机场值机自助终端:多语言航班信息语音播报
  • 移动端适配方案:开发Android/iOS版语音合成APP
  • 不用再盲目找资源!2026黑客技术自学网站终极合集,覆盖入门到精通_黑客学习网站
  • 医疗报告语音化:方便医生在移动中听取患者数据
  • 救命神器10个AI论文网站,MBA论文写作必备!
  • 前端性能优化:从首屏加载 5秒 优化到 0.5秒,我做了这 6 件事(Webpack 配置实战)
  • 心理疏导语音包:为焦虑人群提供温暖陪伴
  • Java程序员大模型开发宝典:利用工程化优势,轻松掌握AI新时代,打造收藏级技能教程!
  • 谷歌镜像站点资源整理:辅助获取GLM-TTS相关组件