mrhan1993 / Fooocus-API

FastAPI powered API for Fooocus
GNU General Public License v3.0
558 stars 148 forks source link

问题:outpainting好像工作异常? #93

Closed xddun closed 8 months ago

xddun commented 8 months ago

我遇到了一个很奇怪的bug,不知道正常的是这样的吗,接口是'/v1/generation/image-inpait-outpaint',下面是代码:

扩展参数是: params = { "prompt": "", "outpaint_selections": "Left,Right,Top,Bottom", "outpaint_distance_left": 0, "outpaint_distance_right": 1024, "outpaint_distance_top": 1024, "outpaint_distance_bottom": 0 }

import json

import numpy as np
import requests
import os
import base64
import cv2
from PIL import Image

from models import *

class Config():
    fooocus_host = 'http://home.elvisiky.com:7866'

    text2img = '/v1/generation/text-to-image'
    img_upscale = '/v1/generation/image-upscale-vary'
    inpaint_outpaint = '/v1/generation/image-inpait-outpaint'
    img_prompt = '/v1/generation/image-prompt'

    img_upscale_v2 = '/v2/generation/image-upscale-vary'
    inpaint_outpaint_v2 = '/v2/generation/image-inpait-outpaint'
    img_prompt_v2 = '/v2/generation/image-prompt'

cfg = Config()

def inpaint_outpaint_v1(image: bytes,
                        params: ImgInpaintOrOutpaintParams,
                        mask: bytes = None,
                        ) -> dict:
    """
    inpaint or outpaint, move watermark, replace sth, extend image
    """
    response = requests.post(url=f"{cfg.fooocus_host}{cfg.inpaint_outpaint}",
                             data=json.loads(json.dumps(params.model_dump())),
                             files={"input_image": image,
                                    "input_mask": mask})
    return response.json()

def inpaint_outpaint_v2(params: ImgInpaintOrOutpaintParamsJson, ) -> dict:
    """
    inpaint or outpaint, move watermark, replace sth, extend image
    """
    response = requests.post(url=f"{cfg.fooocus_host}{cfg.inpaint_outpaint_v2}",
                             data=json.dumps(params.model_dump()),
                             timeout=30)
    return response.json()

if __name__ == '__main__':
    imgs_base_path = os.path.join(os.path.dirname(__file__), 'imgs')
    filename = os.path.join(imgs_base_path, 's.jpg')

    img = cv2.imread(filename)
    # 在四周画红线
    # img = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_CONSTANT, value=(0, 0, 255))
    cv2.imshow("img", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # input_image = open(os.path.join(imgs_base_path, 's.jpg'), 'rb').read()
    # cv2 转 字节流input_image
    input_image = cv2.imencode('.jpg', img)[1].tobytes()

    # outpaint
    params = {
        "prompt": "",
        "outpaint_selections": "Left,Right,Top,Bottom",
        "outpaint_distance_left": 0,
        "outpaint_distance_right": 1024,
        "outpaint_distance_top": 1024,
        "outpaint_distance_bottom": 0
    }
    res = inpaint_outpaint_v1(image=input_image,
                              params=ImgInpaintOrOutpaintParams(**params))
    print(res)
    img = cv2.imdecode(np.frombuffer(base64.b64decode(res[0]['base64']), dtype=np.uint8), cv2.IMREAD_COLOR)
    print(img.shape)
    cv2.imwrite("out.jpg", img)
    cv2.imshow("res", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

我得到的图在下面和左面也产生了补全:

out

xddun commented 8 months ago

图像尺寸也是错误的,原图是: image

结果图是:

image

xddun commented 8 months ago

发现问题是出现在我选了outpaint_selections有Left,但是给outpaint_distance_left的数值是0,那么作者代码里的0.3就生效,这好像有点违背常理认知,望修改一下works里的代码。

"outpaint_selections": "Left,Right,Top,Bottom", "outpaint_distance_left": 0, "outpaint_distance_right": 1024, "outpaint_distance_top": 1024, "outpaint_distance_bottom": 0

mrhan1993 commented 8 months ago

发现问题是出现在我选了outpaint_selections有Left,但是给outpaint_distance_left的数值是0,那么作者代码里的0.3就生效,这好像有点违背常理认知,望修改一下works里的代码。

"outpaint_selections": "Left,Right,Top,Bottom", "outpaint_distance_left": 0, "outpaint_distance_right": 1024, "outpaint_distance_top": 1024, "outpaint_distance_bottom": 0

我提醒下,这个程序现在没有认证功能,你直接把地址放出来,别人是可以直接用的哦

至于你说的问题, 指定扩展距离为0的时候,参数会无效化。这是为了兼容旧版不支持指定数值时的逻辑。目前版本,如果你不需要对应方向的扩展,就不要指定。

xddun commented 8 months ago

嗯嗯,谢谢提醒,是随时关闭的服务,没事。

的确为了兼容的确这样是最好的,理解。

mrhan1993 commented 8 months ago

嗯嗯,谢谢提醒,是随时关闭的服务,没事。

的确为了兼容的确这样是最好的,理解。

不过确实会有一些逻辑冲突,我试试能不能优化下

mrhan1993 commented 8 months ago

@xddun 加个判断就好了,我提交了一个PR,你可以参照 https://github.com/konieshadow/Fooocus-API/pull/95 的变动修改 fooocusapi/worker.py 文件,然后再试试