Spaces:
Sleeping
Sleeping
import gradio as gr | |
import torch | |
import torch.optim as optim | |
import torchvision.models as models | |
import torchvision.transforms as transforms | |
from PIL import Image | |
import numpy as np | |
import requests | |
from io import BytesIO | |
#Load VGG19 model | |
vgg = models.vgg19(pretrained=True).features | |
for param in vgg.parameters(): | |
param.requires_grad_(False) | |
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
vgg.to(device) | |
# Helper functions (load_image, im_convert, get_features, gram_matrix) | |
# ... (Include the helper functions you provided earlier here) | |
def style_transfer(content_image, style_image, alpha, beta, conv1_1, conv2_1, conv3_1, conv4_1, conv5_1, steps): | |
content = load_image(content_image).to(device) | |
style = load_image(style_image, shape=content.shape[-2:]).to(device) | |
content_features = get_features(content, vgg) | |
style_features = get_features(style, vgg) | |
style_grams = {layer: gram_matrix(style_features[layer]) for layer in style_features} | |
target = content.clone().requires_grad_(True).to(device) | |
style_weights = { | |
'conv1_1': conv1_1, | |
'conv2_1': conv2_1, | |
'conv3_1': conv3_1, | |
'conv4_1': conv4_1, | |
'conv5_1': conv5_1 | |
} | |
content_weight = alpha | |
style_weight = beta * 1e6 | |
optimizer = optim.Adam([target], lr=0.003) | |
for ii in range(1, steps+1): | |
target_features = get_features(target, vgg) | |
content_loss = torch.mean((target_features['conv4_2'] - content_features['conv4_2'])**2) | |
style_loss = 0 | |
for layer in style_weights: | |
target_feature = target_features[layer] | |
target_gram = gram_matrix(target_feature) | |
_, d, h, w = target_feature.shape | |
style_gram = style_grams[layer] | |
layer_style_loss = style_weights[layer] * torch.mean((target_gram - style_gram)**2) | |
style_loss += layer_style_loss / (d * h * w) | |
total_loss = content_weight * content_loss + style_weight * style_loss | |
optimizer.zero_grad() | |
total_loss.backward() | |
optimizer.step() | |
return im_convert(target) | |
# Example images | |
examples = [ | |
["path/to/content1.jpg", "path/to/style1.jpg"], | |
["path/to/content2.jpg", "path/to/style2.jpg"], | |
["path/to/content3.jpg", "path/to/style3.jpg"], | |
] | |
# Gradio interface | |
with gr.Blocks() as demo: | |
gr.Markdown("# Neural Style Transfer") | |
with gr.Row(): | |
with gr.Column(): | |
content_input = gr.Image(label="Content Image") | |
style_input = gr.Image(label="Style Image") | |
with gr.Column(): | |
output_image = gr.Image(label="Output Image") | |
with gr.Row(): | |
alpha_slider = gr.Slider(minimum=0, maximum=1, value=1, step=0.1, label="Content Weight (α)") | |
beta_slider = gr.Slider(minimum=0, maximum=1, value=0.1, step=0.1, label="Style Weight (β)") | |
with gr.Row(): | |
conv1_1_slider = gr.Slider(minimum=0, maximum=1, value=1, step=0.1, label="Conv1_1 Weight") | |
conv2_1_slider = gr.Slider(minimum=0, maximum=1, value=0.8, step=0.1, label="Conv2_1 Weight") | |
conv3_1_slider = gr.Slider(minimum=0, maximum=1, value=0.5, step=0.1, label="Conv3_1 Weight") | |
conv4_1_slider = gr.Slider(minimum=0, maximum=1, value=0.3, step=0.1, label="Conv4_1 Weight") | |
conv5_1_slider = gr.Slider(minimum=0, maximum=1, value=0.1, step=0.1, label="Conv5_1 Weight") | |
steps_slider = gr.Slider(minimum=100, maximum=2000, value=1000, step=100, label="Number of Steps") | |
run_button = gr.Button("Run Style Transfer") | |
run_button.click( | |
style_transfer, | |
inputs=[ | |
content_input, | |
style_input, | |
alpha_slider, | |
beta_slider, | |
conv1_1_slider, | |
conv2_1_slider, | |
conv3_1_slider, | |
conv4_1_slider, | |
conv5_1_slider, | |
steps_slider | |
], | |
outputs=output_image | |
) | |
gr.Examples( | |
examples, | |
inputs=[content_input, style_input] | |
) | |
demo.launch() |