Commit
·
8637ff9
1
Parent(s):
928dc00
`app.py`: img2img
Browse files
app.py
CHANGED
|
@@ -69,15 +69,13 @@ class Prodia:
|
|
| 69 |
return response
|
| 70 |
|
| 71 |
|
| 72 |
-
def image_to_base64(
|
| 73 |
-
#
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
# Encode the bytes to base64
|
| 80 |
-
img_str = base64.b64encode(buffered.getvalue())
|
| 81 |
|
| 82 |
return img_str.decode('utf-8') # Convert bytes to string
|
| 83 |
|
|
@@ -153,7 +151,6 @@ def send_to_txt2img(image):
|
|
| 153 |
return result
|
| 154 |
|
| 155 |
|
| 156 |
-
|
| 157 |
prodia_client = Prodia(api_key=os.getenv("PRODIA_API_KEY"))
|
| 158 |
model_list = prodia_client.list_models()
|
| 159 |
model_names = {}
|
|
@@ -162,7 +159,7 @@ for model_name in model_list:
|
|
| 162 |
name_without_ext = remove_id_and_ext(model_name)
|
| 163 |
model_names[name_without_ext] = model_name
|
| 164 |
|
| 165 |
-
def
|
| 166 |
result = prodia_client.generate({
|
| 167 |
"prompt": prompt,
|
| 168 |
"negative_prompt": negative_prompt,
|
|
@@ -179,6 +176,25 @@ def flip_text(prompt, negative_prompt, model, steps, sampler, cfg_scale, width,
|
|
| 179 |
|
| 180 |
return job["imageUrl"]
|
| 181 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 182 |
|
| 183 |
css = """
|
| 184 |
#generate {
|
|
@@ -186,9 +202,29 @@ css = """
|
|
| 186 |
}
|
| 187 |
"""
|
| 188 |
|
| 189 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
|
| 191 |
-
|
| 192 |
with gr.Row():
|
| 193 |
with gr.Column(scale=6):
|
| 194 |
model = gr.Dropdown(interactive=True,value="absolutereality_v181.safetensors [3d9d4d2b]", show_label=True, label="Stable Diffusion Checkpoint", choices=prodia_client.list_models())
|
|
@@ -196,6 +232,7 @@ with gr.Blocks(css=css) as demo:
|
|
| 196 |
with gr.Column(scale=1):
|
| 197 |
gr.Markdown(elem_id="powered-by-prodia", value="AUTOMATIC1111 Stable Diffusion Web UI.<br>Powered by [Prodia](https://prodia.com).<br> For more features and faster gen times check out our [API Docs](https://docs.prodia.com/reference/getting-started-guide)")
|
| 198 |
|
|
|
|
| 199 |
with gr.Tabs() as tabs:
|
| 200 |
with gr.Tab("txt2img", id='t2i'):
|
| 201 |
with gr.Row():
|
|
@@ -251,7 +288,46 @@ with gr.Blocks(css=css) as demo:
|
|
| 251 |
with gr.Column(scale=2):
|
| 252 |
image_output = gr.Image(value="https://images.prodia.xyz/8ede1a7c-c0ee-4ded-987d-6ffed35fc477.png")
|
| 253 |
|
| 254 |
-
text_button.click(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
|
| 256 |
with gr.Tab("PNG Info"):
|
| 257 |
def plaintext_to_html(text, classname=None):
|
|
@@ -289,6 +365,6 @@ with gr.Blocks(css=css) as demo:
|
|
| 289 |
image_input.upload(get_exif_data, inputs=[image_input], outputs=exif_output)
|
| 290 |
send_to_txt2img_btn.click(send_to_txt2img, inputs=[image_input], outputs=[tabs, prompt, negative_prompt, steps, seed,
|
| 291 |
model, sampler, width, height, cfg_scale])
|
| 292 |
-
|
| 293 |
demo.queue(concurrency_count=32)
|
| 294 |
demo.launch()
|
|
|
|
| 69 |
return response
|
| 70 |
|
| 71 |
|
| 72 |
+
def image_to_base64(image):
|
| 73 |
+
# Convert the image to bytes
|
| 74 |
+
buffered = BytesIO()
|
| 75 |
+
image.save(buffered, format="PNG") # You can change format to PNG if needed
|
| 76 |
+
|
| 77 |
+
# Encode the bytes to base64
|
| 78 |
+
img_str = base64.b64encode(buffered.getvalue())
|
|
|
|
|
|
|
| 79 |
|
| 80 |
return img_str.decode('utf-8') # Convert bytes to string
|
| 81 |
|
|
|
|
| 151 |
return result
|
| 152 |
|
| 153 |
|
|
|
|
| 154 |
prodia_client = Prodia(api_key=os.getenv("PRODIA_API_KEY"))
|
| 155 |
model_list = prodia_client.list_models()
|
| 156 |
model_names = {}
|
|
|
|
| 159 |
name_without_ext = remove_id_and_ext(model_name)
|
| 160 |
model_names[name_without_ext] = model_name
|
| 161 |
|
| 162 |
+
def txt2img(prompt, negative_prompt, model, steps, sampler, cfg_scale, width, height, seed):
|
| 163 |
result = prodia_client.generate({
|
| 164 |
"prompt": prompt,
|
| 165 |
"negative_prompt": negative_prompt,
|
|
|
|
| 176 |
|
| 177 |
return job["imageUrl"]
|
| 178 |
|
| 179 |
+
def img2img(input_image, denoising, prompt, negative_prompt, model, steps, sampler, cfg_scale, width, height, seed):
|
| 180 |
+
result = prodia_client.transform({
|
| 181 |
+
"imageData": image_to_base64(input_image),
|
| 182 |
+
"denoising_strength": denoising,
|
| 183 |
+
"prompt": prompt,
|
| 184 |
+
"negative_prompt": negative_prompt,
|
| 185 |
+
"model": model,
|
| 186 |
+
"steps": steps,
|
| 187 |
+
"sampler": sampler,
|
| 188 |
+
"cfg_scale": cfg_scale,
|
| 189 |
+
"width": width,
|
| 190 |
+
"height": height,
|
| 191 |
+
"seed": seed
|
| 192 |
+
})
|
| 193 |
+
|
| 194 |
+
job = prodia_client.wait(result)
|
| 195 |
+
|
| 196 |
+
return job["imageUrl"]
|
| 197 |
+
|
| 198 |
|
| 199 |
css = """
|
| 200 |
#generate {
|
|
|
|
| 202 |
}
|
| 203 |
"""
|
| 204 |
|
| 205 |
+
samplers = [
|
| 206 |
+
"Euler",
|
| 207 |
+
"Euler a",
|
| 208 |
+
"LMS",
|
| 209 |
+
"Heun",
|
| 210 |
+
"DPM2",
|
| 211 |
+
"DPM2 a",
|
| 212 |
+
"DPM++ 2S a",
|
| 213 |
+
"DPM++ 2M",
|
| 214 |
+
"DPM++ SDE",
|
| 215 |
+
"DPM fast",
|
| 216 |
+
"DPM adaptive",
|
| 217 |
+
"LMS Karras",
|
| 218 |
+
"DPM2 Karras",
|
| 219 |
+
"DPM2 a Karras",
|
| 220 |
+
"DPM++ 2S a Karras",
|
| 221 |
+
"DPM++ 2M Karras",
|
| 222 |
+
"DPM++ SDE Karras",
|
| 223 |
+
"DDIM",
|
| 224 |
+
"PLMS",
|
| 225 |
+
]
|
| 226 |
|
| 227 |
+
with gr.Blocks(css=css) as demo:
|
| 228 |
with gr.Row():
|
| 229 |
with gr.Column(scale=6):
|
| 230 |
model = gr.Dropdown(interactive=True,value="absolutereality_v181.safetensors [3d9d4d2b]", show_label=True, label="Stable Diffusion Checkpoint", choices=prodia_client.list_models())
|
|
|
|
| 232 |
with gr.Column(scale=1):
|
| 233 |
gr.Markdown(elem_id="powered-by-prodia", value="AUTOMATIC1111 Stable Diffusion Web UI.<br>Powered by [Prodia](https://prodia.com).<br> For more features and faster gen times check out our [API Docs](https://docs.prodia.com/reference/getting-started-guide)")
|
| 234 |
|
| 235 |
+
|
| 236 |
with gr.Tabs() as tabs:
|
| 237 |
with gr.Tab("txt2img", id='t2i'):
|
| 238 |
with gr.Row():
|
|
|
|
| 288 |
with gr.Column(scale=2):
|
| 289 |
image_output = gr.Image(value="https://images.prodia.xyz/8ede1a7c-c0ee-4ded-987d-6ffed35fc477.png")
|
| 290 |
|
| 291 |
+
text_button.click(txt2img, inputs=[prompt, negative_prompt, model, steps, sampler, cfg_scale, width, height, seed], outputs=image_output)
|
| 292 |
+
|
| 293 |
+
with gr.Tab("img2img", id='i2i'):
|
| 294 |
+
with gr.Row():
|
| 295 |
+
with gr.Column(scale=6, min_width=600):
|
| 296 |
+
i2i_prompt = gr.Textbox("space warrior, beautiful, female, ultrarealistic, soft lighting, 8k", placeholder="Prompt", show_label=False, lines=3)
|
| 297 |
+
i2i_negative_prompt = gr.Textbox(placeholder="Negative Prompt", show_label=False, lines=3, value="3d, cartoon, anime, (deformed eyes, nose, ears, nose), bad anatomy, ugly")
|
| 298 |
+
with gr.Column():
|
| 299 |
+
i2i_text_button = gr.Button("Generate", variant='primary', elem_id="generate")
|
| 300 |
+
|
| 301 |
+
with gr.Row():
|
| 302 |
+
with gr.Column(scale=3):
|
| 303 |
+
with gr.Tab("Generation"):
|
| 304 |
+
i2i_image_input = gr.Image(type="pil")
|
| 305 |
+
|
| 306 |
+
with gr.Row():
|
| 307 |
+
with gr.Column(scale=1):
|
| 308 |
+
i2i_sampler = gr.Dropdown(value="Euler a", show_label=True, label="Sampling Method", choices=samplers)
|
| 309 |
+
|
| 310 |
+
with gr.Column(scale=1):
|
| 311 |
+
i2i_steps = gr.Slider(label="Sampling Steps", minimum=1, maximum=30, value=25, step=1)
|
| 312 |
+
|
| 313 |
+
with gr.Row():
|
| 314 |
+
with gr.Column(scale=1):
|
| 315 |
+
i2i_width = gr.Slider(label="Width", maximum=1024, value=512, step=8)
|
| 316 |
+
i2i_height = gr.Slider(label="Height", maximum=1024, value=512, step=8)
|
| 317 |
+
|
| 318 |
+
with gr.Column(scale=1):
|
| 319 |
+
i2i_batch_size = gr.Slider(label="Batch Size", maximum=1, value=1)
|
| 320 |
+
i2i_batch_count = gr.Slider(label="Batch Count", maximum=1, value=1)
|
| 321 |
+
|
| 322 |
+
i2i_cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, value=7, step=1)
|
| 323 |
+
i2i_denoising = gr.Slider(label="Denoising Strength", minimum=0, maximum=1, value=0.7, step=0.1)
|
| 324 |
+
i2i_seed = gr.Number(label="Seed", value=-1)
|
| 325 |
+
|
| 326 |
+
|
| 327 |
+
with gr.Column(scale=2):
|
| 328 |
+
i2i_image_output = gr.Image(value="https://images.prodia.xyz/8ede1a7c-c0ee-4ded-987d-6ffed35fc477.png")
|
| 329 |
+
|
| 330 |
+
i2i_text_button.click(img2img, inputs=[i2i_image_input, i2i_denoising, i2i_prompt, i2i_negative_prompt, model, i2i_steps, i2i_sampler, i2i_cfg_scale, i2i_width, i2i_height, i2i_seed], outputs=i2i_image_output)
|
| 331 |
|
| 332 |
with gr.Tab("PNG Info"):
|
| 333 |
def plaintext_to_html(text, classname=None):
|
|
|
|
| 365 |
image_input.upload(get_exif_data, inputs=[image_input], outputs=exif_output)
|
| 366 |
send_to_txt2img_btn.click(send_to_txt2img, inputs=[image_input], outputs=[tabs, prompt, negative_prompt, steps, seed,
|
| 367 |
model, sampler, width, height, cfg_scale])
|
| 368 |
+
|
| 369 |
demo.queue(concurrency_count=32)
|
| 370 |
demo.launch()
|