NeurArch / app.py
giulio678's picture
Update app.py
dfc6ae4 verified
raw
history blame
1.99 kB
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