import os import cv2 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', 'retina.h5') IMAGE_SIZE = (224, 224) # Standard per la maggior parte delle CNN (VGG/ResNet) model = None def load_resources(): global model if model is None and os.path.exists(MODEL_PATH): try: print(f"Caricamento modello Retina da {MODEL_PATH}...") model = load_model(MODEL_PATH, compile=False) print("✅ Modello Retina caricato.") except Exception as e: print(f"❌ Errore caricamento modello Retina: {e}") # Caricamento all'avvio load_resources() def predict_diabetic_retinopathy(image_array): # Restituiamo sempre DUE valori (Diagnosi, Percentuale) anche in caso di errore if model is None: return "❌ Errore: Modello non trovato", "0%" if image_array is None: return "⚠️ Nessuna immagine caricata", "0%" try: # 2. PREPROCESSING img_resized = cv2.resize(image_array, IMAGE_SIZE) img_normalized = img_resized.astype('float32') / 255.0 img_batch = np.expand_dims(img_normalized, axis=0) # 3. PREDIZIONE prediction_score = model.predict(img_batch, verbose=0)[0][0] positive_prob = float(prediction_score) # 4. LOGICA DIAGNOSI if positive_prob > 0.5: diagnosis = "⚠️ Presenza Retinopatia Diabetica" else: diagnosis = "✅ Nessuna Retinopatia Diabetica" # 5. FORMATTAZIONE PERCENTUALE percentage = positive_prob * 100 probability = f"{percentage:.2f}%" # Formattazione f-string più pulita return diagnosis, probability except Exception as e: print(f"Errore analisi retina: {e}") return "❌ Errore durante l'analisi", "0%"