import spaces
import random
import gradio as gr
import numpy as np
import torch
from PIL import Image
def setup_seed(seed):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
if torch.cuda.is_available():
device = "cuda:0"
else:
device = "cpu"
### PeRFlow-T2I
from diffusers import StableDiffusionXLPipeline
pipe = StableDiffusionXLPipeline.from_pretrained("hansyan/perflow-sdxl-dreamshaper", torch_dtype=torch.float16, use_safetensors=True, variant="v0-fix")
from src.scheduler_perflow import PeRFlowScheduler
pipe.scheduler = PeRFlowScheduler.from_config(pipe.scheduler.config, prediction_type="ddim_eps", num_time_windows=4)
pipe.to("cuda:0", torch.float16)
# pipe_t2i = None
### gradio
@spaces.GPU
def generate(text, num_inference_steps, cfg_scale, seed):
setup_seed(int(seed))
num_inference_steps = int(num_inference_steps)
cfg_scale = float(cfg_scale)
prompt_prefix = "photorealistic, uhd, high resolution, high quality, highly detailed; "
neg_prompt = "distorted, blur, low-quality, haze, out of focus"
text = prompt_prefix + text
samples = pipe(
prompt = [text],
negative_prompt = [neg_prompt],
height = 1024,
width = 1024,
num_inference_steps = num_inference_steps,
guidance_scale = cfg_scale,
output_type = 'pt',
).images
samples = samples.squeeze(0).permute(1, 2, 0).cpu().numpy()*255.
samples = samples.astype(np.uint8)
samples = Image.fromarray(samples[:, :, :3])
return samples
# layout
css = """
h1 {
text-align: center;
display:block;
}
h2 {
text-align: center;
display:block;
}
h3 {
text-align: center;
display:block;
}
.gradio-container {
max-width: 768px !important;
}
"""
with gr.Blocks(title="PeRFlow-SDXL", css=css) as interface:
gr.Markdown(
"""
# PeRFlow-SDXL
GitHub: [https://github.com/magic-research/piecewise-rectified-flow](https://github.com/magic-research/piecewise-rectified-flow)
Models: [https://huggingface.co/hansyan/perflow-sdxl-dreamshaper](https://huggingface.co/hansyan/perflow-sdxl-dreamshaper)
"""
)
with gr.Column():
text = gr.Textbox(
label="Input Prompt",
value="masterpiece, A closeup face photo of girl, wearing a rain coat, in the street, heavy rain, bokeh"
)
with gr.Row():
num_inference_steps = gr.Dropdown(label='Num Inference Steps',choices=[4,5,6,7,8], value=6, interactive=True)
cfg_scale = gr.Dropdown(label='CFG scale',choices=[1.5, 2.0, 2.5], value=2.0, interactive=True)
seed = gr.Textbox(label="Random Seed", value=42)
submit = gr.Button(scale=1, variant='primary')
# with gr.Column():
# with gr.Row():
output_image = gr.Image(label='Generated Image')
gr.Markdown(
"""
Here are some examples provided:
- “masterpiece, A closeup face photo of girl, wearing a rain coat, in the street, heavy rain, bokeh”
- “RAW photo, a handsome man, wearing a black coat, outside, closeup face”
- “RAW photo, a red luxury car, studio light”
- “masterpiece, A beautiful cat bask in the sun”
"""
)
# activate
text.submit(
fn=generate,
inputs=[text, num_inference_steps, cfg_scale, seed],
outputs=[output_image],
)
seed.submit(
fn=generate,
inputs=[text, num_inference_steps, cfg_scale, seed],
outputs=[output_image],
)
submit.click(fn=generate,
inputs=[text, num_inference_steps, cfg_scale, seed],
outputs=[output_image],
)
if __name__ == '__main__':
interface.queue(max_size=10)
interface.launch()