使用Python,dlib中新型、更快、更小的5点面部标志检测器检测人脸、眼睛、鼻子
生活随笔
收集整理的這篇文章主要介紹了
使用Python,dlib中新型、更快、更小的5点面部标志检测器检测人脸、眼睛、鼻子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇博客將介紹一個新的dlib面部標志檢測器——5點人臉標志模型,它比原始版本更快(提高了8-10%),效率更高,模型更小(降低了10倍)。
該5點面部標志檢測器被認為是最初隨dlib庫一起分發的68點標志檢測器的直接替代品。
5點面部標志檢測器
- 1. 5點與68點面部標志檢測器效果對比
- 2. 各種人臉檢測器算法的優劣對比
- 3. 如何在自己的腳本中實現五點面部標志檢測器
- 4. 5點面部標志檢測器的局限性
- 5. 源碼
- 6. 參考
1. 5點與68點面部標志檢測器效果對比
68點面部標志檢測器把面部分為眉毛、眼睛、鼻子、嘴巴、下頜五部分;
5點面部標志檢測器將面部分為5個點,左眼2點、右眼2點、鼻子1點;
68點面部標志檢測器(模型【99.7M】)
5點面部標志檢測器(相比68點,速度快10%、效率更高、模型小10倍【9.2M】),小十倍的模型!對于移動應用程序用戶的下載時間/資源上一個極大的進步;
68點面部標志檢測器效果圖:
5點面部標志檢測效果圖:
2. 各種人臉檢測器算法的優劣對比
- Haar級聯:快速,但準確性較低。調整參數可能會很麻煩;
- HOG +線性SVM:通常(顯著)比Haar級聯更準確,假陽性更少。在測試時需要調整的參數較少。與Haar級聯相比,速度可能較慢。
- 基于深度學習的檢測器:經過正確培訓,其比Haar級聯和HOG +線性SVM顯著更準確,更耐用。根據模型的深度和復雜性,它可能非常慢。可以通過在GPU上執行檢測來加快速度;
對于不同的平臺,實現不同的功能,在選擇那種人臉檢測器需要考慮這些準則;
3. 如何在自己的腳本中實現五點面部標志檢測器
1) 加載模型,加載圖片
2) 面部檢測,面部標志檢測
3) 繪制每個點在圖像上
4. 5點面部標志檢測器的局限性
5點面部標志檢測器(左眼2點、右眼2點、鼻子1點)的一個良好應用是面部對齊,比68點更高效;
但在眨眼檢測,疲勞駕駛檢測(核心:計算眼睛的EAR(眼睛的縱橫比),在某個瞬間達到0)時,則必須需要使用68點面部標志檢測器,以及任何其他需要了解更多面部細節(如鼻子、嘴巴、眉毛、下頜)的應用程序也需要使用68點面部標志檢測器。
5. 源碼
# python faster_facial_landmarks.py --shape-predictor shape_predictor_5_face_landmarks.dat --image images/03.jpg
# python faster_facial_landmarks.py --shape-predictor shape_predictor_68_face_landmarks.dat --image images/03.jpg# 導入必要的包
from imutils import face_utils
import argparse
import imutils
import dlib
import cv2# 構建命令行參數,解析參數
# --shape-predictor 面部標志檢測器模型路徑
# --image 圖像路徑
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True,help="path to facial landmark predictor")
ap.add_argument("-i", "--image", required=True,help="path to input image")
args = vars(ap.parse_args())# 初始化dlib基于 HOG的面部檢測器
# 初始化面部標志檢測器
print("[INFO] loading facial landmark predictor...")
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])# 加載圖像,保持寬高比的縮放到寬度為500像素,轉換為灰度圖
image = cv2.imread(args["image"])
image = imutils.resize(image, width=800)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用HOG+線性SVM檢測器 從灰度圖幀中檢測面部
rects = detector(gray, 0)# 判斷是否檢測到了面部,并打印檢測到的人臉數目在屏幕上
if len(rects) > 0:text = "{} face(s) found".format(len(rects))
cv2.putText(image, text, (10, 20), cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 0, 255), 2)# 遍歷每一個人臉
for rect in rects:# 計算人臉的邊界框,并打印在評不上(bX, bY, bW, bH) = face_utils.rect_to_bb(rect)cv2.rectangle(image, (bX, bY), (bX + bW, bY + bH),(0, 255, 0), 1)# 從面部區域中檢測面部標志# 轉換檢測到的面部標志坐標為Numpy數組shape = predictor(gray, rect)shape = face_utils.shape_to_np(shape)# 遍歷每一個面部標志結果的(x, y)像素,并繪制小圓圈在屏幕上for (i, (x, y)) in enumerate(shape):cv2.circle(image, (x, y), 1, (0, 0, 255), -1)cv2.putText(image, str(i + 1), (x - 10, y - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)# 展示圖片
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
6. 參考
- https://www.pyimagesearch.com/2018/04/02/faster-facial-landmark-detector-with-dlib/#download-the-code
總結
以上是生活随笔為你收集整理的使用Python,dlib中新型、更快、更小的5点面部标志检测器检测人脸、眼睛、鼻子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python,OpenCV,面部标志
- 下一篇: 站在巨人的肩膀上,Adrian与dlib