import os import time from datetime import datetime, timezone, timedelta import spaces import torch import gradio as gr from utils import preprocess_img, preprocess_img_from_path, postprocess_img from vgg19 import VGG_19 from inference import inference if torch.cuda.is_available(): device = 'cuda' elif torch.backends.mps.is_available(): device = 'mps' else: device = 'cpu' print('DEVICE:', device) if device == 'cuda': print('CUDA DEVICE:', torch.cuda.get_device_name()) model = VGG_19().to(device).eval() for param in model.parameters(): param.requires_grad = False style_files = os.listdir('./style_images') style_options = {' '.join(style_file.split('.')[0].split('_')): f'./style_images/{style_file}' for style_file in style_files} cached_style_features = {} for style_name, style_img_path in style_options.items(): style_img_512 = preprocess_img_from_path(style_img_path, 512)[0].to(device) style_img_1024 = preprocess_img_from_path(style_img_path, 1024)[0].to(device) with torch.no_grad(): style_features = (model(style_img_512), model(style_img_1024)) cached_style_features[style_name] = style_features @spaces.GPU(duration=15) def run(content_image, style_name, style_strength, output_quality, progress=gr.Progress(track_tqdm=True)): yield None img_size = 1024 if output_quality else 512 content_img, original_size = preprocess_img(content_image, img_size) content_img = content_img.to(device) print('-'*15) print('DATETIME:', datetime.now(timezone.utc) - timedelta(hours=4)) # est print('STYLE:', style_name) print('CONTENT IMG SIZE:', original_size) print('STYLE STRENGTH:', style_strength) print('HIGH QUALITY:', output_quality) style_features = cached_style_features[style_name][0 if img_size == 512 else 1] converted_lr = 0.001 + (0.009 / 99) * (style_strength - 1) # [0.001, 0.01] st = time.time() generated_img = inference( model=model, content_image=content_img, style_features=style_features, lr=converted_lr ) et = time.time() print('TIME TAKEN:', et-st) yield postprocess_img(generated_img, original_size) def set_slider(value): return gr.update(value=value) css = """ #container { margin: 0 auto; max-width: 550px; } """ with gr.Blocks(css=css) as demo: gr.HTML("