rmayormartins's picture
Subindo arquivos7
f1a8bf6
import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image
import numpy as np
import gradio as gr
import tensorflow as tf
import tensorflow_hub as hub
import cv2
# Conf
IMAGE_SIZE = (256, 256)
style_transfer_model = hub.load('https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2')
# (VGG19)
vgg = models.vgg19(weights=models.VGG19_Weights.IMAGENET1K_V1).features
vgg.eval()
#
def load_image_pytorch(image, transform=None):
if transform:
image = transform(image).unsqueeze(0)
return image
#
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# Deep Dreaming
def deep_dream(model, image, iterations, lr):
for i in range(iterations):
image.requires_grad = True
features = model(image)
loss = features.norm()
loss.backward()
with torch.no_grad():
image += lr * image.grad
image = image.clamp(0, 1)
image.grad = None
return image
#
def load_image_tensorflow(image):
image = cv2.resize(image, IMAGE_SIZE, interpolation=cv2.INTER_AREA)
image = image.astype(np.float32)[np.newaxis, ...] / 255.
if image.shape[-1] == 4:
image = image[..., :3]
return image
#
def apply_sharpness(image, intensity):
kernel = np.array([[0, -intensity, 0],
[-intensity, 1 + 4 * intensity, -intensity],
[0, -intensity, 0]])
sharp_image = cv2.filter2D(image, -1, kernel)
return np.clip(sharp_image, 0, 255)
#
def interpolate_images(baseline, target, alpha):
return baseline + alpha * (target - baseline)
# + Deep Dreaming e Transferência de Estilo
def combine_images(image1, image2, weight1, style_density, content_sharpness):
# Carregar e pré-processar as imagens
image1_pil = Image.fromarray(image1)
image2_pil = Image.fromarray(image2)
image1_pytorch = load_image_pytorch(image1_pil, transform)
image2_pytorch = load_image_pytorch(image2_pil, transform)
#
weight2 = 1 - weight1
mixed_image_pytorch = weight1 * image1_pytorch + weight2 * image2_pytorch
# Deep Dreaming
mixed_image_pytorch = deep_dream(vgg, mixed_image_pytorch, iterations=20, lr=0.01)
#
mixed_image_pytorch = mixed_image_pytorch.squeeze(0).permute(1, 2, 0).detach().numpy()
mixed_image_pytorch = (mixed_image_pytorch * 255).astype(np.uint8)
#
content_image = load_image_tensorflow(mixed_image_pytorch)
style_image = load_image_tensorflow(image2)
#
content_image_sharp = apply_sharpness(content_image[0], intensity=content_sharpness)
content_image_sharp = content_image_sharp[np.newaxis, ...]
# Transferência de Estilo
stylized_image = style_transfer_model(tf.constant(content_image_sharp), tf.constant(style_image))[0]
#
stylized_image = interpolate_images(baseline=content_image[0], target=stylized_image.numpy(), alpha=style_density)
stylized_image = np.array(stylized_image * 255, np.uint8)
stylized_image = np.squeeze(stylized_image)
return stylized_image
#
example1 = np.array(Image.open("example1.jpg"))
example2 = np.array(Image.open("example2.jpg"))
# Gradio
interface = gr.Interface(
fn=combine_images,
inputs=[
gr.Image(type="numpy", label="Imagem 1"),
gr.Image(type="numpy", label="Imagem 2"),
gr.Slider(minimum=0, maximum=1, value=0.5, label="Peso da Imagem 1"),
gr.Slider(minimum=0, maximum=1, value=0.5, label="Densidade do Estilo"),
gr.Slider(minimum=0, maximum=10, value=1, label="Nitidez do Conteúdo")
],
outputs="image",
title="Combinação de Imagens com Deep Dreaming e Transferência de Estilo",
description="Ajuste os pesos e a densidade do estilo para combinar e estilizar as imagens. *v1.0 experimental 07/07/2024",
examples=[
["example1.jpg", "example2.jpg", 0.5, 0.5, 1]
]
)
interface.launch()