一: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_utils
import numpy as np
import dlib
import 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.15EAR_CONSEC_FRAMES_MIN = 1EAR_CONSEC_FRAMES_MAX = 3  # 当EAR小于阈值时,接连多少帧一定发生眨眼动作# 初始化眨眼的连续帧数blink_counter = 0# 初始化眨眼次数总数blink_total = 0print("[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)breakif 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)  # 计算左眼EARright_ear = eye_aspect_ratio(right_eye)  # 计算右眼EARear = (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 += 1blink_counter = 0cv2.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'):breakcv2.destroyAllWindows()vs.release()liveness_detection()

三、张口检测

检测原理:类似眨眼检测,计算Mouth Aspect Ratio,MAR.当MAR大于设定的阈值时,认为张开了嘴巴。

1:采用的判定是张开后闭合计算一次张嘴动作。

mar     # 嘴长宽比例

MAR_THRESH = 0.2    # 嘴长宽比例值

mouth_status_open   # 初始化张嘴状态为闭嘴

当mar大于设定的比例值表示张开,张开后闭合代表一次张嘴动作

   # 通过张、闭来判断一次张嘴动作if mar > MAR_THRESH:mouth_status_open = 1else:if mouth_status_open:mouth_total += 1mouth_status_open = 0

2: 嘴长宽比例的计算

# 嘴长宽比例
def mouth_aspect_ratio(mouth):A = np.linalg.norm(mouth[1] - mouth[7])  # 61, 67B = np.linalg.norm(mouth[3] - mouth[5])  # 63, 65C = np.linalg.norm(mouth[0] - mouth[4])  # 60, 64mar = (A + B) / (2.0 * C)return mar

原本采用嘴唇外边缘来计算,发现嘟嘴也会被判定为张嘴,故才用嘴唇内边缘进行计算,会更加准确。

这里mouth下标的值取决于取的是“mouth”还是“inner_mouth”,由于我要画的轮廓是内嘴,所以我采用的是inner_mouth

 (mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["inner_mouth"]

打开以下方法,进入到源码,可以看到每个特征点对应的下标是不一样的,对应的mouth特征点的下标也是不同的

(以上的区间包左边代表开始下标,右边值-1)从上面可知mouth是从(48,68),inner_mouth从(60, 68),mouth包含inner_mouth,如果取得是mouth的值,则嘴长宽比例的计算如下

# 嘴长宽比例
def mouth_aspect_ratio(mouth):# (|m13-m19|+|m15-m17|)/(2|m12-m16|)A = np.linalg.norm(mouth[13] - mouth[19])  # 61, 67B = np.linalg.norm(mouth[15] - mouth[17])  # 63, 65C = np.linalg.norm(mouth[12] - mouth[16])  # 60, 64mar = (A + B) / (2.0 * C)return mar

3:完整程序实现如下

from imutils import face_utils
import numpy as np
import dlib
import cv2# 嘴长宽比例
def mouth_aspect_ratio(mouth):A = np.linalg.norm(mouth[1] - mouth[7])  # 61, 67B = np.linalg.norm(mouth[3] - mouth[5])  # 63, 65C = np.linalg.norm(mouth[0] - mouth[4])  # 60, 64mar = (A + B) / (2.0 * C)return mar#  进行活体检测(张嘴)
def liveness_detection():vs = cv2.VideoCapture(0)  # 调用第一个摄像头的信息# 嘴长宽比例值MAR_THRESH = 0.2# 初始化张嘴次数mouth_total = 0# 初始化张嘴状态为闭嘴mouth_status_open = 0print("[INFO] loading facial landmark predictor...")# 人脸检测器detector = dlib.get_frontal_face_detector()# 特征点检测器predictor = dlib.shape_predictor("model/shape_predictor_68_face_landmarks.dat")# 获取嘴巴特征点(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["inner_mouth"]print("[INFO] starting video stream thread...")while True:flag, frame = vs.read()  # 返回一帧的数据if not flag:print("不支持摄像头", flag)breakif 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数组,数组中每个元素为特征点坐标inner_mouth = shape[mStart:mEnd]   # 取出嘴巴对应的特征点mar = mouth_aspect_ratio(inner_mouth)  # 求嘴巴mar的均值mouth_hull = cv2.convexHull(inner_mouth)  # 寻找内嘴巴轮廓cv2.drawContours(frame, [mouth_hull], -1, (0, 255, 0), 1)  # 绘制嘴巴轮廓# 通过张、闭来判断一次张嘴动作if mar > MAR_THRESH:mouth_status_open = 1else:if mouth_status_open:mouth_total += 1mouth_status_open = 0cv2.putText(frame, "Mouth: {}".format(mouth_total),(130, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, "MAR: {:.2f}".format(mar), (450, 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'):breakcv2.destroyAllWindows()vs.release()liveness_detection()

三:眨眼和张嘴结合(摄像头)

from imutils import face_utils
import numpy as np
import dlib
import 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 mouth_aspect_ratio(mouth):A = np.linalg.norm(mouth[1] - mouth[7])  # 61, 67B = np.linalg.norm(mouth[3] - mouth[5])  # 63, 65C = np.linalg.norm(mouth[0] - mouth[4])  # 60, 64mar = (A + B) / (2.0 * C)return mar#  进行活体检测(包含眨眼和张嘴)
def liveness_detection():vs = cv2.VideoCapture(0)  # 调用第一个摄像头的信息# 眼长宽比例值EAR_THRESH = 0.15EAR_CONSEC_FRAMES_MIN = 1EAR_CONSEC_FRAMES_MAX = 5  # 当EAR小于阈值时,接连多少帧一定发生眨眼动作# 嘴长宽比例值MAR_THRESH = 0.2# 初始化眨眼的连续帧数blink_counter = 0# 初始化眨眼次数总数blink_total = 0# 初始化张嘴次数mouth_total = 0# 初始化张嘴状态为闭嘴mouth_status_open = 0print("[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"]# 获取嘴巴特征点(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["inner_mouth"]print("[INFO] starting video stream thread...")while True:flag, frame = vs.read()  # 返回一帧的数据if not flag:print("不支持摄像头", flag)breakif frame is not None:# 图片转换成灰色(去除色彩干扰,让图片识别更准确)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)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)  # 计算左眼EARright_ear = eye_aspect_ratio(right_eye)  # 计算右眼EARear = (left_ear + right_ear) / 2.0   # 求左右眼EAR的均值inner_mouth = shape[mStart:mEnd]  # 取出嘴巴对应的特征点mar = mouth_aspect_ratio(inner_mouth)  # 求嘴巴mar的均值left_eye_hull = cv2.convexHull(left_eye)  # 寻找左眼轮廓right_eye_hull = cv2.convexHull(right_eye)  # 寻找右眼轮廓mouth_hull = cv2.convexHull(inner_mouth)  # 寻找内嘴巴轮廓cv2.drawContours(frame, [left_eye_hull], -1, (0, 255, 0), 1)   # 绘制左眼轮廓cv2.drawContours(frame, [right_eye_hull], -1, (0, 255, 0), 1)  # 绘制右眼轮廓cv2.drawContours(frame, [mouth_hull], -1, (0, 255, 0), 1)  # 绘制嘴巴轮廓# EAR低于阈值,有可能发生眨眼,眨眼连续帧数加一次if ear < EAR_THRESH:blink_counter += 1# EAR高于阈值,判断前面连续闭眼帧数,如果在合理范围内,说明发生眨眼else:# if the eyes were closed for a sufficient number of# then increment the total number of blinksif EAR_CONSEC_FRAMES_MIN <= blink_counter <= EAR_CONSEC_FRAMES_MAX:blink_total += 1blink_counter = 0# 通过张、闭来判断一次张嘴动作if mar > MAR_THRESH:mouth_status_open = 1else:if mouth_status_open:mouth_total += 1mouth_status_open = 0cv2.putText(frame, "Blinks: {}".format(blink_total), (0, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, "Mouth: {}".format(mouth_total),(130, 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)cv2.putText(frame, "MAR: {:.2f}".format(mar), (450, 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'):breakcv2.destroyAllWindows()vs.release()#  调用摄像头进行张嘴眨眼活体检测
liveness_detection()

四:采用视频进行活体检测

最大的区别是原来通过摄像头获取一帧一帧的视频流进行判断,现在是通过视频获取一帧一帧的视频流进行判断

1:先看下获取摄像头的图像信息

# -*-coding:GBK -*-
import cv2
from PIL import Image, ImageDraw
import numpy as np# 1.调用摄像头
# 2.读取摄像头图像信息
# 3.在图像上添加文字信息
# 4.保存图像cap = cv2.VideoCapture(0)  # 调用第一个摄像头信息while True:flag, frame = cap.read()  # 返回一帧的数据# #返回值:flag:bool值:True:读取到图片,False:没有读取到图片  frame:一帧的图片# BGR是cv2 的图像保存格式,RGB是PIL的图像保存格式,在转换时需要做格式上的转换img_PIL = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img_PIL)draw.text((100, 100), 'press q to exit', fill=(255, 255, 255))# 将frame对象转换成cv2的格式frame = cv2.cvtColor(np.array(img_PIL), cv2.COLOR_RGB2BGR)cv2.imshow('capture', frame)if cv2.waitKey(1) & 0xFF == ord('q'):cv2.imwrite('images/out.jpg', frame)breakcap.release()

2:获取视频的图像信息

# -*-coding:GBK -*-
import cv2
from PIL import Image, ImageDraw
import numpy as np# 1.调用摄像头
# 2.读取摄像头图像信息
# 3.在图像上添加文字信息
# 4.保存图像cap = cv2.VideoCapture(r'video\face13.mp4')  # 调用第一个摄像头信息while True:flag, frame = cap.read()  # 返回一帧的数据if not flag:breakif frame is not None:# BGR是cv2 的图像保存格式,RGB是PIL的图像保存格式,在转换时需要做格式上的转换img_PIL = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img_PIL)draw.text((100, 100), 'press q to exit', fill=(255, 255, 255))# # 将frame对象转换成cv2的格式frame = cv2.cvtColor(np.array(img_PIL), cv2.COLOR_RGB2BGR)cv2.imshow('capture', frame)if cv2.waitKey(1) & 0xFF == ord('q'):cv2.imwrite('images/out.jpg', frame)breakcv2.destroyAllWindows()
cap.release()

五:视频进行人脸识别和活体检测

1:原理

计算当出现1次眨眼或1次张嘴就判断为活人,记录下一帧的人脸图片,和要判定的人员图片进行比对,获取比对后的相似度,进行判断是否是同一个人,为了增加判断的速度,才用2帧进行一次活体检测判断。

2:代码实现

import face_recognition
from imutils import face_utils
import numpy as np
import dlib
import cv2
import sys# 初始化眨眼次数
blink_total = 0
# 初始化张嘴次数
mouth_total = 0
# 设置图片存储路径
pic_path = r'images\viode_face.jpg'
# 图片数量
pic_total = 0
# 初始化眨眼的连续帧数以及总的眨眼次数
blink_counter = 0
# 初始化张嘴状态为闭嘴
mouth_status_open = 0def getFaceEncoding(src):image = face_recognition.load_image_file(src)  # 加载人脸图片# 获取图片人脸定位[(top,right,bottom,left )]face_locations = face_recognition.face_locations(image)img_ = image[face_locations[0][0]:face_locations[0][2], face_locations[0][3]:face_locations[0][1]]img_ = cv2.cvtColor(img_, cv2.COLOR_BGR2RGB)# display(img_)face_encoding = face_recognition.face_encodings(image, face_locations)[0]  # 对人脸图片进行编码return face_encodingdef simcos(a, b):a = np.array(a)b = np.array(b)dist = np.linalg.norm(a - b)  # 二范数sim = 1.0 / (1.0 + dist)  #return sim# 提供对外比对的接口 返回比对的相似度
def comparison(face_src1, face_src2):xl1 = getFaceEncoding(face_src1)xl2 = getFaceEncoding(face_src2)value = simcos(xl1, xl2)print(value)# 眼长宽比例
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 mouth_aspect_ratio(mouth):A = np.linalg.norm(mouth[1] - mouth[7])  # 61, 67B = np.linalg.norm(mouth[3] - mouth[5])  # 63, 65C = np.linalg.norm(mouth[0] - mouth[4])  # 60, 64mar = (A + B) / (2.0 * C)return mar#  进行活体检测(包含眨眼和张嘴)
#  filePath 视频路径
def liveness_detection():global blink_total  # 使用global声明blink_total,在函数中就可以修改全局变量的值global mouth_totalglobal pic_totalglobal blink_counterglobal mouth_status_open# 眼长宽比例值EAR_THRESH = 0.15EAR_CONSEC_FRAMES_MIN = 1EAR_CONSEC_FRAMES_MAX = 5  # 当EAR小于阈值时,接连多少帧一定发生眨眼动作# 嘴长宽比例值MAR_THRESH = 0.2# 人脸检测器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"]# 获取嘴巴特征点(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["inner_mouth"]vs = cv2.VideoCapture(video_path)# 总帧数(frames)frames = vs.get(cv2.CAP_PROP_FRAME_COUNT)frames_total = int(frames)for i in range(frames_total):ok, frame = vs.read(i)  # 读取视频流的一帧if not ok:breakif frame is not None and i % 2 == 0:# 图片转换成灰色(去除色彩干扰,让图片识别更准确)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)rects = detector(gray, 0)  # 人脸检测# 只能处理一张人脸if len(rects) == 1:if pic_total == 0:cv2.imwrite(pic_path, frame)  # 存储为图像,保存名为 文件夹名_数字(第几个文件).jpgcv2.waitKey(1)pic_total += 1shape = 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)  # 计算左眼EARright_ear = eye_aspect_ratio(right_eye)  # 计算右眼EARear = (left_ear + right_ear) / 2.0   # 求左右眼EAR的均值mouth = shape[mStart:mEnd]   # 取出嘴巴对应的特征点mar = mouth_aspect_ratio(mouth)  # 求嘴巴mar的均值# EAR低于阈值,有可能发生眨眼,眨眼连续帧数加一次if ear < EAR_THRESH:blink_counter += 1# EAR高于阈值,判断前面连续闭眼帧数,如果在合理范围内,说明发生眨眼else:if EAR_CONSEC_FRAMES_MIN <= blink_counter <= EAR_CONSEC_FRAMES_MAX:blink_total += 1blink_counter = 0# 通过张、闭来判断一次张嘴动作if mar > MAR_THRESH:mouth_status_open = 1else:if mouth_status_open:mouth_total += 1mouth_status_open = 0elif len(rects) == 0 and i == 90:print("No face!")breakelif len(rects) > 1:print("More than one face!")# 判断眨眼次数大于2、张嘴次数大于1则为活体,退出循环if blink_total >= 1 or mouth_total >= 1:breakcv2.destroyAllWindows()vs.release()# video_path, src = sys.argv[1], sys.argv[2]video_path = r'video\face13.mp4'      # 输入的video文件夹位置
# src = r'C:\Users\666\Desktop\zz5.jpg'
liveness_detection()
print("眨眼次数》》", blink_total)
print("张嘴次数》》", mouth_total)
# comparison(pic_path, src)

六:涉及到的代码

代码包含face_recognition库所有功能的用例,和上面涉及到的dilb库进行人脸识别的所有代码

使用dilb、face_recognition库实现,眨眼+张嘴的活体检测、和人脸识别功能。包含摄像头和视频-Python文档类资源-CSDN下载

参考:

使用dlib人脸检测模型进行人脸活体检测:眨眼+张口_Lee_01的博客-CSDN博客

python dlib学习(十一):眨眼检测_hongbin_xu的博客-CSDN博客_眨眼检测算法

Python开发系统实战项目:人脸识别门禁监控系统_闭关修炼——暂退的博客-CSDN博客_face_encodings

人脸活体检测人脸识别:眨眼+张口相关推荐

  1. [人脸活体检测] 人脸活体检测简介

    人脸活体检测 一.简介 ​ 随着人脸识别.人脸解锁等技术在金融.门禁.移动设备等日常生活中的广泛应用,人脸防伪/活体检测(Face Anti-Spoofing)技术在近年来得到了越来越多的关注.设想一 ...

  2. 人脸活体检测技术的应用,保障人脸识别环节的安全性

    目前,深度学习的发展使人脸识别技术的性能有了质的提升,其具有自然.直观.易用等优点, 已广泛应用于智能安防.公安刑侦.金融社保.医疗教育等领域.然而, 人脸识别技术的广泛应用亦使得人脸识别技术的安全性 ...

  3. 应用人脸活体检测技术,可避免人脸识别系统被攻击

    人脸识别技术是近年来出现的一种基于人的脸部特征信息进行身份识别的生物特征识别技术.与其他生物识别技术相比较,人脸识别具有友好.简便.准确.经济及可扩展性良好等众多优势,可广泛应用于安全验证.监控.出入 ...

  4. 应用人脸活体检测技术,避免人脸识别被破解

    随着人脸识别技术日趋成熟,商业化应用愈加广泛,尤其是在金融行业,人脸识别技术已逐渐用于远程开户.取款.支付等,涉及用户的切身利益,然而人脸极易用照片.视频等方式进行复制,因此对合法用户人脸的假冒是人脸 ...

  5. 从零玩转人脸识别之RGB人脸活体检测

    从零玩转RGB人脸活体检测 前言 作者个人博客: 点击前往 本期教程人脸识别第三方平台为虹软科技,本文章讲解的是人脸识别RGB活体追踪技术,免费的功能很多可以自行搭配,希望在你看完本章课程有所收获. ...

  6. 静默活体检测+人脸检测+人脸识别结合在NCNN模型下的推理(Windows下的VS环境)

     前言: 涉及到三个模型  静默活体检测模型<2M,人脸检测模型<2M  ,人脸识别<5M(模型大小) 至于NCNN不必多说,全C++实现,不依赖第三方库实现,在第三方移动端CPU运 ...

  7. 防“活化”照片蒙混过关,数据宝“活体检测+人脸识别”让刷脸更安全

    随着人脸识别技术日益成熟,商业化应用越来越广泛,人脸登录.人脸支付.人脸乘梯.人脸闸机等等,在安防.金融.教育.医疗等领域广泛应用,人脸识别技术的智能快捷在国内得到迅速发展. 但人脸识别容易被照片.视 ...

  8. php活体检测,人脸门禁系统中活体检测的必要性

    人脸识别技术日趋成熟,商业化应用愈加广泛.为防止恶意者伪造或窃取他人的人脸特征用于身份认证,人脸识别系统需具备活体检测功能,以判断提交的人脸特征是否来自有生命的真实个体. 人脸识别技术日趋成熟,商业化 ...

  9. python 活体检测_基于Python+Keras+OpenCV实现实时人脸活体检测 | 文末送书

    你在互联网上找到的大多数人脸识别算法和研究论文都会遭受照片***.这些方法在检测和识别来自网络摄像头的图像.视频和视频流中的人脸方面是很是有效,可是他们没法区分现实生活中的面孔和照片上的面孔.这种没法 ...

  10. 基于Python+Keras+OpenCV实现实时人脸活体检测 | 文末送书

    你在互联网上找到的大多数人脸识别算法和研究论文都会遭受照片攻击.这些方法在检测和识别来自网络摄像头的图像.视频和视频流中的人脸方面是非常有效,但是他们无法区分现实生活中的面孔和照片上的面孔.这种无法区 ...

最新文章

  1. 使用BCH 操作码的三个新型应用程序
  2. goj基础环境的配置
  3. Linux文件创建时间
  4. 史上最经典的数据库面试题之二
  5. TensorFlow学习笔记(十三)TensorFLow 常用Optimizer 总结
  6. xmlWriter 以UTF-8格式写xml问题
  7. redis 的bitmap 开源包 bitmapist的应用
  8. SQL算法中的变量使用占位符动态赋值
  9. matplotlib显示图中标签
  10. Python使用datetime来判断近七天
  11. ASP.NET全局文件Global.asax用法分析
  12. 一个SQL SERVER查询分析器非常好用的工具
  13. mBlock机器人组装教程_mbot机器人如何搭建?mBot机器人套件快速搭建指南
  14. 软件测试之如何介绍自己的项目
  15. 重置Windows 7网络设置
  16. 2017年 第八届蓝桥杯 Java B组真题整理
  17. 深入理解数据库当中的聚合函数
  18. 思科模拟器PacketTracer7--利用一台交换机和2台pc互连构成小型局域网
  19. URP——后期处理特效
  20. Ubuntu/Mac/Windows与手机传输文件

热门文章

  1. U盘插入电脑说要格式化,但电脑又说“磁盘被写保护,无法格式化”,如何解决
  2. DeviceOrientation ---实现指南针
  3. Shell /dev/null 文件的含义
  4. 过去一年对我帮助最大的三本书
  5. 扫普通二维码打开小程序,可进入体验版
  6. 15款替代微软产品的开源软件
  7. 怎样去掉gif动图水印?在线编辑gif图片技巧
  8. IO-4、RAID结构
  9. android日历分析,kotlin - Android开发之日历篇(1)
  10. 智能硬件市场与产品概况整理