文章来源:
作者:hking Stable Diffusion 是 2022 年发布的深度学习文字到图像生成模型。它主要用于根据文字的描述产生详细图像,能够在几秒钟内创作出令人惊叹的艺术作品,本文是一篇使用入门教程。硬件要求
建议使用不少于 16 GB 内存,并有 60GB 以上的硬盘空间。需要用到 CUDA 架构,推荐使用 N 卡。(目前已经有了对 A 卡的相关支持,但运算的速度依旧明显慢于 N 卡,参见:Install and Run on AMD GPUs · AUTOMATIC1111/stable-diffusion-webui Wiki · GitHub
过度使用,显卡会有损坏的风险。 进行 512x 图片生成时主流显卡速度对比:环境部署
手动部署
可以参考 webui 的官方 wiki 部署:Home · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com) stable diffusion webui 的完整环境占用空间极大,能达到几十 G。同时,webui 需要联网下载安装大量的依赖,在境内的网络环境下下载很慢,请自带科学上网工具。- 安装 Python 安装 Python 3.10,安装时须选中 Add Python to PATH
- 安装 Git 在 Git-scm.com 下载 Git 安装包并安装。
- 下载 webui 的 github 仓库 按下win+r输入 cmd,调出命令行窗口。运行:
- 装配模型 可在如Civitai上下载标注有CKPT的模型,有模型才能作画。下载的模型放入下载后文件路径下的models/Stable-diffusion目录。
- 使用 双击运行 webui-user.bat 。脚本会自动下载依赖,等待一段时间(可能很长),程序会输出一个类似 http://127.0.0.1:7860/ 的地址,在浏览器中输入这个链接开即可。详细可参见模型使用。
- 更新 按下win+r输入 cmd,调出命令行窗口。运行:
整合包
觉得麻烦的同学可以使用整合包,解压即用。比如独立研究员的空间下经常更新整合包。秋叶的启动器 也非常好用,将启动器复制到下载仓库的目录下即可,更新管理会更方便。关于插件
Stable Diffusion 可配置大量插件扩展,在 webui 的“扩展”选项卡下,可以安装插件:文生图最简流程
- 选择需要使用的模型(底模),这是对生成结果影响最大的因素,主要体现在画面风格上。
- 在第一个框中填入提示词(Prompt),对想要生成的东西进行文字描述
- 在第二个框中填入负面提示词(Negative prompt),你不想要生成的东西进行文字描述
- 选择采样方法、采样次数、图片尺寸等参数。
- Sampler(采样器/采样方法)选择使用哪种采样器。Euler a(Eular ancestral)可以以较少的步数产生很大的多样性,不同的步数可能有不同的结果。而非 ancestral 采样器都会产生基本相同的图像。DPM 相关的采样器通常具有不错的效果,但耗时也会相应增加。
- Euler 是最简单、最快的
- Euler a 更多样,不同步数可以生产出不同的图片。但是太高步数 (>30) 效果不会更好。
- DDIM 收敛快,但效率相对较低,因为需要很多 step 才能获得好的结果,适合在重绘时候使用。
- LMS 是 Euler 的衍生,它们使用一种相关但稍有不同的方法(平均过去的几个步骤以提高准确性)。大概 30 step 可以得到稳定结果
- PLMS 是 Euler 的衍生,可以更好地处理神经网络结构中的奇异性。
- DPM2 是一种神奇的方法,它旨在改进 DDIM,减少步骤以获得良好的结果。它需要每一步运行两次去噪,它的速度大约是 DDIM 的两倍,生图效果也非常好。但是如果你在进行调试提示词的实验,这个采样器可能会有点慢了。
- UniPC 效果较好且速度非常快,对平面、卡通的表现较好,推荐使用。
- Sampling Steps(采样步数)Stable Diffusion 的工作方式是从以随机高斯噪声起步,向符合提示的图像一步步降噪接近。随着步数增多,可以得到对目标更小、更精确的图像。但增加步数也会增加生成图像所需的时间。增加步数的边际收益递减,取决于采样器。一般开到 20~30。
- 不同采样步数与采样器之间的关系:
- CFG Scale(提示词相关性)图像与你的提示的匹配程度。增加这个值将导致图像更接近你的提示,但它也在一定程度上降低了图像质量。可以用更多的采样步骤来抵消。过高的 CFG Scale 体现为粗犷的线条和过锐化的图像。一般开到 7~11。CFG Scale 与采样器之间的关系:
- 生成批次每次生成图像的组数。一次运行生成图像的数量为“批次* 批次数量”。
- 每批数量同时生成多少个图像。增加这个值可以提高性能,但也需要更多的显存。大的 Batch Size 需要消耗巨量显存。若没有超过 12G 的显存,请保持为 1。
- 尺寸指定图像的长宽。出图尺寸太宽时,图中可能会出现多个主体。1024 之上的尺寸可能会出现不理想的结果,推荐使用小尺寸分辨率+高清修复(Hires fix)。
- 种子种子决定模型在生成图片时涉及的所有随机性,它初始化了 Diffusion 算法起点的初始值。
- 高清修复
通过勾选 “Highres. fix” 来启用。默认情况下,文生图在高分辨率下会生成非常混沌的图像。如果使用高清修复,会型首先按照指定的尺寸生成一张图片,然后通过放大算法将图片分辨率扩大,以实现高清大图效果。最终尺寸为(原分辨率*缩放系数 Upscale by)。
- 放大算法中,Latent 在许多情况下效果不错,但重绘幅度小于 0.5 后就不甚理想。ESRGAN_4x、SwinR 4x 对 0.5 以下的重绘幅度有较好支持。
- Hires step 表示在进行这一步时计算的步数。
- Denoising strength 字面翻译是降噪强度,表现为最后生成图片对原始输入图像内容的变化程度。该值越高,放大后图像就比放大前图像差别越大。低 denoising 意味着修正原图,高 denoising 就和原图就没有大的相关性了。一般来讲阈值是 0.7 左右,超过 0.7 和原图基本上无关,0.3 以下就是稍微改一些。实际执行中,具体的执行步骤为 Denoising strength * Sampling Steps。
- 面部修复修复画面中人物的面部,但是非写实风格的人物开启面部修复可能导致面部崩坏。
- 点击“生成”
提示词
提示词所做的工作是缩小模型出图的解空间,即缩小生成内容时在模型数据里的检索范围,而非直接指定作画结果。提示词的效果也受模型的影响,有些模型对自然语言做特化训练,有些模型对单词标签对特化训练,那么对不同的提示词语言风格的反应就不同。提示词内容
提示词中可以填写以下内容:- 自然语言 可以使用描述物体的句子作为提示词。大多数情况下英文有效,也可以使用中文。避免复杂的语法。
- 单词标签 可以使用逗号隔开的单词作为提示词。一般使用普通常见的单词。单词的风格要和图像的整体风格搭配,否则会出现混杂的风格或噪点。避免出现拼写错误。可参考Tags | Danbooru (donmai.us)
- Emoji、颜文字 Emoji (💰👨👩🎅👼🍟🍕) 表情符号也是可以使用并且非常准确的。因为 Emoji 只有一个字符,所以在语义准确度上表现良好。关于 emoji 的确切含义,可以参考Emoji List, v15.0 (unicode.org),同时 Emoji 在构图上有影响。
💐👩💐
提示词语法
根据自己想画的内容写出提示词,多个提示词之间使用英文半角符号 [ , ],如: masterpiece, best quality, ultra-detailed, illustration, close-up, straight on, face focus, 1girl, white hair, golden eyes, long hair, halo, angel wings, serene expression, looking at viewer 一般而言,概念性的、大范围的、风格化的关键词写在前面,叙述画面内容的关键词其次,最后是描述细节的关键词,大致顺序如: (画面质量提示词), (画面主题内容)(风格), (相关艺术家), (其他细节) 不过在模型中,每个词语本身自带的权重可能有所不同,如果模型训练集中较多地出现某种关键词,我们在提示词中只输入一个词就能极大地影响画面,反之如果模型训练集中较少地出现某种关键词,我们在提示词中可能输入很多个相关词汇都对画面的影响效果有限。提示词的顺序很重要,越靠后的权重越低。关键词最好具有特异性,譬如 Anime(动漫)一词就相对泛化,而 Jojo 一词就能清晰地指向 Jojo 动漫的画风。措辞越不抽象越好,尽可能避免留下解释空间的措辞。 可以使用括号人工修改提示词的权重,方法如:- (word) - 将权重提高 1.1 倍
- ((word)) - 将权重提高 1.21 倍(= 1.1 * 1.1)
- [word] - 将权重降低至原先的 90.91%
- (word:1.5) - 将权重提高 1.5 倍
- (word:0.25) - 将权重减少为原先的 25%
- (word) - 在提示词中使用字面意义上的 () 字符
请把代码中的替换为自己想下载的目录。
cd PATH_TO_CLONE
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
请把代码中的:替换为自己下载仓库的目录。
cd PATH_TO_CLONE
git pull
例如: a [fantasy:cyberpunk:16] landscape 在一开始,读入的提示词为:the model will be drawing a fantasy landscape. 在第 16 步之后,提示词将被替换为:a cyberpunk landscape, 它将继续在之前的图像上计算 又例如,对于提示词为: fantasy landscape with a [mountain:lake:0.25] and [an oak:a christmas tree:0.75][ in foreground::0.6][ in background:0.25][shoddy:masterful:0.5],100 步采样, 一开始。提示词为:fantasy landscape with a mountain and an oak in foreground shoddy 在第 25 步后,提示词为:fantasy landscape with a lake and an oak in foreground in background shoddy 在第 50 步后,提示词为:fantasy landscape with a lake and an oak in foreground in background masterful 在第 60 步后,提示词为:fantasy landscape with a lake and an oak in background masterful 在第 75 步后,提示词为:fantasy landscape with a lake and a christmas tree in background masterful 提示词还可以轮转,譬如 在第一步时,提示词为“cow in a field”;在第二步时,提示词为”horse in a field.”;在第三步时,提示词为”cow in a field” ,以此类推。
[to:when] 在指定数量的 step 后,将to处的提示词添加到提示
[from::when] 在指定数量的 step 后从提示中删除 from处的提示词
[from:to:when] 在指定数量的 step 后将 from处的提示词替换为 to处的提示词
Token
实际上,程序是将输入的关键词以 Token 的形式传入模型进行计算的:提示词模板
可参考Civitai | Stable Diffusion models, embeddings, hypernetworks and more中优秀作品的提示词作为模板。 类似的网站还有:- Majinai:MajinAI | Home
- 词图:词图 PromptTool - AI 绘画资料管理网站
- Black Lily:black_lily
- Danbooru 标签超市:Danbooru 标签超市
- 魔咒百科词典:魔咒百科词典
- AI 词汇加速器:AI 词汇加速器 AcceleratorI PromptNovelAI 魔导书:NovelAI 魔导书
- 鳖哲法典:鳖哲法典
- Danbooru tag:Tag Groups Wiki | Danbooru (donmai.us)
- AIBooru:AIBooru: Anime Image Board
Controlnet
Controlnet 允许通过线稿、动作识别、深度信息等对生成的图像进行控制。 请注意,在使用前请确保 ControlNet 设置下的路径与本地 Stable Diffusion 的路径同步基本流程
- 点击 Enable 启用该项 ControlNet
- Preprocessor 指预处理器,它将对输入的图像进行预处理。如果图像已经符合预处理后的结果,请选择 None。譬如,图中导入的图像已经是 OpenPose 需要的骨架图,那么 preprocessor 选择 none 即可。
- 在 Weight 下,可以调整该项 ControlNet 的在合成中的影响权重,与在 prompt 中调整的权重类似。Guidance strength 用来控制图像生成的前百分之多少步由 Controlnet 主导生成,这点与[:]语法类似。
- Invert Input Color 表示启动反色模式,如果输入的图片是白色背景,开启它。
- RGB to BGR 表示将输入的色彩通道信息反转,即 RGB 信息当做 BGR 信息解析,只是因为 OpenCV 中使用的是 BGR 格式。如果输入的图是法线贴图,开启它。
- Low VRAM 表示开启低显存优化,需要配合启动参数“—lowvram”。
- Guess Mode 表示无提示词模式,需要在设置中启用基于 CFG 的引导。
- Model 中请选择想要使用解析模型,应该与输入的图像或者预处理器对应。请注意,预处理器可以为空,但模型不能为空。
可用预处理/模型
- canny 用于识别输入图像的边缘信息。
- depth 用于识别输入图像的深度信息。
- hed 用于识别输入图像的边缘信息,但边缘更柔和。
- mlsd 用于识别输入图像的边缘信息,一种轻量级的边缘检测。它对横平竖直的线条非常敏感,因此更适用于于室内图的生成。
- normal 用于识别输入图像的法线信息。
- openpose 用于识别输入图像的动作信息。
OpenPose Editor 插件可以自行修改姿势,导出到文生图或图生图。
- scribble 将输入图像作为线稿识别。如果线稿是白色背景,务必勾选“Invert Input Color”
- fake_scribble 识别输入图像的线稿,然后再将它作为线稿生成图像。
- segmentation 识别输入图像各区域分别是什么类型的物品,再用此构图信息生成图像。
如果想绘制一张符合 segementation 规范的图像,可以使用以下色表绘制。color_coding_semantic_segmentation_classes - Google 表格
多 ControlNet 合成
在 ControlNet 的设置下,可以调整可用 ControlNet 的数量。模型
模型下载
模型能够有效地控制生成的画风和内容。常用的模型网站有:Civitai | Stable Diffusion models, embeddings, hypernetworks and more > Models - Hugging Face > SD - WebUI 资源站 > 元素法典 AI 模型收集站 - AI 绘图指南 wiki (aiguidebook.top) > AI 绘画模型博物馆 (subrecovery.top)
模型安装
下载模型后需要将之放置在指定的目录下,请注意,不同类型的模型应该拖放到不同的目录下。模型的类型可以通过Stable Diffusion 法术解析检测。- 大模型(Ckpt):放入 models\Stable-diffusion
- VAE 模型:一些大模型需要配合 vae 使用,对应的 vae 同样放置在 models\Stable-diffusion 或 models\VAE 目录,然后在 webui 的设置栏目选择。
- Lora/LoHA/LoCon 模型:放入 extensions\sd-webui-additional-networks\models\lora,也可以在 models/Lora 目录
- Embedding 模型:放入 embeddings 目录
模型使用
- Checkpoint(ckpt)模型 对效果影响最大的模型。在 webui 界面的左上角选择使用。
- Lora 模型 / LoHA 模型 / LoCon 模型
- Embedding
模型训练
环境搭建
以GitHub - bmaltais/kohya_ss为例,它提供了在 Windows 操作系统下的 GUI 训练面板。 如果需要在 Linux 上部署且需要 GUI,请参考GitHub - P2Enjoy/kohya_ss-docker: This is the tandem repository to exploit on linux the kohya_ss training webui converted to Linux. It uses the fork in the following link
- 首先,以管理员模式启动 Powershell,执行“Set-ExecutionPolicy Unrestricted”命令,并回答“A”。然后可以关闭该窗口。
- 启动一个普通的 Powershell 窗口,在需要克隆该仓库的路径下,执行以下命令:
环境更新
如果需要更新仓库,请执行以下命令:界面启动
在 Powershell 中执行: 双击 gui.bat 也可以。弹出以下界面后,直接访问 URL 即可。训练流程
模型训练主要有三种结果:欠拟合,效果好,过拟合。欠拟合:模型完全没有从数据集中学习到经验,对各种输入都得出差距很大的结果。效果好:模型不仅对训练集中的输入有接近的结果,对不来自训练集中的输入也有接近的效果。过拟合:模型只训练集中的输入有非常非常接近的结果,对不来自训练集中的输入给出差距很大的结果。1. 准备训练集
图片尽可能高清,风格统一但内容形式多样(譬如动作多样、服装多样)。2. 图片裁剪
将训练集裁剪为多个尺寸相同的图片。可以在 SD webui 界面中自动裁剪,也可以手动裁切。3. 图片打标
- 关键词生成 可以在训练环境的页面下打标:
【本义:一个在铁匠铺里打铁的男铁匠】
打标器 | 效果 | 效果(中文翻译) |
---|---|---|
Stable Diffusion webui-训练-图像预处理-BLIP | a man in a kitchen with a fire in the fireplace and a hammer in his hand and a hammer in his other hand | 一个男人在厨房里,壁炉里生着火,手里拿着锤子,另一只手拿着锤子 |
Stable Diffusion webui-训练-图像预处理-deepbooru | 1boy, black_gloves, gloves, indoors, male_focus, shirt, short_sleeves, solo | 一个男孩,黑色手套,手套,室内,男人特写,衬衫,短袖,单人 |
Stable Diffusion webui-Tagger(WD14) | 1boy, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, facial hair, bandana, blue shirt, shirt | 一个男孩,烹饪,煎锅,男人特写,单人,手套,围裙,火,棕色鞋,黑色手套,靴子,炉子,厨房,握着,胡子,头巾,蓝色衬衫,衬衫 |
kohya webui-Utilities-Captioning-BLIP Captioning | a man is working on a piece of metal | 一个男人正在加工一块金属 |
kohya webui-Utilities-Captioning-GIT Captioning | a drawing of a blacksmith with a hammer and a glove on his hand. | 一幅画,画的是一个手上戴着手套、拿着锤子的铁匠。 |
打标对图片的描述越准越好,如果条件允许,尝试人工打标。
- 关键词合并 在生成出的关键词中,我们需要把与训练目标强相关的关键词划为一个统一的特征表述。以”1boy, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, facial hair, bandana, blue shirt, shirt”为例,假如我们的训练对象就是一个男性大胡子,那么他必然始终携带着”男人、胡子“这两个要素,那么我们可以用一个词总结这个角色,例如用”Smith“替代”1boy,facial hair”,整条句子将变为:
- | - |
---|---|
原关键词 | 1boy, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, facial hair, bandana, blue shirt, shirt |
合并后 | Smith, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, bandana, blue shirt, shirt |
- 编组 一些具有同组关系的图片可以利用关键词引导 AI 去归纳它们。譬如,我们训练的对象 Smith 有三张图,分别是全图、背景、前景,那么我可以如此处理:
4. 正则化
训练集中的每张图片通常能被分解为两大部分:“训练目标+其他要素”,依然以 Smith 为例:- | 完整内容 | 训练目标 | 其他要素 |
---|---|---|---|
![]() |
在铁匠铺里打铁的铁匠 Smith | Smith | 铁匠铺、打铁、铁匠 |
5. 文件路径组织
在训练前,我们需要用特定的方式组织文件路径:譬如,训练目标是一群女孩,其中有一位名为 sls 的女孩好一位名为 cpc 的女孩,那么文件路径应该为: ●train_girls ——○10_sls 1girl ——○10_cpc 1girl ●reg_girls ——○1_1girl 其中,traingirls 目录下放置的是训练集,命名规则是“训练次数<标识符> <类别>”,如“10_sls 1girl”表示“名为 sls 的对象,她是一个女孩(类别),这个文件夹下的训练集每个训练 10 次”。 reggirls 目录下放置的是正则化内容。命名规则是“训练次数<类别>”,如“1_1girl“表示”文件夹下的图片都是一个女孩,不重复使用数据“。*需要日后补充6. 训练参数
在 kohya webui 界面训练时,ckpt 与 lora 训练方法类似。a. 底模
b. 最大分辨率 Max resolution
Training parameters 下的 Max Resolution 用于指定当前输入训练集图片的分辨率,请与文件夹内的保持一致。如果尺寸不一会被裁切。c. Epoch

d. Batch size
e. Save every N epochs
f. 学习率 Learning Rate
g. 学习率调度器 Learning Rate Scheduler
- adafactor:自适应学习率。
- constant :恒定,学习率不变。
- constant_with_warmup:恒定预热。学习率在开始会增大一点,然后退回原学习率不变。
- Cosine:使用余弦函数来调整学习率,使其在训练过程中逐渐降低。常被称为余弦退火。
- cosine_with_restarts:余弦退火重启。在 consine 的基础上每过几个周期将进行一次重启,该值在选择后可以设定。
- linear:线性。学习率线性下降。
- Polynomial:使用多项式函数来调整学习率。
h.学习率预热比例 LR warmup
i. 优化器 Optimizer
- Adam:一种常用的梯度下降算法,被广泛应用于神经网络模型的优化中。它结合了动量梯度下降和自适应学习率方法的优点,既可以加快收敛速度,又可以避免学习率调整不当导致的振荡和陷入局部最优解。并且对于不同的参数有不同的学习率,更加适用于高维度的参数空间。
- AdamW:对 Adam 算法的改进方案,对惩罚项参数进行控制,能更好地控制模型的复杂度,防止模型过拟合,提高泛化性能。
- AdamW8bit:8bit 模式的 AdamW,能降低显存占用,略微加快训练速度。
- Adafactor:自适应优化器,对 Adam 算法的改进方案,降低了显存占用。参考学习率为 0.005 1 。
- DAdaptation2:自适应优化器,比梯度下降(SGD)方法更加稳定有效、使用时请将学习率设置为 1。
- Lion3:自适应优化器,节省更多显存、速度更快,与 AdamW 和 Adafactor 相比有 15%左右的加速。参考学习率为 0.001。
- SGDNesterov:一种常用的优化算法,基于梯度下降(SGD)方法进行优化,通过引入动量的概念加速收敛速度。
- SGDNesterov8bit:8bit 模式的 SGDNesterov,能降低显存占用,略微加快训练速度。
j. Text Encoder 与 Unet
机器不能直接识别人类的语言,Text Encoder 是一种用于将文本数据转换为机器可读形式的模型或算法。对于输入的一串提示词,程序会将它们分解为一个个标记(Token)输入给 Text Encoder(一个 Token 通常代表着一个特征),这样一句话就能被转为一个向量为机器所识别 4 Unet 是一种用于图像分割的深度学习模型,它的作用是将图像分割为多个不同的构成部分。经过训练后,它可以来填充图像中缺失或损坏的部分,或者对灰度草图进行着色。5

k. Network Rank(Dimension)
l. Network Alpha
m. Caption Dropout
n. Noise Offset
o.xformers
p. Gradient checkpointing
q. shuffle caption
r. Token
s. Clip Skip