| @ -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 | |||