File size: 2,702 Bytes
5f5ed57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
66
67
68
69
70
71
72
73
74
75
76
77
import torch
from torchvision import transforms
from PIL import Image, ImageStat
import gradio as gr
import numpy as np

# Carica il tuo modello pre-addestrato (aggiorna il percorso del modello come necessario)
model = torch.load('model_v11.pt', map_location=torch.device('cpu'))
model.eval()

# Funzione per loggare i colori dell'immagine
def log_image_color_stats(image):
    stat = ImageStat.Stat(image)
    mean_rgb = stat.mean
    print(f"Color Stats - R: {mean_rgb[0] / 255.0}, G: {mean_rgb[1] / 255.0}, B: {mean_rgb[2] / 255.0}")

# Funzione per loggare i dati del tensore
def log_tensor_data(tensor):
    print(f"Tensor shape: {tensor.shape}")
    print(f"Tensor data (first 10 values): {tensor.flatten()[:10]}")

# Preprocessing per l'immagine con normalizzazione
preprocess = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# Preprocessing senza normalizzazione (separato)
preprocess_without_normalize = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor()
])

# Funzione di previsione
def classify_image(image):
    # Logga i colori dell'immagine originale
    log_image_color_stats(image)
    
    # Ridimensiona l'immagine per coerenza
    img_resized = image.resize((224, 224))
    print(f"Resized Bitmap dimensions: {img_resized.size}")

    # Preprocessa e ottieni il tensore non normalizzato
    img_tensor_no_normalize = preprocess_without_normalize(image).unsqueeze(0)
    print("Tensor data before normalization:")
    log_tensor_data(img_tensor_no_normalize)
    
    # Preprocessa e normalizza
    img_tensor = preprocess(image).unsqueeze(0)
    log_tensor_data(img_tensor)

    # Esegui la previsione
    with torch.no_grad():
        output = model(img_tensor)
        
        # Logga i punteggi raw
        print(f"Raw output scores: {output}")

        # Calcola le probabilità
        probabilities = torch.softmax(output, dim=1)

        # Estrai le probabilità e l'indice della classe prevista
        predicted_class_index = probabilities.argmax()
        predicted_probability = probabilities[0][predicted_class_index]
        
        # Logga le probabilità di ciascuna classe
        print("Probabilities for each class:")
        for index, prob in enumerate(probabilities[0]):
            print(f"Class {index}: {prob.item():.4f}")

    # Restituisci l'indice della classe e la probabilità come output
    return f"Predicted class index: {predicted_class_index.item()}, Probability: {predicted_probability.item():.4f}"

# Interfaccia Gradio
gr.Interface(fn=classify_image, inputs="image", outputs="text").launch()