机器学习进阶-疲劳检测(眨眼检测) 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支持向量机
支持向量机需要解决的问题:找出一条最好的决策边界将两种类型的点进行分开 这个时候我们需要考虑一个问题,在找到一条直线将两种点分开时,是否具有其他的约束条件,这里我们在满足找到一条决策边界时,同时使得距 ...
随机推荐
- [转][C#]TopSelf
新建一个批处理,用于启动 TopSelf 服务 @echo off Service.exe install net start Service 或者简化成 @echo off Service.exe ...
- Ubuntu 搭建 Zerotier One MOON 根目录服务器
原文转摘:http://www.congan.wang/archives/947 博主倒腾了一天,总算搞定了,主要是受到各种搭建教程的错误引导,导致关键过程错误.官网的MOON搭建教程:https:/ ...
- [UE4]制作视野图标
一.在PhotoShop中新建一个64px*64px,背景色为透明的文档 二.填充“图层1”为白色 三.添加蒙版图层,并将前景色设置为黑色 四.将“图层1”选择45°,并往上拖放至如图位置 五.选择渐 ...
- [UE4]Cast to OverlaySlot、Set Vertical Alignment、Get Slot,解决Child Widget垂直居中对齐问题
- SP8093 JZPGYZ - Sevenk Love Oimaster(SAM)
/* 打模板题啊 每个串影响到的集合直接枚举跳parent处理即可 */ #include<cstdio> #include<algorithm> #include<cs ...
- PowerDesigner 概念数据模型(CDM) 说明
ref: https://blog.csdn.net/tianlesoftware/article/details/6871179 关于PowerDesigner的说明参考: PowerDes ...
- 在mvc中动态加载菜单
最近做了一个项目, 要在客户端动态的显示菜单,也就是这些菜单是保存在数据库中的, 在客户端动态加载菜单,这样做的好处很明显,就是菜单很容易修改,直接在后台进行维护,再也不会直接在前面的 视图页面中进行 ...
- [Unity算法]弧度和角度
参考链接: https://zhidao.baidu.com/question/576596182.html 1.弧度和角度的转换 2.sin函数 3.cos函数 4.tan函数 5.特殊的三角函数值 ...
- ASP.NET WebApi 图片上传
以下是代码的实现过程: Html页面表单布局: <form id="UpPicture" enctype="multipart/form-data" ac ...
- python ftp文件夹文件递归上传推送