import os BASE_DIR = os.path.dirname(os.path.abspath(__file__)) MODEL_DIR = os.path.join(BASE_DIR, "saved_models") META_DIR = os.path.join(BASE_DIR, "saved_models_meta") FIGURE_DIR = os.path.join(BASE_DIR, "saved_figures") os.makedirs(MODEL_DIR, exist_ok=True) os.makedirs(META_DIR, exist_ok=True) os.makedirs(FIGURE_DIR, exist_ok=True) HF_DATASET_REPO = os.environ.get("HF_DATASET_REPO", "CircleStar/charcoal-microscopy") HF_TOKEN = os.environ.get("HF_TOKEN") def _sanitize_session_id(session_id: str) -> str: """Un session_hash Gradio est déjà un identifiant sûr, mais on filtre par prudence pour ne jamais laisser un caractère de traversée de chemin (../) atteindre os.path.join.""" safe = "".join(c for c in (session_id or "") if c.isalnum() or c in "-_") return safe or "default" def session_model_dir(session_id: str) -> str: """Répertoire des poids/pipelines pour UNE session de navigateur — isole les modèles entraînés par un·e étudiant·e de ceux des autres, qui partagent pourtant le même Space Gradio.""" d = os.path.join(MODEL_DIR, _sanitize_session_id(session_id)) os.makedirs(d, exist_ok=True) return d def session_meta_dir(session_id: str) -> str: d = os.path.join(META_DIR, _sanitize_session_id(session_id)) os.makedirs(d, exist_ok=True) return d IMAGE_SIZE = 224 RANDOM_SEED = 42 DATASET_DISPLAY_NAME = "Images microscopiques de charbons de bois" CLASSICAL_MODEL_TYPES = frozenset({"svm", "logreg", "knn", "rf"}) CV_FOLDS = 3