写这篇文章的主要原因是工作中需要写一个用训练好的模型批量生图的脚本,开始是想用python直接加载模型,但后来发现webui的界面中有很多用起来比较方便的插件和参数,最终改成调用WebUI接口的方式来批量生图。
Stable-diffusion的webui界面使用比较方便,但是它的api文档比较简陋,很多功能需要去看源码,所以在这里记录下主要的调用方法
相关文档
官方文档:API · AUTOMATIC1111/stable-diffusion-webui Wiki · GitHub
运行方式
# 1. 首先需要在webui-user.bat中给COMMANDLINE_ARGS添加--api参数 | |
# 2. 启动命令中需要添加nowebui | |
python launch.py --nowebui |
然后使用http://ip:port/docs即可查看官方文档,需要替换ip:port为自己的地址才能看到,官方文档中有执行按钮可以执行example,能简单的看下返回效果
## -- api调用示例代码 -- ## | |
import json | |
import base64 | |
import requests | |
# 发送请求 | |
def submit_post(url: str, data: dict): | |
return requests.post(url, data=json.dumps(data)) | |
# 解码并保存图片 | |
def save_encoded_image(b64_image: str, output_path: str): | |
with open(output_path, 'wb') as image_file: | |
image_file.write(base64.b64decode(b64_image)) | |
if __name__ == '__main__': | |
txt2img_url = r'http://127.0.0.1:8085/sdapi/v1/txt2img' | |
data = {'prompt': 'a dog wearing a hat', | |
'negative_prompt': '', | |
'sampler_index': 'DPM++ SDE', | |
'seed': 1234, | |
'steps': 20, | |
'width': 512, | |
'height': 512, | |
'cfg_scale': 8} | |
response = submit_post(txt2img_url, data) | |
save_image_path = r'./result/tmp.png' | |
save_encoded_image(response.json()['images'][0], save_image_path) |
/sdapi/v1/txt2img接口scripts参数列表,以xyz plot为例,可以直接复制到官方文档的测试窗口中查看一下效果
{ | |
"enable_hr": false, | |
"denoising_strength": 0, | |
"firstphase_width": 0, | |
"firstphase_height": 0, | |
"hr_scale": 2, | |
"hr_upscaler": "", | |
"hr_second_pass_steps": 0, | |
"hr_resize_x": 0, | |
"hr_resize_y": 0, | |
"hr_sampler_name": "", | |
"hr_prompt": "", | |
"hr_negative_prompt": "", | |
"prompt": "cute girl with short brown hair in black t-shirt in animation style", | |
"styles": [ | |
"" | |
], | |
"seed": -1, | |
"subseed": -1, | |
"subseed_strength": 0, | |
"seed_resize_from_h": -1, | |
"seed_resize_from_w": -1, | |
"sampler_name": "Euler a", | |
"batch_size": 1, | |
"n_iter": 1, | |
"steps": 50, | |
"cfg_scale": 7, | |
"width": 512, | |
"height": 512, | |
"restore_faces": false, | |
"tiling": false, | |
"do_not_save_samples": false, | |
"do_not_save_grid": false, | |
"negative_prompt": "", | |
"eta": 0, | |
"s_min_uncond": 0, | |
"s_churn": 0, | |
"s_tmax": 0, | |
"s_tmin": 0, | |
"s_noise": 1, | |
"override_settings": {}, | |
"override_settings_restore_afterwards": true, | |
"script_args": [4,"20,30",[],9,"Euler a, LMS",[],0,"",[],"True","False","False","False",0], # xyz plot参数 | |
"sampler_index": "Euler", | |
"script_name": "X/Y/Z Plot", | |
"send_images": true, | |
"save_images": false, | |
"alwayson_scripts": {} | |
} |
第三方开源库(推荐)
GitHub - mix1009/sdwebuiapi: Python API client for AUTOMATIC1111/stable-diffusion-webui
这个开源库是webui官方推荐的,就是简单的给官方的api套了个壳,而且还提供了scripts参数的使用方式。虽然这个库已经很久没有更新了,很多issue也没有解决,但不妨碍我们参考它的函数使用方式。我们在使用的时候可以直接import webuiapi
,也可以参照他们的实现方式来直接调用官方接口。
import webuiapi | |
from PIL import Image | |
# create API client with custom host, port | |
api = webuiapi.WebUIApi(host='127.0.0.1', port=8085) | |
XYZPlotAvailableTxt2ImgScripts = [...] # 根据脚本参数自行增加调整xyz轴可选择的参数内容 | |
# 省略部分参数定义 | |
... | |
# 参数与官方文档的txt2img完全一致,参照上文参数文档 | |
result = api.txt2img( | |
prompt="cute girl with short brown hair in black t-shirt in animation style", | |
seed=1003, | |
script_name="X/Y/Z Plot", | |
script_args=[ | |
# index,对应xyz轴每个变量在滚动条中的索引数 | |
XYZPlotAvailableTxt2ImgScripts.index(XAxisType), | |
# 选择的对应坐标轴的变量值 | |
XAxisValues, | |
# 变量值下拉列表,webui库更新的1.16之后,新增的参数,必填,不然无法执行生图操作 | |
[], | |
XYZPlotAvailableTxt2ImgScripts.index(YAxisType), | |
YAxisValues, | |
["model_6.safetensors","model_16.safetensors"], | |
XYZPlotAvailableTxt2ImgScripts.index(ZAxisType), | |
ZAxisValues, | |
[], | |
drawLegend, | |
includeLoneImages, | |
includeSubGrids, | |
noFixedSeeds, | |
marginSize, | |
] | |
) | |
# save image with jpg format | |
img = result.image | |
img.save("./result/output2.jpg", quality=90) |