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}