File size: 2,311 Bytes
2ff9250
3a24a7b
2ff9250
3a24a7b
 
 
 
2ff9250
 
3a24a7b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96bc481
 
 
3a24a7b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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}