@ -0,0 +1,5 @@ | |||
videos/ | |||
output/ | |||
dataset/* | |||
new_dataset/* | |||
*/pickle |
@ -0,0 +1,62 @@ | |||
# 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", required=True, | |||
help="path to serialized db of facial encodings") | |||
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()) | |||
# 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() |
@ -0,0 +1,79 @@ | |||
# 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) |
@ -0,0 +1,133 @@ | |||
#!/usr/bin/env python3 | |||
# USAGE | |||
# python recognize_faces_video.py --encodings encodings.pickle | |||
# python recognize_faces_video.py --encodings encodings.pickle --output output/jurassic_park_trailer_output.avi --display 0 | |||
# import the necessary packages | |||
from imutils.video import VideoStream | |||
import face_recognition | |||
import argparse | |||
import imutils | |||
import pickle | |||
import time | |||
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("-o", "--output", type=str, | |||
help="path to output video") | |||
ap.add_argument("-y", "--display", type=int, default=1, | |||
help="whether or not to display output frame to screen") | |||
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()) | |||
# initialize the video stream and pointer to output video file, then | |||
# allow the camera sensor to warm up | |||
print("[INFO] starting video stream...") | |||
vs = VideoStream(src=0).start() | |||
writer = None | |||
time.sleep(2.0) | |||
# loop over frames from the video file stream | |||
while True: | |||
try: | |||
# grab the frame from the threaded video stream | |||
frame = vs.read() | |||
# convert the input frame from BGR to RGB then resize it to have | |||
# a width of 750px (to speedup processing) | |||
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |||
rgb = imutils.resize(frame, width=750) | |||
r = frame.shape[1] / float(rgb.shape[1]) | |||
# detect the (x, y)-coordinates of the bounding boxes | |||
# corresponding to each face in the input frame, then compute | |||
# the facial embeddings for each face | |||
boxes = face_recognition.face_locations(rgb, | |||
model=args["detection_method"]) | |||
encodings = face_recognition.face_encodings(rgb, boxes) | |||
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): | |||
# rescale the face coordinates | |||
top = int(top * r) | |||
right = int(right * r) | |||
bottom = int(bottom * r) | |||
left = int(left * r) | |||
# draw the predicted face name on the image | |||
cv2.rectangle(frame, (left, top), (right, bottom), | |||
(0, 255, 0), 2) | |||
y = top - 15 if top - 15 > 15 else top + 15 | |||
cv2.putText(frame, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX, | |||
0.75, (0, 255, 0), 2) | |||
# if the video writer is None *AND* we are supposed to write | |||
# the output video to disk initialize the writer | |||
if writer is None and args["output"] is not None: | |||
fourcc = cv2.VideoWriter_fourcc(*"MJPG") | |||
writer = cv2.VideoWriter(args["output"], fourcc, 20, | |||
(frame.shape[1], frame.shape[0]), True) | |||
# if the writer is not None, write the frame with recognized | |||
# faces t odisk | |||
if writer is not None: | |||
writer.write(frame) | |||
# check to see if we are supposed to display the output frame to | |||
# the screen | |||
if args["display"] > 0: | |||
cv2.imshow("Frame", frame) | |||
key = cv2.waitKey(1) & 0xFF | |||
# if the `q` key was pressed, break from the loop | |||
if key == ord("q"): | |||
break | |||
except KeyboardInterrupt: | |||
break | |||
# do a bit of cleanup | |||
cv2.destroyAllWindows() | |||
vs.stop() | |||
# check to see if the video writer point needs to be released | |||
if writer is not None: | |||
writer.release() |
@ -0,0 +1,132 @@ | |||
# USAGE | |||
# python recognize_faces_video_file.py --encodings encodings.pickle --input videos/lunch_scene.mp4 | |||
# python recognize_faces_video_file.py --encodings encodings.pickle --input videos/lunch_scene.mp4 --output output/lunch_scene_output.avi --display 0 | |||
# import the necessary packages | |||
import face_recognition | |||
import argparse | |||
import imutils | |||
import pickle | |||
import time | |||
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", "--input", required=True, | |||
help="path to input video") | |||
ap.add_argument("-o", "--output", type=str, | |||
help="path to output video") | |||
ap.add_argument("-y", "--display", type=int, default=1, | |||
help="whether or not to display output frame to screen") | |||
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()) | |||
# initialize the pointer to the video file and the video writer | |||
print("[INFO] processing video...") | |||
stream = cv2.VideoCapture(args["input"]) | |||
writer = None | |||
# loop over frames from the video file stream | |||
while True: | |||
# grab the next frame | |||
(grabbed, frame) = stream.read() | |||
# if the frame was not grabbed, then we have reached the | |||
# end of the stream | |||
if not grabbed: | |||
break | |||
# convert the input frame from BGR to RGB then resize it to have | |||
# a width of 750px (to speedup processing) | |||
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |||
rgb = imutils.resize(frame, width=750) | |||
r = frame.shape[1] / float(rgb.shape[1]) | |||
# detect the (x, y)-coordinates of the bounding boxes | |||
# corresponding to each face in the input frame, then compute | |||
# the facial embeddings for each face | |||
boxes = face_recognition.face_locations(rgb, | |||
model=args["detection_method"]) | |||
encodings = face_recognition.face_encodings(rgb, boxes) | |||
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): | |||
# rescale the face coordinates | |||
top = int(top * r) | |||
right = int(right * r) | |||
bottom = int(bottom * r) | |||
left = int(left * r) | |||
# draw the predicted face name on the image | |||
cv2.rectangle(frame, (left, top), (right, bottom), | |||
(0, 255, 0), 2) | |||
y = top - 15 if top - 15 > 15 else top + 15 | |||
cv2.putText(frame, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX, | |||
0.75, (0, 255, 0), 2) | |||
# if the video writer is None *AND* we are supposed to write | |||
# the output video to disk initialize the writer | |||
if writer is None and args["output"] is not None: | |||
fourcc = cv2.VideoWriter_fourcc(*"MJPG") | |||
writer = cv2.VideoWriter(args["output"], fourcc, 24, | |||
(frame.shape[1], frame.shape[0]), True) | |||
# if the writer is not None, write the frame with recognized | |||
# faces t odisk | |||
if writer is not None: | |||
writer.write(frame) | |||
# check to see if we are supposed to display the output frame to | |||
# the screen | |||
if args["display"] > 0: | |||
cv2.imshow("Frame", frame) | |||
key = cv2.waitKey(1) & 0xFF | |||
# if the `q` key was pressed, break from the loop | |||
if key == ord("q"): | |||
break | |||
# close the video file pointers | |||
stream.release() | |||
# check to see if the video writer point needs to be released | |||
if writer is not None: | |||
writer.release() |
@ -0,0 +1,114 @@ | |||
# USAGE | |||
# python search_bing_api.py --query "alan grant" --output dataset/alan_grant | |||
# python search_bing_api.py --query "ian malcolm" --output dataset/ian_malcolm | |||
# python search_bing_api.py --query "ellie sattler" --output dataset/ellie_sattler | |||
# python search_bing_api.py --query "john hammond jurassic park" --output dataset/john_hammond | |||
# python search_bing_api.py --query "owen grady jurassic world" --output dataset/owen_grady | |||
# python search_bing_api.py --query "claire dearing jurassic world" --output dataset/claire_dearing | |||
# import the necessary packages | |||
from requests import exceptions | |||
import argparse | |||
import requests | |||
import cv2 | |||
import os | |||
# construct the argument parser and parse the arguments | |||
ap = argparse.ArgumentParser() | |||
ap.add_argument("-q", "--query", required=True, | |||
help="search query to search Bing Image API for") | |||
ap.add_argument("-o", "--output", required=True, | |||
help="path to output directory of images") | |||
args = vars(ap.parse_args()) | |||
# set your Microsoft Cognitive Services API key along with (1) the | |||
# maximum number of results for a given search and (2) the group size | |||
# for results (maximum of 50 per request) | |||
API_KEY = "INSERT_YOUR_API_KEY_HERE" | |||
MAX_RESULTS = 100 | |||
GROUP_SIZE = 50 | |||
# set the endpoint API URL | |||
URL = "https://api.cognitive.microsoft.com/bing/v7.0/images/search" | |||
# when attemping to download images from the web both the Python | |||
# programming language and the requests library have a number of | |||
# exceptions that can be thrown so let's build a list of them now | |||
# so we can filter on them | |||
EXCEPTIONS = set([IOError, FileNotFoundError, | |||
exceptions.RequestException, exceptions.HTTPError, | |||
exceptions.ConnectionError, exceptions.Timeout]) | |||
# store the search term in a convenience variable then set the | |||
# headers and search parameters | |||
term = args["query"] | |||
headers = {"Ocp-Apim-Subscription-Key" : API_KEY} | |||
params = {"q": term, "offset": 0, "count": GROUP_SIZE} | |||
# make the search | |||
print("[INFO] searching Bing API for '{}'".format(term)) | |||
search = requests.get(URL, headers=headers, params=params) | |||
search.raise_for_status() | |||
# grab the results from the search, including the total number of | |||
# estimated results returned by the Bing API | |||
results = search.json() | |||
estNumResults = min(results["totalEstimatedMatches"], MAX_RESULTS) | |||
print("[INFO] {} total results for '{}'".format(estNumResults, | |||
term)) | |||
# initialize the total number of images downloaded thus far | |||
total = 0 | |||
# loop over the estimated number of results in `GROUP_SIZE` groups | |||
for offset in range(0, estNumResults, GROUP_SIZE): | |||
# update the search parameters using the current offset, then | |||
# make the request to fetch the results | |||
print("[INFO] making request for group {}-{} of {}...".format( | |||
offset, offset + GROUP_SIZE, estNumResults)) | |||
params["offset"] = offset | |||
search = requests.get(URL, headers=headers, params=params) | |||
search.raise_for_status() | |||
results = search.json() | |||
print("[INFO] saving images for group {}-{} of {}...".format( | |||
offset, offset + GROUP_SIZE, estNumResults)) | |||
# loop over the results | |||
for v in results["value"]: | |||
# try to download the image | |||
try: | |||
# make a request to download the image | |||
print("[INFO] fetching: {}".format(v["contentUrl"])) | |||
r = requests.get(v["contentUrl"], timeout=30) | |||
# build the path to the output image | |||
ext = v["contentUrl"][v["contentUrl"].rfind("."):] | |||
p = os.path.sep.join([args["output"], "{}{}".format( | |||
str(total).zfill(8), ext)]) | |||
# write the image to disk | |||
f = open(p, "wb") | |||
f.write(r.content) | |||
f.close() | |||
# catch any errors that would not unable us to download the | |||
# image | |||
except Exception as e: | |||
# check to see if our exception is in our list of | |||
# exceptions to check for | |||
if type(e) in EXCEPTIONS: | |||
print("[INFO] skipping: {}".format(v["contentUrl"])) | |||
continue | |||
# try to load the image from disk | |||
image = cv2.imread(p) | |||
# if the image is `None` then we could not properly load the | |||
# image from disk (so it should be ignored) | |||
if image is None: | |||
print("[INFO] deleting: {}".format(p)) | |||
os.remove(p) | |||
continue | |||
# update the counter | |||
total += 1 |