import torch import torch.nn as nn import torchvision.transforms as transforms from PIL import Image import gradio as gr from torchvision.utils import save_image # ================================================ # FAST NEURAL STYLE MODEL (AdaIN) - Pytorch Hub # ================================================ # Tutaj pobieramy model z PyTorch Hub (dynamic style transfer) # Uwaga: model pobiera content + style image model = torch.hub.load('pytorch/examples', 'fast_neural_style', source='github', model='candy') # przykładowy styl model.eval() # ================================================ # UTILS # ================================================ def preprocess(img, size=512): """Konwersja PIL -> Tensor""" transform = transforms.Compose([ transforms.Resize(size), transforms.ToTensor(), transforms.Lambda(lambda x: x.mul(255)) ]) img_t = transform(img).unsqueeze(0) # dodaj batch dim return img_t def postprocess(tensor): """Tensor -> PIL Image""" tensor = tensor.clamp(0, 255).squeeze(0) tensor = tensor / 255 return transforms.ToPILImage()(tensor) # ================================================ # INFERENCE # ================================================ def infer(content_img, style_img): # Preprocess content = preprocess(content_img) style = preprocess(style_img) # Użyj modelu dynamic style transfer with torch.no_grad(): output = model(content, style) # content + style return postprocess(output) # ================================================ # GRADIO INTERFACE # ================================================ title = "🎨 Dynamic Neural Style Transfer" description = "Upload a content image and a style image to apply style transfer dynamically." app = gr.Interface( fn=infer, inputs=[ gr.Image(type="pil", label="Content Image"), gr.Image(type="pil", label="Style Image") ], outputs=gr.Image(label="Stylized Image"), title=title, description=description, allow_flagging="never" ) if __name__ == "__main__": app.launch(server_name="0.0.0.0", server_port=7860, enable_queue=True)