开始

安装Stable-Diffusion-WebUI

下载项目

首先,我们需要下载Stable-Diffusion-WebUI项目。在终端中执行以下命令:

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

下载完成后,你会在当前目录下看到一个名为”stable-diffusion-webui”的文件夹。

激活项目环境

返回到终端,并激活之前创建的虚拟环境。在终端中输入以下命令:

conda activate sdwebui

启动运行

接下来,切换到”stable-diffusion-webui”文件夹,找到名为”webui.sh”的文件,并在终端中执行:

cd stable-diffusion-webui
./webui.sh

安装成功

在命令行窗口中,你将看到一个网址链接。将该链接(通常为http://127.0.0.1:7860)复制到浏览器中,即可进入Stable Diffusion界面。

以后,每次使用Stable Diffusion时,只需找到之前保存的”stable-diffusion-webui”文件夹,然后运行”webui.sh”即可。

运行

安装成功后,可以看到 web 页面如下:
web ui

深入

提示词

提示词(prompt)很重要,以下是一些注意点:
prompt

接入 API

切换模式

将之前的命令行停掉

python launch.py --nowebui

如果您的电脑是非N卡(比如 AMD),不支持 CUDA,则运行这条命令:

python launch.py --nowebui --skip-torch-cuda-test

看到类似如下输出,代表运行成功

INFO:     Started server process [63228]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:7861 (Press CTRL+C to quit)
Applying attention optimization: sub-quadratic... done.
Model loaded in 16.8s (load weights from disk: 0.5s, create model: 0.7s, apply weights to model: 8.6s, move model to device: 0.2s, load textual inversion embeddings: 0.3s, calculate empty prompt: 6.3s).

编写代码

import json
import requests
import io
import base64
from PIL import Image, PngImagePlugin

url = "http://127.0.0.1:7861"

payload = {
    "prompt": "puppy dog",
    "steps": 5
}

response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload)

r = response.json()

for i in r['images']:
    image = Image.open(io.BytesIO(base64.b64decode(i.split(",",1)[0])))

    png_payload = {
        "image": "data:image/png;base64," + i
    }
    response2 = requests.post(url=f'{url}/sdapi/v1/png-info', json=png_payload)

    pnginfo = PngImagePlugin.PngInfo()
    pnginfo.add_text("parameters", response2.json().get("info"))
    image.save('output.png', pnginfo=pnginfo)

查看结果

可以看到,一张可爱的小狗图就生成了!

prompt

报错处理

问题 1

NansException: A tensor with NaNs was produced in Unet. This could be either because there's not enough precision to represent the picture, or because your video card does not support half type. Try setting the "Upcast cross attention layer to float32" option in Settings > Stable Diffusion or using the --no-half commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.

分析

Unet是一种用于图像分割的神经网络架构。它由一个编码器-解码器结构组成,其中相应的层之间有跳跃连接。编码器逐渐降低输入图像的空间分辨率,而解码器上采样特征图并恢复原始分辨率。

一个全是NaN的张量意味着张量中的值不是数字,而是未定义或无效的。这可能有各种原因,比如除以零、溢出、下溢或数据类型错误。

一个可能的解决方案是将交叉注意力层提升为float32,这是一种比half(float16)更高精度的数据类型。这可以防止数值错误并提高计算的准确性。你可以通过在设置>稳定扩散中设置“将交叉注意力层提升为float32”选项或在运行Unet时使用--no-half命令行参数来实现这一点。

另一个可能的解决方案是使用支持half类型的不同显卡,这是一种低精度的数据类型,可以减少内存使用和加速计算。但是,这可能取决于你的硬件和预算,可能不可行或不可取。

你也可以通过使用--disable-nan-check命令行参数来禁用NaN检查。这将忽略任何NaN值并继续执行。但是,这不推荐,因为它可能导致不正确的结果或后续的错误。

交叉注意力层是Unet中的一个模块,它可以在编码器和解码器之间传递信息,从而提高分割性能。交叉注意力层可以根据输入图像的内容自动调整特征图的权重,从而过滤掉不相关的特征。

如果你在设置>稳定扩散中设置了“将交叉注意力层提升为float32”选项或在运行Unet时使用了--no-half命令行参数,但仍然出现NaNs的错误,可能有以下几种原因:

  • 你的显卡不支持float32类型,或者显存不足以存储高精度的张量。
  • 你的输入图像有异常值,比如负数、无穷大或非数字,导致计算出错。
  • 你的网络参数有错误,比如学习率过大、激活函数不合适或损失函数不稳定,导致梯度爆炸或消失。

解决方案:

为了解决这个问题,你可以尝试以下几种方法:

  • 检查你的显卡是否支持float32类型,并确保显存足够。如果不支持或不足,你可以考虑更换显卡或降低输入图像的分辨率。
  • 检查你的输入图像是否有异常值,并进行预处理,比如归一化、裁剪或填充。
  • 检查你的网络参数是否合理,并进行调整,比如降低学习率、更换激活函数或损失函数。

问题 2

A group logo image, the group name is: mother Part-time Job Group

Steps: 20, Sampler: DPM++ 2M, Schedule type: Karras, CFG scale: 7, Seed: 2130491275, Size: 640x480, Model hash: 879db523c3, Model: dreamshaper_8, Version: v1.10.1

解决方案

暂无

参考

Stable Diffusion本地安装部署教程:适用于苹果电脑Mac OS系统M系列芯片:MacBook/iMac等

出图效率倍增!47个高质量的 Stable Diffusion 常用模型推荐

sdwui-docs