Stable Diffusion 资料

AI画图  收藏
0 / 1445
  • 第一部分
    • 一、 Features:Textual Inversion(文本反转)
      • 1.1 Textual Inversion 简介
        • 1.1.1 摘要
        • 1.1.2 算法
        • 1.1.3 模型效果
      • 1.2 Textual Inversion of webai
        • 1.2.1 预训练embedding用于图片生成
        • 1.2.2 训练embedding
        • 1.2.3 Finding embeddings online
        • 1.2.4 Hypernetworks
    • 二、 Features: Negative prompt
    • 三、Xformers依赖
    • 四、NVidia GPUs安装
      • 4.1 自动安装
      • 4.2 自定义安装
    • 五、命令行参数和优化
    • 六、安装和使用自定义脚本
  • 第二部分 kaggle notebook
    • 一、模型部署
      • 1.1 kaggle notebook
      • 1.2 colab、windows部署
    • 二、进阶教程
      • 2.1 Prompt运用规则及技巧
      • 2.2 Model资源
      • 2.3 Embedding/ Hypernetwork使用及训练
      • 2.4 Dreambooth使用及训练
      • 2.5 插件介绍

第一部分

本文翻译自stable-diffusion-webui官方文档

一、 Features:Textual Inversion(文本反转)

Textual Inversion:论文、博客,知乎贴、《paper笔记》

1.1 Textual Inversion 简介

1.1.1 摘要

  文生图模型为通过自然语言指导创作提供了前所未有的自由。然而,目前尚不清楚如何运用这种自由来生成特定独特概念的图像,修改其外观,或将其合成新角色和新场景。换言之,要把现实中的一些新概念(new concept)引入到生成中,单从文本出发还是不够的。

  本文提出了 personalized text-to-image generation,即个性化的文转图生成。可以基于文本+用户给的3-5张图(“new concepts”)来生成新的图像。

  提出了textual inversions,用于把图片概念转换成pseudo-words(伪单词)。然后一起合并到prompt中,从而生成一些具备这样概念的图片。

1.1.2 算法

  在大多数文生图模型的文本编码阶段,第一步是将prompt 转换为数字表示,而这通常是通过将words转换为tokens来完成的,每个token相当于模型字典中的一个条目(entry)。然后将这些entries转换为embeddings进行训练。

  我们发现了可以添加用户提供的special token (S*,表示新概念)来作为新的embedding。然后,将这个embedding link到新的伪单词,伪单词可以同其它词一样被合并到新的句子中。在某种意义上,我们正在对冻结模型的文本嵌入空间进行反转,所以我们称这个过程为Textual Inversion(文本反转)。

  我的理解,之前都是将文本编码为embedding进行训练,而Textual Inversion是将用户提供的图片(“A photo of S*”)以embedding的形式链接到某个伪单词上来表示一种概念。即embedding→文本,和之前是相反的过程。

模型结构如下图所示:
在这里插入图片描述

  • 本文是基于latent diffusion做的,只改进了其中text encoder部分的词表部分,添加S*来表达新概念,其它token的embedding不变,从而实现与新概念的组合。
  • 为了训练S*对应的文本编码v*,使用prompt “A photo of S*”生成新的图片,我们希望这个概念生成图片和用户给的图片相符合,从而学习到v*这个新概念。学到之后就可以利用S*来做新的生成了。
  • 损失函数:让通过这个句子prompt产生的图片和用户给的small sample(3~5张图)越近越好:
    在这里插入图片描述

1.1.3 模型效果

  1. Image Variations:相似图生成
      因为embedding 的学习目标本身就是要生成一摸一样的图片,所以本文的相似图生成效果很好:
    在这里插入图片描述
  2. Text-guided synthesis(文本引导生成)
    下面是基于学到的新概念的生成:

在这里插入图片描述

  和CLIP guided的方法的对比:最相近的工作是PALAVRA——把新概念图片先得到image embedding,再用对比学习的方法转成text embedding,然后再进行生成,而本文是直接学习pseudo-word。在guided diffusion中,有init image的生成效果会好很多,但是还是会出现原来图片变形的问题。

  1. Style transfer(风格迁移)
    通过in the style of 这样的prompt可以实现风格迁移:

在这里插入图片描述

Textual Inversion可以用来表示广泛的概念,包括视觉艺术风格。在某种意义上,我们可以学习一个代表特定艺术家或新艺术运动的伪词,并在未来的创作中模仿它。

  1. Concept compositions(概念组合)
    不同图片概念,组合起来进行生成,Unfortunately, this doesn’t yet work for relational prompts, so we can’t show you our cat on a fishing trip with our clock.
    在这里插入图片描述
  2. Downstream applications
    我们的伪词适用于下游模型。例如,将旧照片添加一些新元素来增加它们的趣味性:(把第二排图片中蓝色部分替换为第一排的元素)
    在这里插入图片描述
  3. Reducing Biases(减少偏见,略)

1.2 Textual Inversion of webai

参考《Features:Textual Inversion》

   webai允许用户使用Textual Inversion 将自己的图片进行训练,得到一个embedding(预训练的embedding),用于指导新图片的生成。这个预训练embedding是一个.pt.bin文件(前者是原始作者使用的格式,后者是diffusers library使用的格式)。

1.2.1 预训练embedding用于图片生成

  将预训练好的embedding(嵌入)放入embeddings目录,并在prompt中使用其文件名,无需重新启动程序即可生成新的图片。例如,下面是webai作者在WD1.2模型上,用53张图片(增强成119张)训练19500步后得到的Usada Pekora embedding。

在这里插入图片描述

prompt:portrait of usada pekora,Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 4077357776, Size: 512x512, Model hash: 45dee52b

您可以在一个prompt中组合多个embedding:(相比上图prompt多加了一个词——mignon)

在这里插入图片描述

prompt:portrait of usada pekora,mignon,Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 4077357776, Size: 512x512, Model hash: 45dee52b

  使用embedding生成新的图片时的模型,最好和训练这个embedding时的模型保持一致,否则生成效果可能不好。下面是WD1.2模型训练的usada pekora embedding,用在stable diffusion 1.4上进行生成的效果:(prompt和参数保持不变,但是生成的图片不是最开始的风格了)
在这里插入图片描述

prompt:portrait of usada pekora,Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 4077357776, Size: 512x512, Model hash: 45dee52b

1.2.2 训练embedding

  1. embedding训练说明
    • 该功能非常原始,使用风险自负
    • 创建一个新的empty embedding,选择待训练图像的目录,进行embedding训练。
    • 启用半精度浮点运算,但需试验开启前后效果是不是一样好。如果显存足够,使用--no-half --precision full更安全
    • 用于UI自动运行图像预处理的部分。
    • 中断后重启训练,不会丢失任何数据
    • 不支持batch sizes 或 gradient accumulation(梯度累积,用于显存不足),不支持–lowvram 和 --medvram flags。
  2. 参数说明
    • Creating an embedding
      • name:embedding的文件名。后续在prompt使用这个embedding时就用这个名字。
      • Initialization text(初始化文本):用于新建empty embedding的初始化。
        • 新建后会用Initialization text的embedding填充empty embedding。也就是如果你创建empty embedding后又不训练,那么这个embedding和Initialization text的embedding是一样的。
        • 比如你新建一个名为“zzzz1234”的empty embedding,然后选“tree”这个词作为Initialization text。那么不进行任何训练时,“zzzz1234”和“tree”的embedding是一样的
      • Number of vectors per token:empty embedding的size。
        • 比如webai模型默认prompt的长度上限是75个token,如果设置Number of vectors per token=16,那么你将这个empty embedding加入prompt后,就只能再写75-16=59个token了。
        • empty embedding的size越大,就可以融合更多的主题信息(概念信息),相应的,你就需要更多的图片,才能训练好这个empty embedding。
  • Preprocess:将目录下的图片进行Textual Inversion,并将结果写入另一个目录
    • Source directory:包含图像的目录
    • Destination directory:将写入结果的目录
    • Create flipped copies:对于每个图像,还要写入其镜像副本
    • Split oversized images into two:将过大的图像拆分为两张(短边与所需分辨率相匹配,两张图片可能相交)
    • Use BLIP caption as filename:使用BLIP模型向文件名添加标题。
  • Training an embedding
    • Embedding:从下拉列表中选择要训练的嵌入。
    • Learning rate:学习率,设置得太高,可能会破坏embedding
      • 比如在训练中提示Loss:nan,训练失败)。使用默认值时,不会发生这种情况。
      • 设置多个学习率,比如0.005:100, 1e-3:1000, 1e-5表示前100步lr=0.005,101-1000步时lr=1e-3,最后lr=1e-5。
    • Dataset directory:待训练图像的目录。
    • Log directory:样本图像和部分训练的嵌入副本将写入此目录。
    • Prompt template file: text file with prompts,每行一个,用于训练模型。
      • 训练风格使用style.txt(只需要3、5张图片),训练主题使用subject.txtNumber of vectors per token越大,需要的图片就越多)。文件中可以使用以下tag:
        • [name]:embedding名称
        • [filewords]:来自数据集图像文件名的单词。有关更多信息,请参见下文。
      • 有关如何使用这些文件,请参阅textual_inversation_templates目录中的文件。
    • Max stepsMax steps步后完成训练。模型训练一张图片是一个step。如果您训练中断后重启,会保留step数。
    • Save images with embedding in PNG chunks:每次生成图像时,都会将其与最近记录的嵌入合并,并以可以作为图像共享的格式保存到image_embeddings中,然后将其放入嵌入文件夹并加载。
    • Preview prompt:如果不为空,此prompt将用于生成预览图;如果为空,the prompt from training will be used。
  • filewords
    • [filewords]:提示模板文件( prompt template)的标签,默认下去掉图片文件名前面的数字和破折号(-)就是[filewords],比如图片000001-1-a man in suit.png的[filewords]就是a man in suit,是一个文本。这个文本可用在prompt中。
    • 可以使用选项Filename word regexFilename join string更改文件名中的文本。(感觉没必要,详情看原文档)
  1. 第三方库
    webai训练embeddings时还使用了Stable-textual-inversion_win和InvokeAI这两个github仓库。还有一些是关于diffusers library或者colab上训练的选项。

1.2.3 Finding embeddings online

  • huggingface concepts library :有很多不同的emb
  • 16777216c:NSFW,动漫艺术家风格。
  • Catoroboto:一些匿名的动画embedding。
  • viper1:NSFW,furry girls。
  • anon’s embeddings -NSFW:动漫艺术家。
  • rentry:包含多种SD模型的 Textual Inversion emb
    在这里插入图片描述

1.2.4 Hypernetworks

  Hypernetworks是在不影响模型权重的情况下微调模型的概念。目前是在textual inversion选项卡里训练hypernets,训练方式和textual inversion相同,但是学习率很低,比如5e15或者5e-6。这部分可参考《Hypernetworks训练指南》。
  Unload VAE and CLIP from VRAM when training:这个选项卡允许降低预览图生成速度来减少显存。

二、 Features: Negative prompt

  Negative prompt用于指定不想生成的内容,使用Negative prompt可以消除了Stable Diffusion的常见畸形,比如多余的肢体。Negative prompt可单独使用(即不用 prompt)。
  要使用Negative prompt,只需以下步骤:

# prompts = ["a castle in a forest"]
# negative_prompts = ["grainy, fog"]

c = model.get_learned_conditioning(prompts)
uc = model.get_learned_conditioning(negative_prompts)

samples_ddim, _ = sampler.sample(conditioning=c, unconditional_conditioning=uc, [...])

  采样器(sampler)将比较prompt生成的图片和Negative prompt生成的图片之间的差异,并是最终生成结果逼近前者,远离后者。下面是一个演示:

  • 原始图片有雾状(fog)、颗粒感(grainy,画质低)。Negative prompt为fog后雾状没了但是生成奇怪的紫色
  • Negative prompt为fog,grainy, purple,没有雾状,画质高,也没有奇怪的紫色了。

在这里插入图片描述

negative prompt:None
在这里插入图片描述negative prompt:fog
在这里插入图片描述negative prompt:grainy
在这里插入图片描述negative prompt:fog, grainy, purple

三、Xformers依赖

  Xformers库可以加速图像的生成(可选),没有适用于Windows的二进制文件(除了一个特定的配置外),可自行构建。

  1. linux上构建Xformers的指南:
#切换到webui根目录
source ./venv/bin/activate
cd repositories
git clone https://github.com/facebookresearch/xformers.git
cd xformers
git submodule update --init --recursive
pip install -r requirements.txt
pip install -e
  1. Windows上构建xFormers(见原文档)

四、NVidia GPUs安装

在尝试安装之前,请确保满足所有必需的依赖项。

依赖项包括:

  • 安装Python 3.10.6git
  • 运行git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git下载webai项目,后续可以使用git pull命令更新项目。(windows用户安装git for windows后,在某个文件夹里右键单击选择Git Bash here打开git,运行此命令下载项目。)
  • 下载Stable Diffusion 模型文件(.ckpt)、sd-v1-4.ckpt放在项目根目录下的models/Stable-diffusion文件夹里。
  • Stable-diffusion 2.x 版本的模型,需要下载配套的.yaml配置文件,并放在.ckpt同名的文件夹中:768-v-ema.ckpt config、512-base-ema.ckpt config、512-base-ema.ckpt config

4.1 自动安装

  1. windows:运行webui-user.bat,如果运行失败可以参考Troubleshooting 。
  2. Linux:项目根目录下运行:bash <(wget -qO- https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh)

python launch.py可自动运行模型,运行时可以使用一些命令参数,比如:

python launch.py --opt-split-attention --ckpt ../secret/anime9999.ckpt

4.2 自定义安装

  更改webui-user.sh中的变量,并运行bash webui.sh,接下来自定义安装步骤、AMD GPUs安装、见原文档。此文档还有WSL2安装,conda安装等。

  更多关于安装的详细教程,可以参考帖子《使用stable-diffusion-webui部署NovelAi/Stable Diffusion1.4 /1.5/2.0 保姆级教程、命令解释、原理讲解(colab、windows、Linux )》

五、命令行参数和优化

命令行参数 解释
--share online运行,也就是public address
--listen 使服务器侦听网络连接。这将允许本地网络上的计算机访问UI。
--port 更改端口,默认为端口7860。
--xformers 使用xformers库。极大地改善了内存消耗和速度。Windows 版本安装由C43H66N12O12S2 维护的二进制文件
--force-enable-xformers 无论程序是否认为您可以运行它,都启用 xformers。不要报告你运行它的错误。
--opt-split-attention Cross attention layer optimization 优化显着减少了内存使用,几乎没有成本(一些报告改进了性能)。黑魔法。默认情况下torch.cuda,包括 NVidia 和 AMD 卡。
--disable-opt-split-attention 禁用上面的优化
--opt-split-attention-v1 使用上述优化的旧版本,它不会占用大量内存(它将使用更少的 VRAM,但会限制您可以制作的最大图片大小)。
--medvram 通过将稳定扩散模型分为三部分,使其消耗更少的VRAM,即cond(用于将文本转换为数字表示)、first_stage(用于将图片转换为潜在空间并返回)和unet(用于潜在空间的实际去噪),并使其始终只有一个在VRAM中,将其他部分发送到CPU RAM。降低性能,但只会降低一点-除非启用实时预览。
--lowvram 对上面更彻底的优化,将 unet 拆分成多个模块,VRAM 中只保留一个模块,破坏性能
*do-not-batch-cond-uncond 防止在采样过程中对正面和负面提示进行批处理,这基本上可以让您以 0.5 批量大小运行,从而节省大量内存。降低性能。不是命令行选项,而是使用–medvramor 隐式启用的优化–lowvram。
--always-batch-cond-uncond 禁用上述优化。只有与–medvram或–lowvram一起使用才有意义
--opt-channelslast 更改 torch 内存类型,以稳定扩散到最后一个通道,效果没有仔细研究。

其它详见原文档。

六、安装和使用自定义脚本

  要安装自定义脚本,请将它们放入scripts目录,然后单击设置选项卡底部的Reload custom script按钮。安装后,自定义脚本将出现在txt2img和img2img选项卡的左下方下拉菜单中。以下是Web UI用户创建的一些著名的自定义脚本:

  1. prompt改进脚本:https://github.com/ArrowM/auto1111-improved-prompt-matrix
    • 本脚本支持prompt矩阵格式,用于一次生成多个prompt,每个prompt可生成多张图片(脚本代码)
    • 使用<>创建一个prompt矩阵,矩阵中用|进行分隔。例如a <corgi|cat> wearing <goggles|a hat>,表示4个prompt:a corgi wearing goggles, a corgi wearing a hat, a cat wearing goggles, a cat wearing a hat
    • 如果设置batch count > 1,忽略 batch size,每个seed,每个prompt都会进行生成。
      在这里插入图片描述
  2. txt2img2imghttps://github.com/ThereforeGames/txt2img2img
    大大提高任何角色/主题的可编辑性,同时保持其相似性。该脚本的主要动机是提高通过Textual Inversion.创建的embedding的可编辑性。在这里插入图片描述
  3. txt2maskhttps://github.com/ThereforeGames/txt2mask
    可以使用文本指定mask修复部分,而不是用笔刷。
    在这里插入图片描述
  4. Mask drawing UIhttps://github.com/dfaker/stable-diffusion-webui-cv2-external-masking-script
    提供CV2支持的本地弹出窗口,允许在处理前添加掩码。
  5. Img2img Videohttps://github.com/memes-forever/Stable-diffusion-webui-video
    使用img2img,依次生成图片。
  6. Seed Travelhttps://github.com/yownas/seed_travel
    选择多个种子,并在它们之间生成插值图像序列,或者是一个视频,点此查看示例。
  7. Advanced Seed Blendinghttps://github.com/amotile/stable-diffusion-backend/tree/master/src/process/implementations/automatic1111_scripts
    可以设定seed权重,例如:seed1:2, seed2:1, seed3:1,也可以使用浮点数:seed1:0.5, seed2:0.25, seed3:0.25
  8. Prompt Blending:https://github.com/amotile/stable-diffusion-backend/tree/master/src/process/implementations/automatic1111_scripts
    支持多个prompt的加权组合,例如:Crystal containing elemental {fire|ice},也支持嵌套:Crystal containing elemental {{fire:5|ice}|earth}
  9. Animator:https://github.com/Animator-Anon/Animator
    适用于制作视频

余下内容有空再写了。下面是模型部署和应用的一些资源收集贴,也没有好好整理,感觉太麻烦了。


第二部分 kaggle notebook

一、模型部署

  • 此笔记本基于stable-diffusion-webui项目,默认使用momoko模型,点此即可打开。

1.1 kaggle notebook

  1. 下载项目
#测试GPU
!nvidia-smi

#下载stable-diffusion-webui
%cd /kaggle/working/
!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
    
#在models文件夹下新建新建hypernetworks目录
!mkdir -p  /kaggle/working/stable-diffusion-webui/models/hypernetworks 
%cd /kaggle/working/stable-diffusion-webui/models/Stable-diffusion
  1. 切换喜欢的模型,默认是momoko

    • 更改模型的默认方法是,将input文件夹中你需要的模型移入working/stable-diffusion-webui/models/Stable-diffusion/文件夹下
    • 也可以使用ChangeModel函数更换模型,这种方式是更改读取模型的路径,所以不需要复制模型文件本体。如果模型生成图片老是有点灰色,在下面红色选项框中下拉选择VAE(前提是将模型对应的VAE文件复制到/kaggle/working/stable-diffusion-webui/models/VAE文件夹下)

    ![](ht