File size: 4,095 Bytes
f2bcbc8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
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.",
examples=[
["example1.jpg", "example2.jpg", 0.5, 0.5, 1]
]
)
interface.launch()
|