Spaces:
Running
Running
import gradio as gr | |
import numpy as np | |
import requests | |
import json | |
from PIL import Image | |
from diffusers.utils import load_image | |
from io import BytesIO | |
from vars import base_url | |
# API endpoints | |
sdxl_inference_endpoint = f'{base_url}/api/v1/product-diffusion/sdxl_v0_lora_inference' | |
kandinsky_inpainting_inference = f'{base_url}/api/v1/product-diffusion/inpainting' | |
def generate_sdxl_lora_image(prompt, negative_prompt, num_inference_steps, guidance_scale, num_images, mode): | |
payload = { | |
"prompt": prompt, | |
"negative_prompt": negative_prompt, | |
"num_inference_steps": num_inference_steps, | |
"guidance_scale": guidance_scale, | |
"num_images": num_images, | |
"mode": mode | |
} | |
response = requests.post(sdxl_inference_endpoint, json=payload) | |
response.raise_for_status() | |
response_data = response.json() | |
url = response_data['url'] | |
image = load_image(url) | |
return image | |
def generate_outpainting(prompt, negative_prompt, num_inference_steps, strength, guidance_scale, mode, num_images, image, width, height): | |
# Convert the image to bytes | |
img_byte_arr = BytesIO() | |
image.save(img_byte_arr, format='PNG') | |
img_byte_arr = img_byte_arr.getvalue() | |
# Prepare the files for multipart/form-data | |
files = { | |
'image': ('image.png', img_byte_arr, 'image/png') | |
} | |
# Prepare the request data | |
request_data = { | |
"prompt": prompt, | |
"negative_prompt": negative_prompt, | |
"num_inference_steps": num_inference_steps, | |
"strength": strength, | |
"guidance_scale": guidance_scale, | |
"mode": mode, | |
"num_images": num_images, | |
"width": width, | |
"height": height | |
} | |
# Convert request_data to a JSON string | |
request_data_json = json.dumps(request_data) | |
# Prepare the form data | |
form_data = { | |
'request_data': request_data_json | |
} | |
response = requests.post(kandinsky_inpainting_inference, files=files, data=form_data) | |
response.raise_for_status() | |
response_data = response.json() | |
image_url = response_data['image_url'] | |
mask_url = response_data['mask_url'] | |
outpainted_image = load_image(image_url) | |
mask_image = load_image(mask_url) | |
return outpainted_image, mask_image | |
with gr.Blocks(theme='VikramSingh178/Webui-Theme') as demo: | |
with gr.Tab("SdxL-Lora"): | |
with gr.Row(): | |
with gr.Column(): | |
with gr.Group(): | |
prompt = gr.Textbox(label="Prompt", placeholder="Enter your prompt here") | |
negative_prompt = gr.Textbox(label="Negative Prompt", placeholder="Enter negative prompt here") | |
num_inference_steps = gr.Slider(minimum=1, maximum=1000, step=1, value=20, label="Inference Steps") | |
guidance_scale = gr.Slider(minimum=1.0, maximum=10.0, step=0.1, value=7.5, label="Guidance Scale") | |
num_images = gr.Slider(minimum=1, maximum=10, step=1, value=1, label="Number of Images") | |
mode = gr.Dropdown(choices=["s3_json", "b64_json"], value="s3_json", label="Mode") | |
generate_button = gr.Button("Generate Image", variant='primary') | |
with gr.Column(scale=1): | |
image_preview = gr.Image(label="Generated Image (SDXL-Lora)", show_download_button=True, show_share_button=True, container=True) | |
generate_button.click(generate_sdxl_lora_image, inputs=[prompt, negative_prompt, num_inference_steps, guidance_scale, num_images, mode], outputs=[image_preview]) | |
with gr.Tab("Outpainting"): | |
with gr.Row(): | |
with gr.Column(): | |
with gr.Group(): | |
input_image = gr.Image(label="Upload Image", type="pil") | |
prompt = gr.Textbox(label="Prompt", placeholder="Enter your prompt here") | |
negative_prompt= gr.Textbox(label="Negative Prompt", placeholder="Enter negative prompt here") | |
num_inference_steps = gr.Slider(minimum=1, maximum=100, step=1, value=20, label="Inference Steps") | |
strength = gr.Slider(minimum=0.1, maximum=1, step=0.1, value=0.8, label="Strength") | |
guidance_scale = gr.Slider(minimum=1.0, maximum=10.0, step=0.1, value=7.5, label="Guidance Scale") | |
num_images = gr.Slider(minimum=1, maximum=10, step=1, value=1, label="Number of Images") | |
mode_kandinsky = gr.Dropdown(choices=["s3_json", "b64_json"], value="s3_json", label="Mode") | |
width_slider = gr.Slider(minimum=512, maximum=1024, step=1, value=800, label="Image Width") | |
height_slider = gr.Slider(minimum=512, maximum=1024, step=1, value=800, label="Image Height") | |
generate_button = gr.Button("Generate Inpainting", variant='primary') | |
with gr.Column(scale=1): | |
outpainted_image_preview = gr.Image(label="Outpainted Image (Kandinsky)", show_download_button=True, show_share_button=True, container=True) | |
mask_image_preview = gr.Image(label="Generated Mask", show_download_button=True, show_share_button=True, container=True) | |
generate_button.click(generate_outpainting, inputs=[prompt, negative_prompt, num_inference_steps, strength, guidance_scale, mode_kandinsky, num_images, input_image, width_slider, height_slider], outputs=[outpainted_image_preview, mask_image_preview]) | |
demo.launch() | |