人臉活體檢測人臉識別:眨眼+張口
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 = 0
def 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_encoding
def 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, 67
B = np.linalg.norm(mouth[3] - mouth[5]) # 63, 65
C = np.linalg.norm(mouth[0] - mouth[4]) # 60, 64
mar = (A + B) / (2.0 * C)
return mar
# 進行活體檢測(包含眨眼和張嘴)
# filePath 影片路徑
def liveness_detection():
global blink_total # 使用 global 宣告 blink_total ,在函式中就可以修改全域性變數的值
global mouth_total
global pic_total
global blink_counter
global mouth_status_open
# 眼長寬比例值
EAR_THRESH = 0.15
EAR_CONSEC_FRAMES_MIN = 1
EAR_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:
break
if 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) # 儲存為影像 , 儲存名為 資料夾名 _ 數字(第幾個檔案) .jpg
cv2.waitKey(1)
pic_total += 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 的均值
mouth = shape[mStart:mEnd] # 取出嘴巴對應的特徵點
mar =外匯跟單gendan5.com 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 += 1
blink_counter = 0
# 透過張、閉來判斷一次張嘴動作
if mar > MAR_THRESH:
mouth_status_open = 1
else:
if mouth_status_open:
mouth_total += 1
mouth_status_open = 0
elif len(rects) == 0 and i == 90:
print("No face!")
break
elif len(rects) > 1:
print("More than one face!")
# 判斷眨眼次數大於 2 、張嘴次數大於 1 則為活體 , 退出迴圈
if blink_total >= 1 or mouth_total >= 1:
break
cv2.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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2916364/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 人臉識別 -- 活體檢測(張嘴搖頭識別)
- 人臉識別 — 活體檢測(張嘴搖頭識別)
- 人臉活體檢測
- [計算機視覺]人臉應用:人臉檢測、人臉對比、五官檢測、眨眼檢測、活體檢測、疲勞檢測計算機視覺
- 從零玩轉人臉識別之RGB人臉活體檢測
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- 人臉識別活體檢測技術理論
- 前端人臉識別--兩張臉相似度前端
- 人臉識別之人臉檢測的重要性
- IOS人臉識別開發入門教程--人臉檢測篇iOS
- Python人臉識別微笑檢測Python
- 虹軟人臉識別 - faceId及IR活體檢測的介紹
- 人臉識別檢測專案實戰
- 人臉檢測 二
- opencv 人臉識別OpenCV
- OpenCV — 人臉識別OpenCV
- 一種採用隨機動作指令的人臉活體檢測技術,有效避免人臉識別唄破解隨機
- 人臉檢測(detection)與人臉校準(alignment)
- 前端人臉檢測指南前端
- 一種基於隨機動作指令的人臉活體檢測技術,有效避免人臉識別系統被破解隨機
- 人臉檢測之身份識別你需要的那些事
- 人臉識別之特徵臉方法(Eigenface)特徵
- C#人臉識別入門篇-STEP BY STEP人臉識別--入門篇C#
- 智慧人臉識別門禁系統開發,人臉識別開鎖流程
- opencv視訊人臉檢測OpenCV
- OpenCV 人臉檢測自學(3)OpenCV
- 如何評價美顏api中人臉識別和人臉檢測的準確度?API
- 人臉美化和人臉識別在美顏SDK中的具體應用
- 乾貨 | AI人臉識別之人臉搜尋AI
- 計算機視覺專案-人臉識別與檢測計算機視覺
- 活體檢測API對接php語言方式-人臉靜態/動態活體檢測免費APIPHP
- 清華大學人臉識別技術:每秒能認256萬張臉(轉)
- 40多個關於人臉檢測/識別的API、庫和軟體API
- python ubuntu dlib人臉識別3-人臉對齊PythonUbuntu
- 保障人臉安全!頂象釋出《人臉識別安全白皮書》
- 人臉檢測的harr檢測函式函式
- 人臉識別智慧考勤系統開發_人臉識別考勤管理系統開發
- iOS 人臉關鍵點檢測iOS