import subprocess
from PIL import Image
import gradio as gr
import os
import random
# First, running the inversion command to obtain the input noise that will reconstruct the image.
# It will save the inversion as output/test_cat/inversion/image-name.pt
# BLIP-generated caption prompt is saved as output/test_cat/prompt/image-name.txt - eg., a painting of a cat sitting on top of a ball
def inversion(image_in): #, progress=gr.Progress(track_tqdm=True)):
#progress(0, desc="Starting...")
seed = random.randint(0, 1000000)
img_name = f"input_image_{seed}.png"
img_label = f"input_image_{seed}"
# saving the input image
image_in.save(img_name)
#image_in.save("input_image.png") #("assets/test_images/cats/input_image.png")
# Run the script file
subprocess.run(["python", "src/inversion.py", "--input_image", f"input_image_{seed}.png", "--results_folder", "output/test_cat"])
# Open the text file with blip caption
with open(f"output/test_cat/prompt/{img_label}.txt", "r") as file:
# Read the file
prompt = file.read()
return f"output/test_cat/inversion/{img_label}.pt", prompt, seed
# Performing image editing with the editing directions
# This will save the edited image as output/test_cat/edit/image-name.png
def image_edit(task_name, seed): #, progress=gr.Progress(track_tqdm=True)):
#progress(0, desc="Starting...")
seed = int(seed)
img_label = f"input_image_{seed}"
# Run the script file
subprocess.run(["python", "src/edit_real.py", "--inversion", f"output/test_cat/inversion/{img_label}.pt",
"--prompt", f"output/test_cat/prompt/{img_label}.txt", "--task_name", task_name,
"--results_folder", "output/test_cat/"])
return f"output/test_cat/edit/{img_label}.png"
#Similarly, we can edit the synthetic images generated by Stable Diffusion with the following command.
def synthetic_image_edit(prompt, task_name): #, progress=gr.Progress(track_tqdm=True)):
#progress(0, desc="Starting...")
seed = random.randint(0, 1000000)
#img_name = f"./input_image_{seed}.png"
#img_label = f"./input_image_{seed}"
# Run the script file
subprocess.run(["python", "src/edit_synthetic.py", "--prompt_str", prompt,
"--task", task_name, "--results_folder", "output/synth_editing"])
return f"output/synth_editing/reconstruction{seed}.png", f"output/synth_editing/edit{seed}.png"
def set_visible_true():
return gr.update(visible=True)
def set_visible_False():
return gr.update(visible=False)
#Gradio Blocks API
with gr.Blocks() as demo:
gr.HTML("""
Pix2Pix - Zero-shot Image-to-Image Translation
This is an unofficial demo for Pix2PixZero.
Please visit their website and github repo for more details.
""")
gr.HTML("""Duplicate this Space and upgrade to a GPU for fast Inference & no queue
""")
direction_html = gr.HTML(value="👇Upload a Dog or a Cat image here to get started👇
", visible=True)
refresh_direction_html = gr.HTML(value="👆Click the 'App' button to Refresh the space and try translation again with another Image
", visible=False)
with gr.Row():
image_in = gr.Image(type="pil", label="Start by uploading an image of a Cat or a Dog that you want to translate")
seed = gr.Number(visible=False, Precision=0)
#with gr.Box():
# gr.Examples( examples=[os.path.join(os.path.dirname(__file__), "dog11.jpg"), os.path.join(os.path.dirname(__file__), "cat11.jpg")],
# inputs=image_in,)
# #fn=inversion,)
with gr.Column():
btn_inversion = gr.Button("Get input noise and image caption",visible=False )
with gr.Row():
blip_prompt = gr.Textbox(visible=False)
inversion_file = gr.File(visible=False)
#task_name = gr.Textbox()
with gr.Row():
image_out = gr.Image(visible=False, label="Translated Image output")
with gr.Column():
task_name_radio = gr.Radio(choices = ["cat2dog", "dog2cat",], type="value", visible=False, label="Select a task that you want to accomplish") #, value="cat2dog"),
btn_imageedit = gr.Button(value="Translate the image!",visible=False)
html_tag = gr.HTML(value="""
🤩You can also Generate images with Stable Diffusion and 🚀Translate them on the fly🔥 (zero-shot) using Pix2PixZero. Try this below -
Example - type a prompt like 'A small cat sitting on a blue ball', select the task as 'cat->dog' in this case, and press the button.""", visible=False)
prompt_synth = gr.Textbox(visible=False, label="Type in a prompt to generate an Image using SD", placeholder="A small cat sitting on a blue ball")
btn_synth_image = gr.Button(value="Generate & Translate the SD image",visible=False)
with gr.Row():
image_synth = gr.Image(visible=False, label="Synthetic image generated by Stable Diffusion on the fly")
image_synth_translated = gr.Image(visible=False, label="Translated synthetic image")
image_in.change(set_visible_False, [], direction_html)
btn_inversion.click(inversion,[image_in],[inversion_file, blip_prompt, seed])
#btn_inversion.click(set_visible_true, [], task_name_radio) #inversion_file, blip_prompt,
btn_inversion.click(set_visible_False, [], btn_inversion)
inversion_file.change(set_visible_true, [], task_name_radio) #inversion_file, blip_prompt,
#task_initial_radio.change(set_visible_true, [], btn_imageedit)
task_name_radio.change(set_visible_true, [], btn_imageedit)
task_name_radio.change(set_visible_true, [], image_out)
#task_name_radio.change(set_visible_true, [], html_tag)
btn_imageedit.click(image_edit,[task_name_radio, seed],[image_out])
btn_imageedit.click(set_visible_False, [], btn_imageedit)
btn_imageedit.click(set_visible_true, [], html_tag)
btn_imageedit.click(set_visible_true, [], prompt_synth)
btn_imageedit.click(set_visible_true, [], btn_synth_image)
btn_imageedit.click(set_visible_true, [], image_synth)
btn_imageedit.click(set_visible_true, [], image_synth_translated)
image_out.change(set_visible_true, [], refresh_direction_html)
btn_synth_image.click(synthetic_image_edit,[prompt_synth, task_name_radio],[image_synth, image_synth_translated])
image_in.clear(set_visible_true, [], btn_inversion)
image_in.change(set_visible_true, [], btn_inversion)
image_in.change(set_visible_true, [], blip_prompt)
image_in.change(set_visible_true, [], inversion_file)
demo.queue(concurrency_count=3)
demo.launch(debug=True)