import gradio as gr import torch, torchvision from torchvision import transforms import torch.nn.functional as F import numpy as np from time import time, ctime from PIL import Image, ImageColor from diffusers import DDPMPipeline from diffusers import DDIMScheduler from tqdm import tqdm device = ( "mps" if torch.backends.mps.is_available() else "cuda" if torch.cuda.is_available() else "cpu" ) pipeline_name = 'WiNE-iNEFF/Minecraft-Skin-Diffusion' image_pipe = DDPMPipeline.from_pretrained(pipeline_name).to(device) # Set up the scheduler scheduler = DDIMScheduler.from_pretrained(pipeline_name) scheduler.set_timesteps(num_inference_steps=40) def show_images_save(x): """Given a batch of images x, make a grid and convert to PIL""" x = x * 0.5 + 0.5 # Map from (-1, 1) back to (0, 1) grid = torchvision.utils.make_grid(x, nrow=4) grid_im = grid.detach().cpu().permute(1, 2, 0).clip(0, 1) * 255 grid_im = Image.fromarray(np.array(grid_im).astype(np.uint8)) grid_im.save(f"test.png") return grid_im def generate(): x = torch.randn(1, 4, 64, 64).to(device) # Minimal sampling loop for i, t in enumerate(scheduler.timesteps): model_input = scheduler.scale_model_input(x, t) with torch.no_grad(): noise_pred = image_pipe.unet(model_input, t)["sample"] x = scheduler.step(noise_pred, t, x).prev_sample # View the results return show_images_save(x) def ex(): t = time() print(ctime(t)) return generate(), generate(), generate(), generate() demo = gr.Blocks(css="#img_size {max-height: 128px} .container {max-width: 730px; margin: auto;} .min-h-\[15rem\]{min-height: 5rem !important;}") with demo: gr.HTML( """
Gradio demo for Minecraft Skin Diffusion. This is simple Unconditional Diffusion Model that will help you generate skins for game Minecraft.