Spaces:
Sleeping
Sleeping
import gradio as gr | |
from image_generator import ImageGenerator | |
import os | |
header = """Hi! This HuggingFace Space is a demo for the homework from the [10th lesson](https://course.fast.ai/Lessons/lesson10.html) of the fast.ai course. You can pick some of the examples below and click the "Generate Image" Button. | |
The code demonstrates: | |
* how to use an existing image as a starting point for the output image generation, in addition to the prompt | |
* how to use negative prompt | |
* how to capture latents through the generation | |
* how to mix prompt embeddings | |
![a cute dog mixed with a bird](/file=ai-math.png "a cute dog mixed with a bird") | |
""" | |
ig = ImageGenerator() | |
print(ig) | |
ig.load_models() | |
ig.load_scheduler() | |
def call(prompt, secondary_prompt, mix_ratio, negative_prompt, steps, init_image ): | |
print(f"{prompt=} {secondary_prompt=} {mix_ratio=} {negative_prompt=} {steps=} {init_image=} ") | |
generated_image, latents = ig.generate( | |
prompt=prompt, | |
secondary_prompt=secondary_prompt, | |
prompt_mix_ratio=mix_ratio, | |
negative_prompt=negative_prompt, | |
steps=steps, | |
init_image=init_image, | |
latent_callback_mod=None ) | |
if init_image is not None: | |
noisy_latent = latents[1] | |
else: | |
noisy_latent = None | |
return generated_image, noisy_latent | |
def update_noisy_image_visibility(init_image): | |
if init_image is None: | |
print("update_noisy_image_visibility: hide noisy image") | |
return gr.Image(type="pil", label="Starting Image with Added Noise", visible=False) | |
else: | |
print("update_noisy_image_visibility: show noisy image") | |
return gr.Image(type="pil", label="Starting Image with Added Noise", visible=True) | |
def run_inference(prompt="", secondary_prompt="", mix_ratio=0.5, negative_prompt="", guidance=7.5, steps=10, init_image=None, progress=gr.Progress()): #, mix_ratio, negative_prompt, steps, starting_image, load_set_btn, | |
print(f"{prompt=} {secondary_prompt=} {mix_ratio=} {negative_prompt=} {steps=} {init_image=} ") | |
generated_image, latents = ig.generate( | |
prompt=prompt, | |
secondary_prompt=secondary_prompt, | |
prompt_mix_ratio=mix_ratio, | |
negative_prompt=negative_prompt, | |
guidance=guidance, | |
steps=steps, | |
init_image=init_image, | |
latent_callback_mod=1, | |
progress_tqdm=progress.tqdm ) | |
if init_image is not None: | |
noisy_latent = latents[1] | |
else: | |
noisy_latent = None | |
return generated_image, noisy_latent, ig.image_grid(latents) | |
with gr.Blocks() as demo: | |
with gr.Row(): | |
gr.Markdown(value=header) | |
with gr.Row(): | |
with gr.Column(scale=1): | |
prompt = gr.Textbox(value="a cute dog", label="Prompt", info="primary prompt used to generate an image") | |
secondary_prompt = gr.Textbox(value=None, label="Secondary Prompt", info="secondary prompt to mix with the primary embeddings") | |
mix_ratio = gr.Slider(0, 1, value=0.5, label="Mix Ratio", info="mix ratio between primary and secondary prompt. 0 = primary only. 1 = secondary only") | |
negative_prompt = gr.Textbox(value=None, label="Negative Prompt", info="remove certain aspect from the picture") | |
guidance = gr.Slider(0, 14, value=7.5, label="Guidance", info="how closely the model should follow the prompt (higher the closer)") | |
steps = gr.Slider(10, 50, value=10, step=1, label="Generation Steps", info="How many steps are used to generate the picture") | |
init_image = gr.Image(type="pil", value=None, label="Starting Image",) # info="starting image from this image as opposed to random noise" | |
generate_image_btn = gr.Button("Generate Image") | |
with gr.Column(scale=1): | |
output_image = gr.Image(type="pil", label="Generated Image",) | |
noisy_image = gr.Image(type="pil", label="Starting Image with Added Noise", visible=False) | |
noisy_image.change(fn=update_noisy_image_visibility, inputs=init_image, outputs=noisy_image) | |
latent_images = gr.Image(type="pil", label="Latents through the denoising process", visible=True) | |
with gr.Row(): | |
# broken images should be fixed soon https://github.com/gradio-app/gradio/issues/5067 | |
gr.Examples( | |
examples=[ | |
# simple prompt | |
["a cute dog", "", "", "", 7.5, 10, None], | |
# negative prompt | |
["a beautiful tree", "", "", "green", 7.5, 10, None], | |
# with base image | |
["a painting of Paris at night in the style of Pierre Auguste Renoir", "", "", "", 7.5, 50, os.path.join( os.path.dirname(__file__), "examples/ex4.jpg")], | |
# with prompt | |
["a sloth", "a jaguar", 0.5, "", 7.5, 30, None], | |
], | |
inputs=[prompt, secondary_prompt, mix_ratio, negative_prompt, guidance, steps, init_image], | |
outputs=[output_image, noisy_image, latent_images], | |
fn=run_inference, | |
cache_examples=False) | |
generate_image_btn.click( | |
fn=run_inference, | |
inputs=[prompt, secondary_prompt, mix_ratio, negative_prompt, guidance, steps, init_image], | |
outputs=[output_image, noisy_image, latent_images]) | |
demo.launch(allowed_paths=["./"]) #allowed_paths=["/tmp/"] |