s0md3v / sd-webui-roop

roop extension for StableDiffusion web-ui
GNU Affero General Public License v3.0
3.4k stars 881 forks source link

Hope to add upscaler: UpscalerData to API #280

Open xddun opened 1 year ago

xddun commented 1 year ago

i use api,this greatly increases flexibility:

def roop_api(_: gr.Blocks, app: FastAPI):
    @app.post("/roop/image")
    async def roop_image(
        source_image: str = Body("",title="source face image"),
        target_image: str = Body("",title="target image"),
        face_index: list[int] = Body([0],title="face index"),
        scale: int = Body(1,title="scale"),
        upscale_visibility: float = Body(1,title="upscale visibility"),
        face_restorer: str = Body("None",title="face restorer"),
        restorer_visibility: float = Body(1,title="face restorer"),
        model: str = Body("inswapper_128.onnx",title="model"),
    ):
        s_image = api.decode_base64_to_image(source_image)
        t_image = api.decode_base64_to_image(target_image)
        f_index = set(face_index)
        up_options = UpscaleOptions(scale=scale, upscale_visibility=upscale_visibility,face_restorer=get_face_restorer(face_restorer),restorer_visibility=restorer_visibility)
        use_model = get_full_model(model)
        if use_model is None:
            Exception("Model not found")
        result = swap_face(s_image, t_image, use_model, f_index, up_options)
        return {"image": api.encode_pil_to_base64(result.image())}

But this API cannot provide a choice of upscaler methods. How should I operate to add upscaler methods?

xddun commented 1 year ago

it work for me :


def roop_api(_: gr.Blocks, app: FastAPI):
    @app.post("/roop/image")
    async def roop_image(
            source_image: str = Body("", title="source face image"),
            target_image: str = Body("", title="target image"),
            face_index: list[int] = Body([0], title="face index"),
            scale: int = Body(1, title="scale"),
            upscale_visibility: float = Body(1, title="upscale visibility"),
            face_restorer: str = Body("None", title="face restorer"),
            restorer_visibility: float = Body(1, title="face restorer"),
            model: str = Body("inswapper_128.onnx", title="model"),
            upscaler_name: str = Body("None", title="upscaler name"),
    ):
        s_image = api.decode_base64_to_image(source_image)
        t_image = api.decode_base64_to_image(target_image)
        f_index = set(face_index)
        upscalerx = None
        if upscaler_name != "None":
            for upscaler in shared.sd_upscalers:
                if upscaler.name == upscaler_name:
                    upscalerx = upscaler
        up_options = UpscaleOptions(scale=scale,
                                    upscaler=upscalerx,
                                    upscale_visibility=upscale_visibility,
                                    face_restorer=get_face_restorer(face_restorer),
                                    restorer_visibility=restorer_visibility)
        use_model = get_full_model(model)
        if use_model is None:
            Exception("Model not found")
        result = swap_face(s_image, t_image, use_model, f_index, up_options)
        return {"image": api.encode_pil_to_base64(result.image())}

I hope to add this logical code