机器学习进阶-疲劳检测(眨眼检测) 1.dist.eculidean(计算两个点的欧式距离) 2.dlib.get_frontal_face_detector(脸部位置检测器) 3.dlib.shape_predictor(脸部特征位置检测器) 4.Orderdict(构造有序的字典)
1.dist.eculidean(A, B) # 求出A和B点的欧式距离
参数说明:A,B表示位置信息
2.dlib.get_frontal_face_detector()表示脸部位置检测器
3.dlib.shape_predictor(args['shape_predictor]) 表示脸部特征位置检测器
参数说明:args['shape_predictor'] 表示位置信息
4.Orderdict([('mouth', (23, 30))]) # 构造有序的字典
参数说明:'mouth'表示字典的键,(23, 30) 表示字典的值
使用人脸检测可以获得人脸框的位置信息,再使用人脸框的关键点检测,检测出各个人脸部分的位置
眨眼检测:主要是通过检测脸部6个点,即 A = dist.euclidean(eye[2], eye[4]), 即眼部的2号点与4号点的欧式距离
B = dist.euclidean(eye[1], eye[5]) C = dist.euclidean(eye[0], eye[3]) # 即1号点与5号点的位置, 0号点与3号点的欧式距离
EAR = (A + B) / 2 * C, 分别计算左眼和右眼的评分求平均作为最终的评分,如果小于阈值,则加1,如果连续3次都小于阈值,则表示进行了一次眨眼活动
代码:
第一步:使用OrderedDict() 构建有序的脸部位置序号字典
第二步:使用argparse构造出可以传入的参数
第三步:使用dlib.get_frontal_face_detector()获得脸部位置检测器
第四步:使用dlib.shape_predictor构造脸部特征检测器
第五步:进入循环,读取图片,对图片维度进行扩大,方便进行脸部特征检测,同时进行灰度化,为了脸部特征检测做准备
第六步:使用detector(gray, 0) 进行脸部位置检测
第七步:循环脸部位置,使用predictor(gray, rect)获得脸部特征的位置信息
第八步:将脸部特征的位置信息转换为数组的形式
第九步:根据字典的序号,获得左眼和右眼的位置array
第十步:使用cv2.convexHull构造左右眼的凸包,并使用cv2.drawContours完成画图操作
第十一步:构造函数计算左右眼的EAR值,使用平均值作为最终的EAR
第十二步:循环,满足条件的,眨眼次数+1
第十三步:进行画图操作,同时使用cv2.putText将眨眼次数进行显示
import cv2
import numpy as np
import argparse
import time
import dlib
from scipy.spatial import distance as dist
from collections import OrderedDict def shape_to_array(shape, dtype='int'):
coords = np.zeros((shape.num_parts, 2), dtype=dtype)
for i in range(shape.num_parts):
coords[i] = (shape.part(i).x, shape.part(i).y) return coords def accu_angle_eye(eye):
A = dist.euclidean(eye[1], eye[5])
B = dist.euclidean(eye[2], eye[4])
# 计算距离,水平的
C = dist.euclidean(eye[0], eye[3])
aspect_ratio = (A + B) / (2.0 *C) return aspect_ratio # 第一步:使用OrderedDict构造脸部特征序号的有序字典
FACE_LANDMAKE_64_IDEX = OrderedDict([
("mouth", (48, 68)),
("right_eyebrow", (17, 22)),
("left_eyebrow", (22, 27)),
("right_eye", (36, 42)),
("left_eye", (42, 48)),
("nose", (27, 36)),
("jaw", (0, 17))
])
# EAR的阈值
BlINK_THRESH = 0.3
# 眨眼帧数的阈值
BLINK_TRUE = 3
# 低于阈值的次数
count_blink = 0
# 眨眼次数
Total = 0
# 第二步:使用argparse构造变量参数
ap = argparse.ArgumentParser()
ap.add_argument('-p', '--shape-predictor', default='shape_predictor_68_face_landmarks.dat',
help='the weight to predictor')
ap.add_argument('-v', '--video', default='test.mp4',
help='the video to read')
args = vars(ap.parse_args()) # 第三步:使用dlib.get_frontal_face_detector() 获得脸部位置检测器
detector = dlib.get_frontal_face_detector()
# 第四步:使用dlib.shape_predictor获得脸部特征检测器
predictor = dlib.shape_predictor(args['shape_predictor']) vs = cv2.VideoCapture(args['video'])
time.sleep(1) (lstart, lend) = FACE_LANDMAKE_64_IDEX['left_eye']
(rstart, rend) = FACE_LANDMAKE_64_IDEX['right_eye'] while True:
# 第五步:进行循环,读取图片,并对图片做维度扩大,并进灰度化
frame = vs.read()[1]
(h, w) = frame.shape[:2]
width = 1200
r = width / float(w)
dim = (width, int(r*h))
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 第六步:使用detector(gray, 0)获得脸部位置信息
rects = detector(gray, 0)
# 第七步:循环脸部位置信息,使用predictor(gray, rect)获得脸部特征位置的信息
for rect in rects:
shape = predictor(gray, rect)
# 第八步:将脸部特征信息转换为数组array的格式
shape = shape_to_array(shape)
# 第九步:根据字典,获得左眼和右眼的位置信息
leftEye = shape[lstart:lend]
rightEye = shape[rstart:rend] # 第十步:使用cv2.convexHull获得凸包位置,使用drawContours画出轮廓位置进行画图操作
leftContours = cv2.convexHull(leftEye)
rightContours = cv2.convexHull(rightEye)
cv2.drawContours(frame, [leftContours], -1, (0, 255, 0), 1)
cv2.drawContours(frame, [rightContours], -1, (0, 255, 0), 1)
# 第十一步:计算左右眼的EAR值,获得其平均值
leftScore = accu_angle_eye(leftEye)
rightScore = accu_angle_eye(rightEye)
meanScore = (leftScore + rightScore) / 2.0
#第十二步:循环,满足条件,眨眼次数+1
if meanScore < BlINK_THRESH:
count_blink += 1
else:
if count_blink >= BLINK_TRUE:
Total += 1 count_blink = 0
# 第十三步:进行画图,使用cv2.putText展示眨眼次数
cv2.putText(frame, 'Blinks: {}'.format(Total), (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 1)
cv2.putText(frame, 'EAR {:.2f}'.format(meanScore), (300, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 1)
cv2.imshow('frame', frame)
if cv2.waitKey(10) & 0xff == 27:
break vs.release()
cv2.destroyAllWindows()

效果图
机器学习进阶-疲劳检测(眨眼检测) 1.dist.eculidean(计算两个点的欧式距离) 2.dlib.get_frontal_face_detector(脸部位置检测器) 3.dlib.shape_predictor(脸部特征位置检测器) 4.Orderdict(构造有序的字典)的更多相关文章
- 机器学习进阶-人脸关键点检测 1.dlib.get_frontal_face_detector(构建人脸框位置检测器) 2.dlib.shape_predictor(绘制人脸关键点检测器) 3.cv2.convexHull(获得凸包位置信息)
1.dlib.get_frontal_face_detector() # 获得人脸框位置的检测器, detector(gray, 1) gray表示灰度图, 2.dlib.shape_predict ...
- 基于mindwave脑电波进行疲劳检测算法的设计(2)
上文讲到的是保证硬件的接通.接下来是用C语言在它提供的API接口进行连接. 在网盘中下载MindSet Development Tools这个开发包.这个目录下MindSet Development ...
- 基于mindwave脑电波进行疲劳检测算法的设计(1)
一.简介 脑波,又称之为脑电波,是人大脑发出的电波,非常的微弱,只能通过设备来检测.人的脑波在不同状态下,会不同,因此可以通过脑波来量化分析人的精神状态. 科学家讲脑电波分为四种,以下为详细解释 (1 ...
- 基于mindwave脑电波进行疲劳检测算法的设计(5)
时隔两个多月了,前段时间在弄Socket,就没有弄这个了.现在好了,花了几天的时间,终于又完成了一小部分了.这一小节主要讲α,β,δ,θ等等波段之间的关系.废话不多说,直接给出这几天的成果. 上一次, ...
- dlib库检测人脸使用方法与简单的疲劳检测应用
简介: dlib库是一个很经典的用于图像处理的开源库,shape_predictor_68_face_landmarks.dat是一个用于人脸68个关键点检测的dat模型库,使用这个模型库可以很方便地 ...
- 机器学习&恶意代码检测简介
Malware detection 目录 可执行文件简介 检测方法概述 资源及参考文献 可执行文件简介 ELF(Executable Linkable Format) linux下的可执行文件格式,按 ...
- 【机器学习】异常检测算法(I)
在给定的数据集,我们假设数据是正常的 ,现在需要知道新给的数据Xtest中不属于该组数据的几率p(X). 异常检测主要用来识别欺骗,例如通过之前的数据来识别新一次的数据是否存在异常,比如根据一个用户以 ...
- 机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)
7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的 ...
- 机器学习进阶-svm支持向量机
支持向量机需要解决的问题:找出一条最好的决策边界将两种类型的点进行分开 这个时候我们需要考虑一个问题,在找到一条直线将两种点分开时,是否具有其他的约束条件,这里我们在满足找到一条决策边界时,同时使得距 ...
随机推荐
- sql server 2008 R2 备份还原到sql 2012
从sql server 2008 r2备份的在sql server 2012中还原时一直读不到备份文件,然后把2008r2备份文件放到sql 2012的安装路径对应的Backup文件夹后可以读到了,不 ...
- 服务容错保护断路器Hystrix之八:Hystrix资源隔离策略
在一个基于微服务的应用程序中,您通常需要调用多个微服务完成一个特定任务.不使用舱壁模式,这些调用默认是使用相同的线程来执行调用的,这些线程Java容器为处理所有请求预留的.在高服务器请求的情况下,一个 ...
- etcd 命令行(转)
原文 https://www.cnblogs.com/breg/p/5756558.html 比较重要的配置 -name 节点名称,默认是UUID-data-dir 保存日志和快照的目录,默认为当前工 ...
- [UE4]删除UI:Remove from Parent
同时要将保存UI的变量清空,以释放占用的系统内存
- [UE4]认识Decorator
Decorator装饰器:即为其他行为树系统中的条件语句,附着于一个Composite(组合节点)或者Task(任务节点),并定义树中的一个分支或者单个节点是否可被执行. Decorator装饰器节点 ...
- linux达人养成计划
一.命令基本格式: ls -1 详细列表 (ll) -h 人性化显示文件大小 -a 显示所有文件,包括隐藏文件 -d 查看目录属性 -i 显示iNode 二.文件处理命令 mkdir -p [目录名] ...
- Python利用脚本2.x到3自动转换
本文介绍一下在windows 10 环境下如何使用这个工具: 1)首先要先安装好python3,可到官网下载https://www.python.org/ 2)使用Windows 命令提示符(cmd) ...
- 网页的缓存Cache与控制
什么是缓存 Cache? 缓存位于客户端与服务器之间, 或者服务器与服务器之间.它决定是否保存所获资源的副本,以及如何使用副本,何时更新副本,这里所说的资源包括页面的HTML, 图片,文件等等. 使用 ...
- Unable to find the wrapper ”https” - did youforget to enable it when you configured PHP?
Unable to find the wrapper ”https” - did youforget to enable it when you configured PHP? 这是在Windows的 ...
- 《Linux性能及调优指南》1.3 Linux文件系统
翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...