import os import json import glob import multiprocessing import argparse import os.path import shutil import cv2 import mediapipe as mp from tqdm.auto import tqdm from joblib import Parallel, delayed import numpy as np import gc import warnings import hashlib from contextlib import contextmanager from typing import Optional import joblib from video_preprocess import PreprocessConfig, apply_darken_then_brighten # MediaPipe FaceMesh landmark indices (subset) for eyebrows. # These are commonly used indices for left/right eyebrows. _EYEBROW_IDXS = [ # left eyebrow 70, 63, 105, 66, 107, 55, 65, 52, 53, 46, # right eyebrow 336, 296, 334, 293, 300, 276, 283, 282, 295, 285, ] @contextmanager def tqdm_joblib(tqdm_object): """Context manager to patch joblib so tqdm reports completed tasks (not just dispatched).""" class TqdmBatchCompletionCallback(joblib.parallel.BatchCompletionCallBack): def __call__(self, *args, **kwargs): tqdm_object.update(n=self.batch_size) return super().__call__(*args, **kwargs) old_callback = joblib.parallel.BatchCompletionCallBack joblib.parallel.BatchCompletionCallBack = TqdmBatchCompletionCallback try: yield tqdm_object finally: joblib.parallel.BatchCompletionCallBack = old_callback tqdm_object.close() def _label_from_path(path: str) -> str: # Assumes dataset layout: /