From d3c51749b048d1e271580e6781e95414db63b048 Mon Sep 17 00:00:00 2001 From: pfzpyac3f <344492480@qq.com> Date: Sat, 17 Dec 2022 09:37:07 +0800 Subject: [PATCH] ADD file via upload --- face_detection_cli.py | 72 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 face_detection_cli.py diff --git a/face_detection_cli.py b/face_detection_cli.py new file mode 100644 index 0000000..bf7f65e --- /dev/null +++ b/face_detection_cli.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +from __future__ import print_function +import click +import os +import re +import face_recognition.api as face_recognition +import multiprocessing +import sys +import itertools + + +def print_result(filename, location): + top, right, bottom, left = location + print("{},{},{},{},{}".format(filename, top, right, bottom, left)) + + +def test_image(image_to_check, model, upsample): + unknown_image = face_recognition.load_image_file(image_to_check) + face_locations = face_recognition.face_locations(unknown_image, number_of_times_to_upsample=upsample, model=model) + + for face_location in face_locations: + print_result(image_to_check, face_location) + + +def image_files_in_folder(folder): + return [os.path.join(folder, f) for f in os.listdir(folder) if re.match(r'.*\.(jpg|jpeg|png)', f, flags=re.I)] + + +def process_images_in_process_pool(images_to_check, number_of_cpus, model, upsample): + if number_of_cpus == -1: + processes = None + else: + processes = number_of_cpus + + # macOS will crash due to a bug in libdispatch if you don't use 'forkserver' + context = multiprocessing + if "forkserver" in multiprocessing.get_all_start_methods(): + context = multiprocessing.get_context("forkserver") + + pool = context.Pool(processes=processes) + + function_parameters = zip( + images_to_check, + itertools.repeat(model), + itertools.repeat(upsample), + ) + + pool.starmap(test_image, function_parameters) + + +@click.command() +@click.argument('image_to_check') +@click.option('--cpus', default=1, help='number of CPU cores to use in parallel. -1 means "use all in system"') +@click.option('--model', default="hog", help='Which face detection model to use. Options are "hog" or "cnn".') +@click.option('--upsample', default=0, help='How many times to upsample the image looking for faces. Higher numbers find smaller faces.') +def main(image_to_check, cpus, model, upsample): + # Multi-core processing only supported on Python 3.4 or greater + if (sys.version_info < (3, 4)) and cpus != 1: + click.echo("WARNING: Multi-processing support requires Python 3.4 or greater. Falling back to single-threaded processing!") + cpus = 1 + + if os.path.isdir(image_to_check): + if cpus == 1: + [test_image(image_file, model, upsample) for image_file in image_files_in_folder(image_to_check)] + else: + process_images_in_process_pool(image_files_in_folder(image_to_check), cpus, model, upsample) + else: + test_image(image_to_check, model, upsample) + + +if __name__ == "__main__": + main()