许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  人脸活体检测(眨眼+张口)人脸识别技术

人脸活体检测(眨眼+张口)人脸识别技术

阅读数 2
点赞 0
article_banner

一:dlib的shape_predictor_68_face_landmarks模型

该模型能够检测人脸的68个特征点(facial landmarks),定 位图 像中的眼睛,眉毛,鼻子,嘴巴,下颌线(ROI,Region of Interest)


下颌线[1,17]左眼眉毛[18,22]右眼眉毛[23,27]鼻梁[28,31]鼻子[32,36]左眼[37,42]右眼[43,48]       上嘴唇外边缘[49,55]  上嘴唇内边缘[66,68]   下嘴唇外边缘[56,60]  下嘴唇内边缘[61,65] 

在使用的过程中对应的下标要减1,像数组的下标是从0开始。

二、 眨眼检测

基本 原理 :计算眼睛长宽比 Eye Aspect Ratio,EAR.当人眼睁开时,EAR在某个值上下波动,当人眼闭合时,EAR迅速下降,理论上会接近于零,当时 人脸检测 模型还没有这么精确。所以我们认为当EAR低于某个阈值时,眼睛处于闭合状态。为检测眨眼次数,需要设置同一次眨眼的连续帧数。眨眼速度比较快,一般1~3帧就完成了眨眼动作。两个阈值都要根据实际情况设置。

程序实现

from imutils import face_utilsimport numpy as npimport dlibimport cv2 # 眼长宽比例def eye_aspect_ratio(eye):    # (|e1-e5|+|e2-e4|) / (2|e0-e3|)    A = np.linalg.norm(eye[1] - eye[5])    B = np.linalg.norm(eye[2] - eye[4])    C = np.linalg.norm(eye[0] - eye[3])    ear = (A + B) / (2.0 * C)    return ear # 进行活体检测(包含眨眼和张嘴)def liveness_detection():    vs = cv2.VideoCapture(0)  # 调用第一个摄像头的信息     # 眼长宽比例值    EAR_THRESH = 0.15    EAR_CONSEC_FRAMES_MIN = 1    EAR_CONSEC_FRAMES_MAX = 3  # 当EAR小于阈值时,接连多少帧一定发生眨眼动作     # 初始化眨眼的连续帧数    blink_counter = 0    # 初始化眨眼次数总数    blink_total = 0     print("[INFO] loading facial landmark predictor...")    # 人脸检测器    detector = dlib.get_frontal_face_detector()    # 特征点检测器    predictor = dlib.shape_predictor("model/shape_predictor_68_face_landmarks.dat")    # 获取左眼的特征点    (lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]    # 获取右眼的特征点    (rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]     print("[INFO] starting video stream thread...")    while True:        flag, frame = vs.read()  # 返回一帧的数据        if not flag:            print("不支持摄像头", flag)            break         if frame is not None:            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 转成灰度图像            rects = detector(gray, 0)  # 人脸检测            # 只能处理一张人脸            if len(rects) == 1:                shape = predictor(gray, rects[0])  # 保存68个特征点坐标的<class 'dlib.dlib.full_object_detection'>对象                shape = face_utils.shape_to_np(shape)  # 将shape转换为numpy数组,数组中每个元素为特征点坐标                 left_eye = shape[lStart:lEnd]  # 取出左眼对应的特征点                right_eye = shape[rStart:rEnd]  # 取出右眼对应的特征点                left_ear = eye_aspect_ratio(left_eye)  # 计算左眼EAR                right_ear = eye_aspect_ratio(right_eye)  # 计算右眼EAR                ear = (left_ear + right_ear) / 2.0   # 求左右眼EAR的均值                 left_eye_hull = cv2.convexHull(left_eye)  # 寻找左眼轮廓                right_eye_hull = cv2.convexHull(right_eye)  # 寻找右眼轮廓                # mouth_hull = cv2.convexHull(mouth) # 寻找嘴巴轮廓                cv2.drawContours(frame, [left_eye_hull], -1, (0, 255, 0), 1)   # 绘制左眼轮廓                cv2.drawContours(frame, [right_eye_hull], -1, (0, 255, 0), 1)  # 绘制右眼轮廓                 # EAR低于阈值,有可能发生眨眼,眨眼连续帧数加一次                if ear < EAR_THRESH:                    blink_counter += 1                 # EAR高于阈值,判断前面连续闭眼帧数,如果在合理范围内,说明发生眨眼                else:                    if EAR_CONSEC_FRAMES_MIN <= blink_counter <= EAR_CONSEC_FRAMES_MAX:                        blink_total += 1                    blink_counter = 0                 cv2.putText(frame, "Blinks: {}".format(blink_total), (0, 30),                            cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)                 cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),                            cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)             elif len(rects) == 0:                cv2.putText(frame, "No face!", (0, 30),                            cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)            else:                cv2.putText(frame, "More than one face!", (0, 30),                            cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)            cv2.namedWindow("Frame", cv2.WINDOW_NORMAL)            cv2.imshow("Frame", frame)            # 按下q键退出循环(鼠标要点击一下图片使图片获得焦点)            if cv2.waitKey(1) & 0xFF == ord('q'):                break    cv2.destroyAllWindows()    vs.release()  liveness_detec
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空