导航

Fooocus 的安装和API的使用

Posted on 2024-01-18 10:35  蝈蝈俊  阅读(1264)  评论(0编辑  收藏  举报

https://github.com/lllyasviel/Fooocus 是一款基于Gradio的图像生成软件。它集成了Stable Diffusion和Midjourney的特点:

  • 向Stable Diffusion学习,该软件是离线的,开源的,免费的。
  • 从Midjourney中学到,不需要手动调整,用户只需要专注于提示和图像。

同时它 支持 api接口调用,而且给了例子。

不过目前api是基于 Gradio client 来调用 Fooocus,不太好用, 有个 https://github.com/konieshadow/Fooocus-API/ 使用 FastAPI 构建了一系列 REST API 来使用 Fooocus。

下面是安装过程中碰到的一些问题

错误:AssertionError: Torch not compiled with CUDA enabled

解决方案先装 cudatoolkit,

conda config --append channels conda-forge
conda config --append channels nvidia

conda install cudatoolkit

如果已经安装了,则卸载 Torch, 再重走流程,如下流程, 在python entry_with_update.py之前卸载Torch即可。

git clone https://github.com/lllyasviel/Fooocus.git
cd Fooocus
conda env create -f environment.yaml
conda activate fooocus
pip install -r requirements_versions.txt

pip uninstall torch

python entry_with_update.py

参考:https://www.educative.io/answers/how-to-resolve-torch-not-compiled-with-cuda-enabled

安装 Fooocus-API 时在获取 Fooocus 时失败。

Fooocus-API 的 Fooocus 默认是安装在
./repositories/Fooocus 目录下的。 我这里自动安装一直不通过,报服务器返回的信息无效或不可识别:

Git clone failed for Fooocus: failed to read data: 服务器返回的信息无效或不可识别

Traceback (most recent call last):
  File "D:\github\Fooocus-API\main.py", line 51, in git_clone
    repo = pygit2.Repository(dir)
  File "C:\ProgramData\anaconda3\envs\fooocus-api\lib\site-packages\pygit2\repository.py", line 1759, in __init__
    path_backend = init_file_backend(path, flags)
_pygit2.GitError: Repository not found at D:\github\Fooocus-API\repositories\Fooocus

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\github\Fooocus-API\main.py", line 405, in <module>
    install_dependents(args)
  File "D:\github\Fooocus-API\main.py", line 269, in install_dependents
    download_repositories()
  File "D:\github\Fooocus-API\main.py", line 192, in download_repositories
    git_clone(fooocus_repo, repo_dir(fooocus_name),
  File "D:\github\Fooocus-API\main.py", line 79, in git_clone
    raise e
  File "D:\github\Fooocus-API\main.py", line 65, in git_clone
    repo = pygit2.clone_repository(url, dir)
  File "C:\ProgramData\anaconda3\envs\fooocus-api\lib\site-packages\pygit2\__init__.py", line 255, in clone_repository
    payload.check_error(err)
  File "C:\ProgramData\anaconda3\envs\fooocus-api\lib\site-packages\pygit2\callbacks.py", line 98, in check_error
    check_error(error_code)
  File "C:\ProgramData\anaconda3\envs\fooocus-api\lib\site-packages\pygit2\errors.py", line 65, in check_error
    raise GitError(message)
_pygit2.GitError: failed to read data: 服务器返回的信息无效或不可识别

解决方法,直接使用github desktop下载https://github.com/lllyasviel/Fooocus 到 ./repositories/Fooocus 目录, 然后启动时用下面命令:

python main.py --sync-repo=skip --host=0.0.0.0

其中的sync-repo=skip就是启动时跳过同步Fooocus这一步,需要自己手工同步。

host=0.0.0.0是为了能局域网其它机子可以访问。

API 使用的示例代码

异步发起文生图任务:

import requests
import json
import time

host = "http://192.168.1.17:8888"

def text2img(params: dict) -> dict:
    """
    文生图
    """
    result = requests.post(url=f"{host}/v1/generation/text-to-image",
                           data=json.dumps(params),
                           headers={"Content-Type": "application/json"})
    print(result.text)
    return result.json()

for i in range(50):

    result =text2img({
        "prompt": "30~40 years old, male, random hobbies, Facebook account avatar",
        "image_seed":-1,
        "async_process": True})
    print(result)
    time.sleep(30)

上述代码执行后,会获得类似如下的输出

{"job_id":"09c58c8e-45b3-47be-8b9e-505aac45c88e",
"job_type":"Text to Image",
"job_stage":"WAITING",
"job_progress":0,
"job_status":null,
"job_step_preview":null,
"job_result":null}

其中的 job_id 是这个文生图任务的ID,后面可以用这个ID来查询生成的图片情况

查询指定任务完成情况

import requests

host = "http://192.168.1.17:8888"

def taskResult(task_id: str) -> dict:
    # 获取任务状态
    task_status = requests.get(url=f"{host}/v1/generation/query-job",
                               params={"job_id": task_id,
                                       "require_step_preivew": False},
                               timeout=30)
    print(task_status.text)
    return task_status.json()

print( taskResult('6f91586a-2c1f-4b03-87b7-627cc6a3533f'))

返回的类似如下:

{'job_id': 'b86b83e6-8035-458c-8116-a04cc33766ef', 
'job_type': 'Text to Image', 
'job_stage': 'SUCCESS', 
'job_progress': 100, 
'job_status': 'Finished', 
'job_step_preview': None, 
'job_result': [{'base64': None, 
'url': 'http://127.0.0.1:8888/files/2024-01-18/90e5c349-e2b6-490c-8c6d-603b7c390e63.png', 
'seed': '445310844207292857', 
'finish_reason': 'SUCCESS'}]}

返回的 job_result中有我们要的图地址。
实际的 .\repositories\Fooocus\outputs\2024-01-18 当前日期目录下,也有这个图片文件。