Stable-diffusion WebUI API调用方法

写这篇文章的主要原因是工作中需要写一个用训练好的模型批量生图的脚本,开始是想用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) |

相关推荐
肖遥Janic10 小时前
Stable Diffusion绘画 | 插件-Deforum:动态视频生成(上篇)
人工智能·ai·ai作画·stable diffusion
肖遥Janic12 小时前
Stable Diffusion绘画 | 插件-Deforum:商业LOGO广告视频
人工智能·ai·ai作画·stable diffusion
sleetdream2 天前
Pycharm 本地搭建 stable-diffusion-webui
stable diffusion
chenkangck502 天前
AI大模型之旅-最强开源文生图工具Stable Diffusion WebUI 教程
人工智能·stable diffusion
小龙在山东2 天前
基于Flux的文生高清图片
stable diffusion·flux
肖遥Janic2 天前
Stable Diffusion绘画 | 来训练属于自己的模型:炼丹参数调整--步数设置与计算
人工智能·ai·ai作画·stable diffusion
许野平4 天前
Stable Diffusion 蒙版:填充、原图、潜空间噪声(潜变量噪声)、潜空间数值零(潜变量数值零)
人工智能·计算机视觉·stable diffusion
肖遥Janic4 天前
Stable Diffusion绘画 | 插件-Addition Networks:单独控制LoRA
人工智能·ai·ai作画·stable diffusion
AI极客菌4 天前
Stable Diffusion绘画 | 插件-Deforum:动态视频生成
人工智能·ai作画·stable diffusion·aigc·音视频·midjourney·人工智能作画
Hoper.J4 天前
用 LoRA 微调 Stable Diffusion:拆开炼丹炉,动手实现你的第一次 AI 绘画
人工智能·stable diffusion·lora·微调·aigc·文生图·ai绘画