使用dlib opencv進行人臉檢測標註

2021-09-21 05:19:35 字數 3791 閱讀 5111

參考自 

在原有基礎上有一部分的修改(image改為可選引數,若不填則為拍照後選取),如果有想深入學習的,可以去關注這位『吳克』先生的文章。

本文不涉及關於人臉檢測的訓練部分(雖然之後隨著學習深入我會再發相關的隨筆),只是簡單的用輪子。

今天我們來使用dlib和opencv進行人臉的檢測標註

首先安裝opencv和dlib的方法

pip install dlib

pip install opencv-python

本程式中還使用了imutils用於resize,安裝方法如下

pip install imutils
訓練好的檔案可識別人臉的68個關鍵點並標註(關鍵點越少肯定越容易導致識別錯誤)

本程式執行方法:若.py和shape_predictor_68_face_landmarks.dat以及需要檢測的在同一目錄下,在當前目錄console中輸入

python my_facial_landmarks.py -p shape_predictor_68_face_landmarks.dat -i guanhai.jpg
或採用拍照識別的方式,輸入

python my_facial_landmarks.py -p shape_predictor_68_face_landmarks.dat
在框中按q完成拍照

之後會顯示標註後的**

例如輸入如下

拍照然後識別就不舉例了吧,大家可以自行嘗試

**如下my_facial_landmarks.py

from imutils import face_utils

import argparse

import imutils

import dlib

import cv2

def takephoto():

cap = cv2.videocapture(0)

while (1):

# get a frame

ret, frame = cap.read()

# show a frame

cv2.imshow("capture", frame)

if cv2.waitkey(1) & 0xff == ord('q'):#按q鍵完成照相

# cv2.imwrite("./test0.jpg", frame) 儲存**,但在這裡我們並不需要

return frame#返回

cap.release()

cv2.destroyallwindows()

def main():

# construct the argument parser and parse the arguments 使用argparse設定輸入所需的實參

ap = argparse.argumentparser()

ap.add_argument("-p", "--shape-predictor", required=true, #訓練好的關於檢測的檔案

help="path to facial landmark predictor")

ap.add_argument("-i", "--image", required=false,default='0', #

help="path to input image")

args = vars(ap.parse_args())

# initialize dlib's face detector (hog-based) and then create

# the facial landmark predictor

#初始化dlib人臉檢測(基於hog),然後建立面部標誌**器

detector = dlib.get_frontal_face_detector()

predictor = dlib.shape_predictor(args["shape_predictor"])

# load the input image, resize it, and convert it to grayscale

if args['image'] != '0':

image = cv2.imread(args['image'])#輸入實參則讀入

else:

image = takephoto()#若未輸入則進行照相操作

image = imutils.resize(image, width=500) # 調整寬度為500

gray = cv2.cvtcolor(image, cv2.color_bgr2gray)#調整為灰色

# detect faces in the grayscale image 檢測灰度影象中的面部

rects = detector(gray, 1)

# loop over the face detections 迴圈進行人臉的檢測

for (i, rect) in enumerate(rects):

# determine the facial landmarks for the face region, then

# convert the facial landmark (x, y)-coordinates to a numpy

# array

# 確定面部區域的面部標誌,然後將面部標誌(x,y)座標轉換成numpy陣列

shape = predictor(gray, rect)

shape = face_utils.shape_to_np(shape)

# convert dlib's rectangle to a opencv-style bounding box

# [i.e., (x, y, w, h)], then draw the face bounding box

#將dlib矩形轉換為opencv樣式的邊界框[即(x,y,w,h)],然後繪製邊界框

(x, y, w, h) = face_utils.rect_to_bb(rect)

cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# show the face number 人臉序號的標記(可識別多張)

cv2.puttext(image, "face #{}".format(i + 1), (x - 10, y - 10),

cv2.font_hershey_******x, 0.5, (0, 255, 0), 2)

# loop over the (x, y)-coordinates for the facial landmarks

# and draw them on the image

#迴圈面部地標的(x,y)座標並在影象上繪製它們

for (x, y) in shape:

cv2.circle(image, (x, y), 1, (0, 0, 255), -1)

# show the output image with the face detections + facial landmarks

#用臉部檢測+面部標誌顯示輸出影象

cv2.imshow("output", image)

cv2.waitkey(0)

if __name__ == '__main__':

main()

**:

使用opencv進行人臉識別

最近由於大作業需要,使用了opencv進行人臉識別。一般來說,識別分為兩部,即人臉檢測 人臉識別,opencv提供了乙個人臉檢測的sample,有乙個比較成熟的訓練人臉正面訓練檔案,這是我所知的乙個很成熟的人臉識別工具,而且已用於一些前沿3d愛情動作遊戲中,這裡主要是對其提供的sample作了一定的...

使用opencv進行人臉識別

最近由於大作業需要,使用了opencv進行人臉識別。一般來說,識別分為兩部,即人臉檢測 人臉識別,opencv提供了乙個人臉檢測的sample,有乙個比較成熟的訓練人臉正面訓練檔案,這是我所知的乙個很成熟的人臉識別工具,而且已用於一些前沿3d愛情動作遊戲中,這裡主要是對其提供的sample作了一定的...

使用Haar Cascade 進行人臉識別

學完了deeplearnning.ai 的卷積神經網路課程之後,為了更直觀的理解人臉識別,我想使用opencv來實現人臉識別。以下為譯文 基於haar特徵的cascade分類器 classifiers 是paul viola和 michael jone在2001年,rapid object dete...