Spaces:
Running
on
Zero
Running
on
Zero
import gradio as gr | |
import spaces | |
import os | |
import torch | |
import random | |
import uuid | |
from datetime import datetime | |
from diffusers import FluxTransformer2DModel, FluxPipeline, GGUFQuantizationConfig | |
from transformers import T5EncoderModel | |
from PIL import Image | |
import numpy as np | |
# Constants | |
NUM_INFERENCE_STEPS = 8 | |
MAX_SEED = np.iinfo(np.int32).max | |
SAVE_DIR = "saved_images" | |
os.makedirs(SAVE_DIR, exist_ok=True) | |
# Initialize device | |
device = "cuda" if torch.cuda.is_available() else "cpu" | |
huggingface_token = os.getenv("HUGGINGFACE_TOKEN") | |
# Load model | |
dtype = torch.bfloat16 | |
gguf_file_url = "https://huggingface.co/gokaygokay/flux-game/resolve/main/hyperflux_00001_.q8_0.gguf" | |
base_model = "black-forest-labs/FLUX.1-dev" | |
text_encoder_2 = T5EncoderModel.from_pretrained( | |
base_model, | |
subfolder="text_encoder_2", | |
torch_dtype=dtype, | |
token=huggingface_token | |
) | |
transformer = FluxTransformer2DModel.from_single_file( | |
gguf_file_url, | |
quantization_config=GGUFQuantizationConfig(compute_dtype=dtype), | |
torch_dtype=dtype, | |
token=huggingface_token | |
) | |
flux_pipeline = FluxPipeline.from_pretrained( | |
base_model, | |
transformer=transformer, | |
text_encoder_2=text_encoder_2, | |
torch_dtype=dtype, | |
token=huggingface_token | |
).to(device) | |
def generate_flux_image( | |
prompt: str, | |
seed: int, | |
randomize_seed: bool, | |
width: int, | |
height: int, | |
guidance_scale: float, | |
progress: gr.Progress = gr.Progress(track_tqdm=True), | |
) -> Image.Image: | |
"""Generate image using Flux pipeline""" | |
if randomize_seed: | |
seed = random.randint(0, MAX_SEED) | |
generator = torch.Generator(device=device).manual_seed(seed) | |
prompt = "wbgmsst, " + prompt + ", 3D isometric, white background" | |
image = flux_pipeline( | |
prompt=prompt, | |
guidance_scale=guidance_scale, | |
num_inference_steps=NUM_INFERENCE_STEPS, | |
width=width, | |
height=height, | |
generator=generator, | |
).images[0] | |
# Save the generated image | |
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") | |
unique_id = str(uuid.uuid4())[:8] | |
filename = f"{timestamp}_{unique_id}.png" | |
filepath = os.path.join(SAVE_DIR, filename) | |
image.save(filepath) | |
return image | |
# Simple Gradio interface | |
demo = gr.Interface( | |
fn=generate_flux_image, | |
inputs=[ | |
gr.Textbox(label="Prompt", placeholder="Enter your game asset description"), | |
gr.Slider(0, MAX_SEED, label="Seed", value=42, step=1), | |
gr.Checkbox(label="Randomize Seed", value=True), | |
gr.Slider(512, 1024, label="Width", value=1024, step=16), | |
gr.Slider(512, 1024, label="Height", value=1024, step=16), | |
gr.Slider(0.0, 10.0, label="Guidance Scale", value=3.5, step=0.1), | |
], | |
outputs=gr.Image(label="Generated Asset", type="pil"), | |
title="Game Asset Generator", | |
description="Generate game assets with FLUX" | |
) | |
if __name__ == "__main__": | |
demo.launch() |