| 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() |
| |
| 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" |
|
|
| |
| 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" |
|
|
| |
| 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 |
|
|