🤖

stable diffusion AUTOMATIC1111+controlnetをAPIで叩く

2023/03/31に公開

最初に

以下のコードは古くなっている可能性があるので、最新の情報はAUTOMATIC1111環境/docsにあるAPIのドキュメントや、https://github.com/Mikubill/sd-webui-controlnet/wiki/API を参照することをおすすめします。

とりあえずサンプルコード

メインコード

# 必要なライブラリをインポートする
import requests
import io
import base64
from PIL import Image

# 画像を読み込む
image = Image.open("sample.png")
# 画像をbase64に変換する
buffered = io.BytesIO()
image.save(buffered, format="PNG")
img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
# URLは環境に合わせて変更する
url = "http://127.0.0.1:7860/sdapi/v1/txt2img"
# payloadはsdapi/v1/txt2imgと同じ
payload = {
        "prompt": "1girl",
        "negative_prompt": "(worst quality, low quality):1.4",
        "width": 512,
        "height": 512,
        "alwayson_scripts": {
            "controlnet": {
                "args": [{
                    "input_image": img_str,
                    "module": "openpose",# ここを変えることで下処理のmoduleを変えられる
                    "model": "control_openpose-fp16 [here is model hash]",# ここを変えることで下処理のmodelを変えられる
                }]
            }
        }
    }
# 送信して結果を取得する
response = requests.post(url=url, json=payload)
response = response.json()
result_str = response["images"]
result_images = [Image.open(io.BytesIO(base64.b64decode(i))) for i in result_str]
# result_imagesには生成された画像がリストで入っている

moduleとmodel一覧を取得する

import requests

url = "http://127.0.0.1:7860"
# controlnet/module_listとcontrolnet/model_listをget
module_list = requests.get(url + "/controlnet/module_list").json()
model_list = requests.get(url + "/controlnet/model_list").json()

print(module_list["module_list"]) # module_list["module_list"]の中にmoduleのリストが入っている
print(model_list["model_list"]) # model_list["model_list"]の中にmodelのリストが入っている

注意点

  • automaticの起動時に--apiをつけておく必要がある。
  • modelやmoduleがない時でも、生成が完了するので、注意がいる

参考資料

https://github.com/Mikubill/sd-webui-controlnet/wiki/API

自身のAUTOMATIC1111/docsにAPIのドキュメントがあるので、そちらも参考にしてください。

Discussion