radames's picture
radames HF staff
fix
11e5217
import gradio as gr
import torch
from PIL import Image
import numpy as np
from diffusers import StableDiffusionDepth2ImgPipeline
from pathlib import Path
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
dept2img = StableDiffusionDepth2ImgPipeline.from_pretrained(
"stabilityai/stable-diffusion-2-depth",
torch_dtype=torch.float16,
).to(device)
def pad_image(input_image):
pad_w, pad_h = (
np.max(((2, 2), np.ceil(np.array(input_image.size) / 64).astype(int)), axis=0)
* 64
- input_image.size
)
im_padded = Image.fromarray(
np.pad(np.array(input_image), ((0, pad_h), (0, pad_w), (0, 0)), mode="edge")
)
w, h = im_padded.size
if w == h:
return im_padded
elif w > h:
new_image = Image.new(im_padded.mode, (w, w), (0, 0, 0))
new_image.paste(im_padded, (0, (w - h) // 2))
return new_image
else:
new_image = Image.new(im_padded.mode, (h, h), (0, 0, 0))
new_image.paste(im_padded, ((h - w) // 2, 0))
return new_image
def predict(
input_image,
prompt,
negative_prompt,
steps,
num_samples,
scale,
seed,
strength,
depth_image=None,
):
depth = None
if depth_image is not None:
depth_image = pad_image(depth_image)
depth_image = depth_image.resize((512, 512))
depth = np.array(depth_image.convert("L"))
depth = np.expand_dims(depth, 0)
depth = depth.astype(np.float32) / 255.0
depth = torch.from_numpy(depth)
init_image = input_image.convert("RGB")
image = pad_image(init_image) # resize to integer multiple of 32
image = image.resize((512, 512))
generator = None
if seed is not None:
generator = torch.Generator(device=device).manual_seed(seed)
result = dept2img(
image=image,
prompt=prompt,
negative_prompt=negative_prompt,
generator=generator,
depth_map=depth,
strength=strength,
num_inference_steps=steps,
guidance_scale=scale,
num_images_per_prompt=num_samples,
)
return result["images"]
css = """
#gallery .fixed-height {
max-height: unset;
}
"""
with gr.Blocks(css=css) as block:
with gr.Row():
with gr.Column():
gr.Markdown("## Stable Diffusion 2 Depth2Img")
gr.HTML(
"<p><a href='https://huggingface.co/spaces/radames/stable-diffusion-depth2img?duplicate=true'><img src='https://img.shields.io/badge/-Duplicate%20Space-blue?labelColor=white&style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAP5JREFUOE+lk7FqAkEURY+ltunEgFXS2sZGIbXfEPdLlnxJyDdYB62sbbUKpLbVNhyYFzbrrA74YJlh9r079973psed0cvUD4A+4HoCjsA85X0Dfn/RBLBgBDxnQPfAEJgBY+A9gALA4tcbamSzS4xq4FOQAJgCDwV2CPKV8tZAJcAjMMkUe1vX+U+SMhfAJEHasQIWmXNN3abzDwHUrgcRGmYcgKe0bxrblHEB4E/pndMazNpSZGcsZdBlYJcEL9Afo75molJyM2FxmPgmgPqlWNLGfwZGG6UiyEvLzHYDmoPkDDiNm9JR9uboiONcBXrpY1qmgs21x1QwyZcpvxt9NS09PlsPAAAAAElFTkSuQmCC&logoWidth=14' alt='Duplicate Space'></a></p>"
)
with gr.Row():
with gr.Column():
input_image = gr.Image(type="pil")
with gr.Accordion("Depth Image Optional", open=False):
depth_image = gr.Image(type="pil")
prompt = gr.Textbox(label="Prompt")
negative_prompt = gr.Textbox(label="Negative Prompt")
run_button = gr.Button("Run")
with gr.Accordion("Advanced Options", open=False):
num_samples = gr.Slider(
label="Images", minimum=1, maximum=4, value=1, step=1
)
steps = gr.Slider(
label="Steps", minimum=1, maximum=50, value=50, step=1
)
scale = gr.Slider(
label="Guidance Scale",
minimum=0.1,
maximum=30.0,
value=9.0,
step=0.1,
)
strength = gr.Slider(
label="Strength", minimum=0.0, maximum=1.0, value=0.9, step=0.01
)
seed = gr.Slider(
label="Seed",
minimum=0,
maximum=2147483647,
step=1,
randomize=True,
)
with gr.Column(scale=2):
with gr.Row():
gallery = gr.Gallery(
label="Generated Images",
show_label=False,
elem_id="gallery",
)
gr.Examples(
examples=[
[
"./examples/baby.jpg",
"high definition photo of a baby astronaut space walking at the international space station with earth seeing from above in the background",
"",
50,
4,
9.0,
123123123,
0.8,
None,
],
[
"./examples/gol.jpg",
"professional photo of a Elmo jumping between two high rises, beautiful colorful city landscape in the background",
"",
50,
4,
9.0,
1734133747,
0.9,
None,
],
[
"./examples/bag.jpg",
"a photo of a bag of cookies in the bathroom",
"low light, dark, blurry",
50,
4,
9.0,
1734133747,
0.9,
"./examples/depth.jpg",
],
[
"./examples/smile_face.jpg",
"a hand holding a very spherical orange",
"low light, dark, blurry",
50,
4,
6.0,
961736534,
0.5,
"./examples/smile_depth.jpg",
],
],
inputs=[
input_image,
prompt,
negative_prompt,
steps,
num_samples,
scale,
seed,
strength,
depth_image,
],
outputs=[gallery],
fn=predict,
cache_examples=True,
)
run_button.click(
fn=predict,
inputs=[
input_image,
prompt,
negative_prompt,
steps,
num_samples,
scale,
seed,
strength,
depth_image,
],
outputs=[gallery],
)
block.queue(api_open=False)
block.launch(show_api=False)