NeurArch / app.py
giulio678's picture
Update app.py
0708546 verified
import torch
import torch.nn as nn
from torchvision import models, transforms
from PIL import Image
import numpy as np
import gradio as gr
# Definizione del modello pre-addestrato
class PretrainedModel(nn.Module):
def __init__(self, num_classes=19):
super(PretrainedModel, self).__init__()
weights = models.ResNet50_Weights.IMAGENET1K_V2
self.model = models.resnet50(weights=weights)
# Congela i layer iniziali
for param in self.model.parameters():
param.requires_grad = False
# Sostituisci l'ultimo layer
num_features = self.model.fc.in_features
self.model.fc = nn.Linear(num_features, num_classes)
def forward(self, x):
return self.model(x)
# Crea un'istanza del modello
model = PretrainedModel(num_classes=19)
# Carica i pesi con `weights_only=True` per evitare problemi di sicurezza
state_dict = torch.load('model_v11.pt', map_location=torch.device('cpu'))
model.load_state_dict(state_dict)
model.eval() # Imposta il modello in modalità valutazione
# Trasformazioni per l'immagine
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])
])
def classify_image(img):
# Preprocessa l'immagine
img_tensor = preprocess(img).unsqueeze(0) # Aggiunge una dimensione per il batch
with torch.no_grad():
output = model(img_tensor)
probabilities = torch.softmax(output, dim=1)
predicted_class_index = probabilities.argmax().item()
predicted_probability = probabilities[0][predicted_class_index].item()
return f"Class {predicted_class_index}, Confidence: {predicted_probability:.4f}"
# Configura Gradio per l'accesso pubblico
iface = gr.Interface(
fn=classify_image,
inputs=gr.Image(type="pil"),
outputs="text"
)
iface.launch(share=True) # Abilita l'accesso pubblico e la coda