stable-diffusion-webui-rembg icon indicating copy to clipboard operation
stable-diffusion-webui-rembg copied to clipboard

What is the API for sd webui?

Open zhuchenye opened this issue 2 years ago • 4 comments

I want to use the API on webui server with the payload as : payload = { "image": encode_pil_to_base64(image), "model": "u2net", "return_mask": False, "alpha_matting": False, "alpha_matting_foreground_threshold": 240, "alpha_matting_background_threshold": 10, "alpha_matting_erode_size": 10, } but it dos not work.

Is there any docs for remby API?

zhuchenye avatar May 23 '23 08:05 zhuchenye

Me too. As a workaround I installed rembg standalone. But why load and wait every time when it is already loaded on the sd server anyway?

Theroniya avatar May 23 '23 15:05 Theroniya

I found there is no API route for rembg. So if I used extra_single_image interface, the rembg params will be none.

zhuchenye avatar May 24 '23 01:05 zhuchenye

It used to work up until a couple weeks ago. I think an update on the webui side broke it. I still have it working on our older setups but any new setups are broke. when working, you have to put postprocessing_rembg_ before each parameter (see pic)

Screenshot 2023-05-25 135050

That setup 100% was working up until about a week or two ago, so if anyone wants to play with that to see what you can find, please post back here if you solve it.

hubcart avatar May 25 '23 20:05 hubcart

One alternative approach is to create a new file called api.py in the scripts folder of the plugin.

# api.py
from fastapi import FastAPI, Body

from modules.api.models import *
from modules.api import api
import gradio as gr

import rembg

def rembg_api(_: gr.Blocks, app: FastAPI):
    @app.post("/rembg")
    async def rembg_remove(
        input_image: str = Body("", title='rembg input image'),
        model: str = Body("u2net", title='rembg model'), 
        return_mask: bool = Body(False, title='return mask'), 
        alpha_matting: bool = Body(False, title='alpha matting'), 
        alpha_matting_foreground_threshold: int = Body(240, title='alpha matting foreground threshold'), 
        alpha_matting_background_threshold: int = Body(10, title='alpha matting background threshold'), 
        alpha_matting_erode_size: int = Body(10, title='alpha matting erode size')
    ):
        if not model or model == "None":
            return

        input_image = api.decode_base64_to_image(input_image)

        image = rembg.remove(
            input_image,
            session=rembg.new_session(model),
            only_mask=return_mask,
            alpha_matting=alpha_matting,
            alpha_matting_foreground_threshold=alpha_matting_foreground_threshold,
            alpha_matting_background_threshold=alpha_matting_background_threshold,
            alpha_matting_erode_size=alpha_matting_erode_size,
        )

        return {"image": api.encode_pil_to_base64(image).decode("utf-8")}

try:
    import modules.script_callbacks as script_callbacks

    script_callbacks.on_app_started(rembg_api)
except:
    pass
image

ccfco avatar Jun 02 '23 01:06 ccfco