|
|
import gradio as gr |
|
|
import torch |
|
|
import torch.nn as nn |
|
|
from torchvision.transforms import ToPILImage |
|
|
import numpy as np |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
latent_size = 128 |
|
|
stats = (0.5, 0.5, 0.5), (0.5, 0.5, 0.5) |
|
|
|
|
|
|
|
|
generator = nn.Sequential( |
|
|
|
|
|
nn.ConvTranspose2d(latent_size, 512, kernel_size=4, stride=1, padding=0, bias=False), |
|
|
nn.BatchNorm2d(512), |
|
|
nn.ReLU(True), |
|
|
|
|
|
|
|
|
nn.ConvTranspose2d(512, 256, kernel_size=4, stride=2, padding=1, bias=False), |
|
|
nn.BatchNorm2d(256), |
|
|
nn.ReLU(True), |
|
|
|
|
|
|
|
|
nn.ConvTranspose2d(256, 128, kernel_size=4, stride=2, padding=1, bias=False), |
|
|
nn.BatchNorm2d(128), |
|
|
nn.ReLU(True), |
|
|
|
|
|
|
|
|
nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1, bias=False), |
|
|
nn.BatchNorm2d(64), |
|
|
nn.ReLU(True), |
|
|
|
|
|
|
|
|
nn.ConvTranspose2d(64, 3, kernel_size=4, stride=2, padding=1, bias=False), |
|
|
nn.Tanh() |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
device = torch.device("cpu") |
|
|
|
|
|
|
|
|
generator.to(device) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MODEL_PATH = 'G.ckpt' |
|
|
try: |
|
|
generator.load_state_dict(torch.load(MODEL_PATH, map_location=device)) |
|
|
print(f"'{MODEL_PATH}' dosyasından model ağırlıkları başarıyla yüklendi.") |
|
|
except FileNotFoundError: |
|
|
print(f"UYARI: '{MODEL_PATH}' dosyası bulunamadı. Model rastgele ağırlıklarla çalışacak.") |
|
|
|
|
|
except Exception as e: |
|
|
print(f"Model yüklenirken bir hata oluştu: {e}") |
|
|
|
|
|
|
|
|
generator.eval() |
|
|
|
|
|
|
|
|
|
|
|
def denorm(img_tensors): |
|
|
"""Görüntü tensor'ünü [-1, 1] aralığından [0, 1] aralığına geri dönüştürür.""" |
|
|
return img_tensors * stats[1][0] + stats[0][0] |
|
|
|
|
|
def generate_image(seed): |
|
|
""" |
|
|
Verilen bir seed'e göre rastgele gürültüden bir anime karakteri üretir. |
|
|
""" |
|
|
|
|
|
|
|
|
if seed: |
|
|
torch.manual_seed(int(seed)) |
|
|
|
|
|
|
|
|
noise = torch.randn(1, latent_size, 1, 1, device=device) |
|
|
|
|
|
|
|
|
with torch.no_grad(): |
|
|
|
|
|
fake_image_tensor = generator(noise) |
|
|
|
|
|
|
|
|
|
|
|
denormalized_tensor = denorm(fake_image_tensor) |
|
|
|
|
|
|
|
|
pil_image = ToPILImage()(denormalized_tensor.squeeze(0)) |
|
|
|
|
|
return pil_image |
|
|
|
|
|
|
|
|
title = "Anime Karakter Üretici (PyTorch GAN)" |
|
|
description = """ |
|
|
Bu demo, bir GAN (Generative Adversarial Network) kullanarak rastgele anime karakter portreleri üretir. |
|
|
Model, Kaggle'daki bir anime karakter veri seti ile eğitilmiştir. |
|
|
Farklı karakterler görmek için aşağıdaki 'Seed' değerini değiştirin veya 'Rastgele Seed' düğmesine basarak rastgele bir değerle üretin. |
|
|
""" |
|
|
article = "<p style='text-align: center;'><a href='https://www.kaggle.com/code/melissamonfared/anime-character-generation-dsgan-gan' target='_blank'>Eğitim için kullanılan Kaggle Notebook'u</a></p>" |
|
|
|
|
|
iface = gr.Interface( |
|
|
fn=generate_image, |
|
|
inputs=gr.Number(label="Seed (Rastgelelik için başlangıç değeri)", value=1234), |
|
|
outputs=gr.Image(type="pil", label="Üretilen Karakter"), |
|
|
title=title, |
|
|
description=description, |
|
|
article=article, |
|
|
examples=[ |
|
|
[42], |
|
|
[1337], |
|
|
[2024] |
|
|
] |
|
|
) |
|
|
|
|
|
|
|
|
iface.launch() |