import os import sys from PIL import Image from tqdm import tqdm import warnings sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from models.detection_models import align # Assuming this is available in your project def extract_and_save_faces(input_dir, output_dir, algorithm='yolo', resolution=224): """Preprocess images using face alignment and cache them with specified resolution.""" if align is None: raise ImportError("face_alignment package is required for preprocessing.") os.makedirs(output_dir, exist_ok=True) with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=FutureWarning, message=".*rcond.*") for person in sorted(os.listdir(input_dir)): person_path = os.path.join(input_dir, person) if not os.path.isdir(person_path): continue output_person_path = os.path.join(output_dir, person) os.makedirs(output_person_path, exist_ok=True) skipped_count = 0 for img_name in tqdm(os.listdir(person_path), desc=f"Processing {person}"): if not img_name.endswith(('.jpg', '.jpeg', '.png')): continue img_path = os.path.join(person_path, img_name) output_img_path = os.path.join(output_person_path, img_name) if os.path.exists(output_img_path): skipped_count += 1 continue try: aligned_result = align.get_aligned_face([img_path], algorithm=algorithm) aligned_image = aligned_result[0][1] if aligned_result and len(aligned_result) > 0 else None if aligned_image is None: print(f"Face detection failed for {img_path}, using resized original image") aligned_image = Image.open(img_path).convert('RGB') aligned_image = aligned_image.resize((resolution, resolution), Image.Resampling.LANCZOS) aligned_image.save(output_img_path, quality=100) except Exception as e: print(f"Error processing {img_path}: {e}") aligned_image = Image.open(img_path).convert('RGB') aligned_image = aligned_image.resize((resolution, resolution), Image.Resampling.LANCZOS) aligned_image.save(output_img_path, quality=100) if skipped_count > 0: print(f"Skipped {skipped_count} images for {person} that were already processed.") if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Preprocess and cache images with face alignment.") parser.add_argument('--input_dir', type=str, required=True, help='Directory containing raw images.') parser.add_argument('--output_dir', type=str, required=True, help='Directory to save preprocessed images.') parser.add_argument('--algorithm', type=str, default='yolo', choices=['yolo', 'dlib'], help='Face detection algorithm to use.') parser.add_argument('--resolution', type=int, default=224, help='Resolution for the output images.') args = parser.parse_args() extract_and_save_faces(args.input_dir, args.output_dir, args.algorithm, args.resolution) # python src/slimface/data/preprocess.py \ # --input_dir "data/raw/Original Images/Original Images" \ # --output_dir "data/processed/Aligned Images" \ # --algorithm "yolo" \ # --resolution 224