|
# 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", "--encodings", required=True,
|
|
help="path to serialized db of facial encodings")
|
|
ap.add_argument("-i", "--image", required=True,
|
|
help="path to input image")
|
|
ap.add_argument("-d", "--detection-method", type=str, 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, (left, y), cv2.FONT_HERSHEY_SIMPLEX,
|
|
0.75, (0, 255, 0), 2)
|
|
|
|
# show the output image
|
|
cv2.imshow("Image", image)
|
|
cv2.waitKey(0)
|