Spaces:
Sleeping
Sleeping
| # This program is designed to auto crop the face on a given image | |
| # It is required to change the image into gray format to satisfy the pre-trained model requirement | |
| import cv2 | |
| import numpy as np | |
| import os | |
| import mediapipe as mp | |
| from mediapipe.tasks import python | |
| from mediapipe.tasks.python import vision | |
| import cv2 | |
| from pathlib import Path | |
| # auto crop the image in the given dir | |
| base_options = python.BaseOptions(model_asset_path='blaze_face_short_range.tflite') | |
| options = vision.FaceDetectorOptions(base_options=base_options) | |
| detector = vision.FaceDetector.create_from_options(options) | |
| def crop( | |
| image, | |
| detection_result | |
| ) -> np.ndarray : | |
| annotated_image = image.copy() | |
| height, width, _ = image.shape | |
| # Here assume we only detect one face | |
| for detection in detection_result.detections: | |
| # Crop detected face | |
| bbox = detection.bounding_box | |
| cropped_img = image[bbox.origin_y - 90: bbox.origin_y + bbox.height + 30, bbox.origin_x - 80:bbox.origin_x + bbox.width + 35] | |
| return cropped_img | |
| def auto_cropping(dir): | |
| files = os.listdir(dir) # list of files in directory | |
| for file in files: | |
| file_dir = Path(dir + "/" + file) | |
| abs_path = file_dir.resolve() | |
| img = mp.Image.create_from_file(str(abs_path)) | |
| detection_result = detector.detect(img) | |
| save_path = 'saved' | |
| image_copy = np.copy(img.numpy_view()) | |
| annotated_image = crop(image_copy, detection_result) | |
| rgb_annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB) | |
| return rgb_annotated_image | |
| # auto_cropping("image") # <----------- !!!!change address here!!!! ------------------> # | |
| # The current problem (6/2/2023) is that the model may recognize some cartoon face as human face, | |
| # my idea is to use another model to classify if the cropped image is real human face |