机器学习进阶-疲劳检测(眨眼检测) 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支持向量机
支持向量机需要解决的问题:找出一条最好的决策边界将两种类型的点进行分开 这个时候我们需要考虑一个问题,在找到一条直线将两种点分开时,是否具有其他的约束条件,这里我们在满足找到一条决策边界时,同时使得距 ...
随机推荐
- P1507 NASA的食物计划
传送 01背包又进化了,它变成了二维背包. 既然它多了一个维度,那么我们的f[j]也变成了二维数组f[i][j],其中i表示费用1,j表示费用2 核心方程也相应的变成了f[i][j]=max(f[i- ...
- Python——ipython(python programming)
Tab自动补充 Ctrl+c中断程序 ?帮助调出文档 _得到上次的结果 ,__的到上上次结果,___得到上上次结果 %开头的为魔术命令 %timeit 得到运算时间,多次求平均 %%time ...
- 【ZZ】Linux常用指令
linux常用指令 - 个人文章 - SegmentFault 思否 https://segmentfault.com/a/1190000011068772 查看目录下有什么文件信息 ls //lis ...
- Linux 防火墙和SELinux的开启和关闭
防火墙(firewalld) 临时关闭防火墙 systemctl stop firewalld 永久防火墙开机自关闭 systemctl disable firewalld 临时打开防火墙 syste ...
- Making a view in a listview invisible android
问题: I have a ListView that's using a custom adapter. I want to dynamically add/remove items from the ...
- Windows平台下使用CodeBlocks+GCC编译器生成动态dll,C#调用报错
报无法加载dll错误,解决方法: 1) 编译选择设置成x86,即-m322) 必须在c#程序目录下加上libgcc_s_dw2-1.dll
- linux下新建(touch)\复制(cp)\剪切(mv)\删除(rm)文件
touch :新建多个文件,中间用空格隔开 touch file1 file2 cp: mv:剪切 rm:删除文件
- module 'pip' has no attribute 'pep425tags'
AMD64 import pip._internal print(pip._internal.pep425tags.get_supported()) 1 2 WIN32 import pip prin ...
- 评委打分系统最新版,采用Flash展示双屏技术,望大家测试,多提意见.
最新版结合应用了 Flash展示技术,PPT展示技术,移动端云打分技术等. 详细视频见土豆视频:http://www.tudou.com/programs/view/NUN2lUzkPRI 放大查看上 ...
- oracle执行update时卡死问题的解决办法
原因: 由于在PLSQL Developer执行update时没有commit,oracle将该条记录锁住了. 可以通过以下办法解决: 先查询锁定记录 Sql代码 SELECT s.sid, s.se ...