1. 程式人生 > 程式設計 >Python基於Dlib的人臉識別系統的實現

Python基於Dlib的人臉識別系統的實現

之前已經介紹過人臉識別的基礎概念,以及基於opencv的實現方式,今天,我們使用dlib來提取128維的人臉嵌入,並使用k臨近值方法來實現人臉識別。

人臉識別系統的實現流程與之前是一樣的,只是這裡我們藉助了dlib和face_recognition這兩個庫來實現。face_recognition是對dlib庫的包裝,使對dlib的使用更方便。所以首先要安裝這2個庫。

pip3 install dlib
pip3 install face_recognition

然後,還要安裝imutils庫

 pip3 install imutils

我們看一下專案的目錄結構:

.
├── dataset
│ ├── alan_grant [22 entries exceeds filelimit,not opening dir]
│ ├── claire_dearing [53 entries exceeds filelimit,not opening dir]
│ ├── ellie_sattler [31 entries exceeds filelimit,not opening dir]
│ ├── ian_malcolm [41 entries exceeds filelimit,not opening dir]
│ ├── john_hammond [36 entries exceeds filelimit,not opening dir]
│ └── owen_grady [35 entries exceeds filelimit,not opening dir]
├── examples
│ ├── example_01.png
│ ├── example_02.png
│ └── example_03.png
├── output
│ ├── lunch_scene_output.avi
│ └── webcam_face_recognition_output.avi
├── videos
│ └── lunch_scene.mp4
├── encode_faces.py
├── encodings.pickle
├── recognize_faces_image.py
├── recognize_faces_video_file.py
├── recognize_faces_video.py
└── search_bing_api.py
 
10 directories,12 files

首先,提取128維的人臉嵌入:

命令如下:

python3 encode_faces.py --dataset dataset --encodings encodings.pickle -d hog

記住:如果你的電腦記憶體不夠大,請使用hog模型進行人臉檢測,如果記憶體夠大,可以使用cnn神經網路進行人臉檢測。

看程式碼:

# USAGE
# python encode_faces.py --dataset dataset --encodings encodings.pickle
 
# import the necessary packages
from imutils import paths
import face_recognition
import argparse
import pickle
import cv2
import os
 
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i","--dataset",required=True,help="path to input directory of faces + images")
ap.add_argument("-e","--encodings",help="path to serialized db of facial encodings")
ap.add_argument("-d","--detection-method",type=str,default="hog",help="face detection model to use: either `hog` or `cnn`")
args = vars(ap.parse_args())
 
# grab the paths to the input images in our dataset
print("[INFO] quantifying faces...")
imagePaths = list(paths.list_images(args["dataset"]))
 
# initialize the list of known encodings and known names
knownEncodings = []
knownNames = []
 
# loop over the image paths
for (i,imagePath) in enumerate(imagePaths):
	# extract the person name from the image path
	print("[INFO] processing image {}/{}".format(i + 1,len(imagePaths)))
	name = imagePath.split(os.path.sep)[-2]
 
	# load the input image and convert it from RGB (OpenCV ordering)
	# to dlib ordering (RGB)
	image = cv2.imread(imagePath)
	rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
 
	# detect the (x,y)-coordinates of the bounding boxes
	# corresponding to each face in the input image
	boxes = face_recognition.face_locations(rgb,model=args["detection_method"])
 
	# compute the facial embedding for the face
	encodings = face_recognition.face_encodings(rgb,boxes)
 
	# loop over the encodings
	for encoding in encodings:
		# add each encoding + name to our set of known names and
		# encodings
		knownEncodings.append(encoding)
		knownNames.append(name)
 
# dump the facial encodings + names to disk
print("[INFO] serializing encodings...")
data = {"encodings": knownEncodings,"names": knownNames}
f = open(args["encodings"],"wb")
f.write(pickle.dumps(data))
f.close()

輸出結果是每張圖片輸出一個人臉的128維的向量和對於的名字,並序列化到硬碟,供後續人臉識別使用。

識別影象中的人臉:

這裡使用KNN方法實現最終的人臉識別,而不是使用SVM進行訓練。

命令如下:

python3 recognize_faces_image.py --encodings encodings.pickle 	--image examples/example_01.png

看程式碼:

# USAGE
# python recognize_faces_image.py --encodings encodings.pickle --image examples/example_01.png 
 
# import the necessary packages
import face_recognition
import argparse
import pickle
import cv2
 
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-e",help="path to serialized db of facial encodings")
ap.add_argument("-i","--image",help="path to input image")
ap.add_argument("-d",default="cnn",help="face detection model to use: either `hog` or `cnn`")
args = vars(ap.parse_args())
 
# load the known faces and embeddings
print("[INFO] loading encodings...")
data = pickle.loads(open(args["encodings"],"rb").read())
 
# load the input image and convert it from BGR to RGB
image = cv2.imread(args["image"])
rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
 
# detect the (x,y)-coordinates of the bounding boxes corresponding
# to each face in the input image,then compute the facial embeddings
# for each face
print("[INFO] recognizing faces...")
boxes = face_recognition.face_locations(rgb,model=args["detection_method"])
encodings = face_recognition.face_encodings(rgb,boxes)
 
# initialize the list of names for each face detected
names = []
 
# loop over the facial embeddings
for encoding in encodings:
	# attempt to match each face in the input image to our known
	# encodings
	matches = face_recognition.compare_faces(data["encodings"],encoding)
	name = "Unknown"
 
	# check to see if we have found a match
	if True in matches:
		# find the indexes of all matched faces then initialize a
		# dictionary to count the total number of times each face
		# was matched
		matchedIdxs = [i for (i,b) in enumerate(matches) if b]
		counts = {}
 
		# loop over the matched indexes and maintain a count for
		# each recognized face face
		for i in matchedIdxs:
			name = data["names"][i]
			counts[name] = counts.get(name,0) + 1
 
		# determine the recognized face with the largest number of
		# votes (note: in the event of an unlikely tie Python will
		# select first entry in the dictionary)
		name = max(counts,key=counts.get)
	
	# update the list of names
	names.append(name)
 
# loop over the recognized faces
for ((top,right,bottom,left),name) in zip(boxes,names):
	# draw the predicted face name on the image
	cv2.rectangle(image,(left,top),(right,bottom),(0,255,0),2)
	y = top - 15 if top - 15 > 15 else top + 15
	cv2.putText(image,name,y),cv2.FONT_HERSHEY_SIMPLEX,0.75,2)
 
# show the output image
cv2.imshow("Image",image)
cv2.waitKey(0)

實際效果如下:

Python基於Dlib的人臉識別系統的實現

如果要詳細瞭解細節,請參考:https://www.pyimagesearch.com/2018/06/18/face-recognition-with-opencv-python-and-deep-learning/

到此這篇關於Python基於Dlib的人臉識別系統的實現的文章就介紹到這了,更多相關Python Dlib人臉識別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!