demo-app / app.py
stable-diffusion
Update app.py
9a1cb81 verified
Raw History Blame Contribute Delete
2.99 kB
import streamlit as st
import torch
from torchvision.utils import save_image
import matplotlib.pyplot as plt
from PIL import Image
import io
# Importa il modello del generatore
class EfficientGenerator(torch.nn.Module):
def __init__(self, latent_dim):
super(EfficientGenerator, self).__init__()
self.init_size = 64 // 16
self.l1 = torch.nn.Sequential(torch.nn.Linear(latent_dim, 128 * self.init_size ** 2))
self.conv_blocks = torch.nn.Sequential(
torch.nn.BatchNorm2d(128),
torch.nn.Upsample(scale_factor=2),
torch.nn.Conv2d(128, 128, 3, stride=1, padding=1),
torch.nn.BatchNorm2d(128, 0.8),
torch.nn.ReLU(inplace=True),
torch.nn.Upsample(scale_factor=2),
torch.nn.Conv2d(128, 64, 3, stride=1, padding=1),
torch.nn.BatchNorm2d(64, 0.8),
torch.nn.ReLU(inplace=True),
torch.nn.Upsample(scale_factor=2),
torch.nn.Conv2d(64, 32, 3, stride=1, padding=1),
torch.nn.BatchNorm2d(32, 0.8),
torch.nn.ReLU(inplace=True),
torch.nn.Upsample(scale_factor=2),
torch.nn.Conv2d(32, 3, 3, stride=1, padding=1),
torch.nn.Tanh(),
)
def forward(self, z):
out = self.l1(z)
out = out.view(out.shape[0], 128, self.init_size, self.init_size)
img = self.conv_blocks(out)
return img
# Carica il modello salvato
def load_model(model_path):
latent_dim = 32
model = EfficientGenerator(latent_dim)
checkpoint = torch.load(model_path, map_location=torch.device('cpu'))
model.load_state_dict(checkpoint['generator_state_dict'])
model.eval()
return model
# Funzione per generare un'immagine
def generate_image(model):
latent_dim = 32
z = torch.randn(1, latent_dim)
with torch.no_grad():
gen_img = model(z).detach().cpu()
img = gen_img.squeeze(0).permute(1, 2, 0)
img = (img + 1) / 2 # Denormalizza
return img
# Interfaccia Streamlit
st.title("Generazione di Immagini GAN")
st.write("Carica un modello GAN addestrato per generare immagini di gatti.")
uploaded_model = st.file_uploader("Carica il modello", type=["pth"])
if uploaded_model is not None:
# Carica il modello dal file caricato
with open("temp_model.pth", "wb") as f:
f.write(uploaded_model.getbuffer())
model = load_model("temp_model.pth")
st.write("Modello caricato correttamente!")
if st.button("Genera Immagine"):
img = generate_image(model)
fig, ax = plt.subplots()
ax.imshow(img)
ax.axis("off")
st.pyplot(fig)
# Salva l'immagine generata
buffer = io.BytesIO()
save_image(img.permute(2, 0, 1), buffer, format="PNG", normalize=True)
st.download_button(
label="Scarica Immagine",
data=buffer.getvalue(),
file_name="generated_image.png",
mime="image/png"
)