import numpy as np from PIL import Image from transformers import pipeline _router = None def init_router(): global _router if _router is None: _router = pipeline("image-classification", model="Matthijs/mobilevit-small") def detect_modality(image_path: str) -> str: """Hybrid modality detection: filename hints + visual + lightweight model""" name = image_path.lower() # 1️⃣ تحليل الاسم if any(k in name for k in ["xray", "chest", "lung"]): return "xray" if any(k in name for k in ["ct", "abdomen", "liver"]): return "ct" if any(k in name for k in ["ultrasound", "us", "sonogram"]): return "ultrasound" if any(k in name for k in ["mri", "brain", "spine"]): return "mri" if any(k in name for k in ["histopath", "slide", "micro"]): return "pathology" if any(k in name for k in ["skin", "derma"]): return "skin" if any(k in name for k in ["eye", "retina", "fundus"]): return "eye" if any(k in name for k in ["cardio", "echo", "heart"]): return "cardio" if any(k in name for k in ["msk", "musculoskeletal", "orthopedic"]): return "musculoskeletal" # 2️⃣ تحليل بصري بسيط with Image.open(image_path).convert("RGB") as img: arr = np.array(img) mean_sat = np.std(arr, axis=(0, 1)).mean() if mean_sat < 15: return "xray" elif mean_sat < 25: return "mri" elif mean_sat > 45: return "skin" # 3️⃣ نموذج صغير fallback if _router is None: init_router() pred = _router(image_path)[0]["label"].lower() valid = { "xray", "ct", "ultrasound", "mri", "pathology", "skin", "eye", "cardio", "musculoskeletal", } return "general" if pred not in valid else pred