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 | |
|  | |
| """ | |
| 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/"] |