| import os |
| import gradio as gr |
| import requests |
| from PIL import Image |
| from io import BytesIO |
| from base64 import b64encode |
|
|
| SEGMIND_MODEL_URL = "https://api.segmind.com/v1/inpaint-auto" |
|
|
| def urlToB64(imgUrl): |
| return str(b64encode(requests.get(imgUrl).content))[2:-1] |
|
|
| def imageToB64(img): |
| buffered = BytesIO() |
| img.save(buffered, format="JPEG") |
| return str(b64encode(buffered.getvalue()))[2:-1] |
|
|
| def generate_image( |
| upload_method, |
| img_url, |
| uploaded_img, |
| prompt, |
| negative_prompt, |
| cn_model, |
| cn_processor, |
| base_model |
| ): |
| if upload_method == "URL": |
| if not img_url: |
| raise ValueError("Image URL is required.") |
| img_b64 = urlToB64(img_url) |
| else: |
| if not uploaded_img: |
| raise ValueError("Image upload is required.") |
| img_b64 = imageToB64(uploaded_img) |
|
|
| data = { |
| "image": img_b64, |
| "prompt": prompt, |
| "negative_prompt": negative_prompt, |
| "samples": 1, |
| "base_model": base_model, |
| "cn_model": cn_model, |
| "cn_processor": cn_processor, |
| "scheduler": "DPM++ 2M SDE Karras", |
| "num_inference_steps": 25, |
| "guidance_scale": 7.5, |
| "seed": -1, |
| "strength": 0.9, |
| "base64": False, |
| } |
| response = requests.post( |
| SEGMIND_MODEL_URL, |
| json=data, |
| headers={"x-api-key": os.environ['SEGMIND_API_KEY']} |
| ) |
| output_img = Image.open(BytesIO(response.content)) |
|
|
| return output_img |
|
|
|
|
| def invertBox(upload_method): |
| |
| if upload_method == "URL": |
| return gr.update(visible=True), gr.update(visible=False) |
| else: |
| return gr.update(visible=False), gr.update(visible=True) |
|
|
| with gr.Blocks() as demo: |
| gr.Markdown("### Photo Background Changer") |
| gr.Markdown( |
| "Change the bavkground of the image in one click to anything that you can imagine" |
| ) |
| with gr.Row(): |
| upload_method = gr.Radio( |
| choices=["URL", "Upload"], label="Choose Image Upload Method", value="URL" |
| ) |
| img_url = gr.Textbox(label="Image URL") |
| uploaded_img = gr.Image(type="pil", label="Upload Image", visible=False) |
| upload_method.change( |
| invertBox, inputs=upload_method, outputs=[img_url, uploaded_img] |
| ) |
| with gr.Row(): |
| prompt = gr.Textbox(label="Prompt") |
| negative_prompt = gr.Textbox( |
| label="Negative Prompt", |
| value="disfigured, deformed, ugly, floating in air, blur, haze, uneven edges, improper blending, animated, cartoon", |
| ) |
| with gr.Row(): |
| cn_model = gr.Dropdown( |
| label="Select Controlnet Model", |
| choices=["Canny", "Depth", "SoftEdge", "OpenPose"], |
| value="Depth", |
| ) |
| cn_processor = gr.Dropdown( |
| label="Select Controlnet Processor", |
| choices=[ |
| "canny", |
| "depth", |
| "depth_leres", |
| "depth_leres++", |
| "hed", |
| "hed_safe", |
| "mediapipe_face", |
| "mlsd", |
| "normal_map", |
| "openpose", |
| "openpose_hand", |
| "openpose_face", |
| "openpose_faceonly", |
| "openpose_full", |
| "dw_openpose_full", |
| "animal_openpose", |
| "clip_vision", |
| "revision_clipvision", |
| "revision_ignore_prompt", |
| "ip-adapter_clip_sd15", |
| "ip-adapter_clip_sdxl_plus_vith", |
| "ip-adapter_clip_sdxl", |
| "color", |
| "pidinet", |
| "pidinet_safe", |
| "pidinet_sketch", |
| "pidinet_scribble", |
| "scribble_xdog", |
| "scribble_hed", |
| "segmentation", |
| "threshold", |
| "depth_zoe", |
| "normal_bae", |
| "oneformer_coco", |
| "oneformer_ade20k", |
| "lineart", |
| "lineart_coarse", |
| "lineart_anime", |
| "lineart_standard", |
| "shuffle", |
| "tile_resample", |
| "invert", |
| "lineart_anime_denoise", |
| "reference_only", |
| "reference_adain", |
| "reference_adain+attn", |
| "inpaint", |
| "inpaint_only", |
| "inpaint_only+lama", |
| "tile_colorfix", |
| "tile_colorfix+sharp", |
| "recolor_luminance", |
| "recolor_intensity", |
| "blur_gaussian", |
| "anime_face_segment", |
| ], |
| value="canny", |
| ) |
| with gr.Row(): |
| base_model = gr.Dropdown( |
| label="Select Base SD Model to use", |
| choices=["Real Vision XL", "SDXL", "Juggernaut XL", "DreamShaper XL"], |
| value="Juggernaut XL", |
| ) |
| with gr.Row(): |
| generate_btn = gr.Button("Generate Image") |
| output_image = gr.Image(type="pil") |
|
|
| generate_btn.click( |
| fn=generate_image, |
| inputs=[ |
| upload_method, |
| img_url, |
| uploaded_img, |
| prompt, |
| negative_prompt, |
| cn_model, |
| cn_processor, |
| base_model |
| ], |
| outputs=[output_image], |
| ) |
|
|
| demo.launch(debug=True) |