Spaces:
Sleeping
Sleeping
| import cv2 | |
| import os | |
| import numpy as np | |
| from keras.models import load_model | |
| BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
| MODEL_PATH = os.path.join(BASE_DIR, 'data', 'model', 'medical-image-classification.h5') | |
| IMAGE_SIZE = (224, 224) | |
| CLASS_MAP = { | |
| 'Tubercolosi': '⚠️ Rischio Tubercolosi', | |
| 'No_Tubercolosi': '✅ Negativo per Tubercolosi', | |
| 'Pneumonia': '⚠️ Rischio Polmonite', | |
| 'No_Pneumonia': '✅ Negativo per Polmonite', | |
| 'No_immagine' : '⚠️ Nessuna immagine caricata' | |
| } | |
| RAW_CLASSES = ['Tubercolosi', 'No_Tubercolosi', 'Pneumonia', 'No_Pneumonia'] | |
| # Caricamento Singleton (lo carichiamo una volta sola) | |
| model = None | |
| def load_resources(): | |
| global model | |
| if model is None and os.path.exists(MODEL_PATH): | |
| try: | |
| print(f"Caricamento modello X-Ray da {MODEL_PATH}...") | |
| model = load_model(MODEL_PATH, compile=False) | |
| print("✅ Modello X-Ray caricato.") | |
| except Exception as e: | |
| print(f"❌ Errore caricamento modello X-Ray: {e}") | |
| def image_classification(image_array): | |
| """ | |
| Analizza un'immagine radiografica (numpy array) e restituisce le probabilità. | |
| """ | |
| global model | |
| if model is None: | |
| load_resources() | |
| if model is None: | |
| return {"Errore": "Modello non disponibile (Verifica il percorso file)"} | |
| if image_array is None: | |
| response = {} | |
| user_label = CLASS_MAP.get('No_immagine', 'No_immagine') | |
| response[user_label] = 0.0 | |
| return response | |
| try: | |
| # 1. Preprocessing Immagine | |
| # Resize a 224x224 come richiesto dal modello | |
| img_resized = cv2.resize(image_array, IMAGE_SIZE) | |
| # Normalizzazione / Espansione dimensioni per il batch | |
| img_batch = np.expand_dims(img_resized, axis=0).astype('float32') | |
| # 2. Predizione | |
| predictions = model.predict(img_batch, verbose=0)[0] | |
| # 3. Formattazione Output | |
| response = {} | |
| for i, prob in enumerate(predictions): | |
| raw_label = RAW_CLASSES[i] | |
| user_label = CLASS_MAP.get(raw_label, raw_label) | |
| response[user_label] = float(prob) | |
| return response | |
| except Exception as e: | |
| print(f"Errore durante l'analisi immagine: {e}") | |
| return {"Errore di Analisi": 0.0} |