Stable Diffusion 那些事

随手记录有关 Stable Diffusion 的笔记

stable diffusion

链接汇总:
Stable Diffusion 潜工具书(非常推荐)
Home · AUTOMATIC1111/stable-diffusion-webui Wiki
Tutorials - Stable Diffusion Art
AiDraw - AiDraw
Stable Diffusion 信息并联&入门教程 - 飞书云文档
绘世启动器帮助
SD常见报错合集(更新到2023.12.27)
stable diffusion工作流分享
NovelAI.Dev
AiDraw | AiDraw
Latent Couple 可视化区域设置
Anime Remove Background - a Hugging Face Space by skytnt
OneFormer - a Hugging Face Space by shi-labs
Grounded Segment Anything - a Hugging Face Space by yizhangliu
密码的nai3 tag创想(AI绘画tag分享)
森林的NAI-V3法典
ComfyUI Examples | ComfyUI_examples
cubiq/ComfyUI_Workflows
ComfyUI 解説 (wiki ではない)
ComfyUI Community Manual
WASasquatch/comfyui-plugins
ComfyUI Nodes Info
Comfy Workflows
ComfyUI Workflows - Developer Community
wyrde/wyrde-comfyui-workflows
atlasunified/Templates-ComfyUI-
AIGODLIKE社区
ComfyUI Tutorial
ComfyUI Tutorial - 中文
Home - InvokeAI Documentation


原理

一些比较好的解析
【AI绘画】大魔导书:AI 是如何绘画的?Stable Diffusion 原理全解(一) - 哔哩哔哩
深入浅出讲解Stable Diffusion原理,新手也能看明白 - 知乎
What are Diffusion Models? | Lil’Log


提示词书写

正向提示词书写通式:

质量前缀(可忽略)+前置画风引导+前置镜头效果+前置光照效果+[带描述的主物+主物的各种次要物+镜头效果和光照]*X+全局光照效果+全局镜头效果+画风滤镜

其中,各主物之间优先按预期构图重要度顺序排序,各次要物优先按含主物的联想关系顺序排序,在无明显顺序差异时颜色相同的主物或次要物应靠近。例外在于存在错误元素绑定、需要隔离时,相关元素尽可能互相远离。所有镜头、光照和画风均为可选项,且为避免反应过于复杂而建议各不超过 3 种
质量提示词只对融合novelai的模型有效,距离novelai越远越不需要质量提示词

提示词的数量

首先,prompt 并不可以随意堆积,不是越多越好。
模型读取 promot 有着明确的先后顺序,这体现为理解顺序的不同
prompt 的顺序将影响画面的组织方式,越靠前的 prompt 对构图的影响越“重”,而越靠后的则往往会成为靠前 prompt 的点缀或附加物。顺序对于构图的影响在大多数情况下甚至大于权重的影响。
不过在少数情况或极其复杂的场景中,叠加式构图有可能因为其它尚未在此介绍的原因而失效

权与重

一对小括号意味着把括起来的 prompt 权重 * 1.1,中括号则是 / 1.1,大括号在 WEB-UI 中无调整权重作用,且会被作为文本而解析。

如果因为某些需求而要大量抬升权重,可以对 prompt 进行多次括号,比如((((prompt)))),这意味着将它的权重 * 1.1 四次,也就是 1.4641。但这个写法太吓人了,数括号也很浪费时间,所以应该直接为一个 prompt 赋予权重:
(prompt:权重乘数)
外层一定是小括号而非其它括号。比如 (red hair:1.5) 将直接给 red hair 赋予 * 1.5 权重,清晰简洁,便于自己回顾和他人理解,强烈推荐。
但务必请不要做出诸如 ((red hair:1.5)) 的奇怪写法。虽然在大多数情况下,它们的确会产生互相叠乘的正常效果,但在某些离谱的情况下则会导致权重无效。

而除了整词权重之外,也可以进行部分权重,比如如下例子:
1 girl, white long (messy:1.2) hair, red eyes
将专门对 messy 部分赋予 * 1.2 权重,其它部分不受影响。

高权重的元素会在画面中有着更大的占比或更强烈的存在感或更多的数量,是能可观地影响构图的原因之一。笔者非常不建议给出十分离谱的权重值,三个小括号也只有 1.3 左右,而一般来说 1.6 就已经很极端地占据画面了,再高至例如 2.0 只会在大多数情况下让咒语变成召 唤 古 神。

高级咒术解析

上述的小括号、中括号与带权重小括号都属于低阶语法,比如(((prompt)))。而接下来要介绍的是更长更复杂一些的高阶语法。
高阶语法都以 [] 作为外层包括,包括分步描绘、融合描绘两种,使用高阶语法时这一对中括号不会让权重降低。高阶语法内可以嵌套低阶语法,低阶语法内也可以嵌套高阶语法——但为了交流方便不建议嵌套,高阶语法之间能否互相嵌套因具体情况不同而异,下文会做出介绍。
下列介绍全部基于编纂本篇时推出的最新版 WEB-UI,对于 NAIFU 或较旧版 WEB-UI 可能不适用。

首先介绍分步描绘的各种形式:
[from:to:step]
[from::step] (to 为空)
[:to:step] (from 为空)
[to:step] (奇怪但没问题的格式,非常不建议)
它的作用是让 prompt 在达到 step 之前被视为 from,在达到后视为 to。若是在对应位置留空则视为无对应元素。step 为大于 1 的整数时表示步数,为小于 1 的正小数时表示总步数的百分比。
比如 a girl with [green hair:red hair flower:0.2] 会在前 20% 步数被视为 a girl with green hair,在后 80% 步数被视为 a girl with red hair flower。需要注意这两个描述之间的兼容性和覆盖——在步数合适的情况下,最后形成的人物会拥有绿色头发和红色花饰,但也可能因为颜色溢出导致头发也变为红色,毕竟后 80% 没有绿色头发的限定,AI 完全可以自己理解一个随机的发色。

在最新版中,分步描绘可以嵌套,形如 [from:[to:end:step2]:step1] 的语句是可以被正确识别的。且分步描绘现在支持逗号分割,形如 [1 girl, red hair: 2 girls, white hair:0.3] 的语句也可以被正确识别。
分步描绘不特别擅长细化细节,与其分步描绘不如将细化部分直接写入持续生效的部分。分步描绘更擅长在画面初期建立引导,大幅影响后续构图或画面生成。
需要注意的是,分步描绘具有视觉延后性——当要求 AI 在比如第 20 步开始描绘另一个不同的物体时,可能在比如第 24 步(或更晚)才能从人眼视觉上感知到另一个物体勉强出现在画面中。这是因为 AI 看待图片的方式和人眼看待图片的方式不同,在 AI 的认知里图片已经初具新物体的特性的时候,人眼可能依然看不出来。

然后介绍融合描绘的两种形式:
[A | B]
[A:w1 | B:w2]
它们还有分别对应的可无限延长版:
[A | B | C | …]
[A:w1 | B:w2 | C:w3 | …]
对于形如 [A | B] 的第一种,AI 将在第一步画 A、第二步画 B、第三步画 A…交替进行。而对于无限延长版,则变为第一步画 A、第二步画 B、第三步画 C…循环往复交替进行。
对于形如 [A:w1 | B:w2] 的第二种带权重版本,截至这句话被写下时仍由 NAIFU 端独占(且本语法在 NAIFU 端的中括号是不必要的),它的实际效果不是先画 w1 步 A 然后再画 w2 步 B,虽然成品效果类似。若在 WEB-UI 端上强行使用则会导致权重数字被作为文本读取,虽然会让画面变得不同但实际上并非加权导致的效果。它的运作方式和双端都支持的 [A | B] 略有不同但效果类似,相较而言有着支持自定义比例的独特优势。

当然,WEB-UI 有着看上去类似的 [(A:w1) | (B:w2)] 语法,但它的本质其实是嵌套了一层加权,也同样不是可以自定义各部分的步数。这样的加权是对于整个咒语而言而非对于中括号内的其它部分而言的,作用域不同,所以笔者不认为这和 NAIFU 端的写法完全相同。
融合描绘不可嵌套,但同样支持逗号分割。融合描绘擅长将两种事物混合为一起,比如 a [dog | frog] in black background。

这两个高阶语法有着明显的区别,尤其是在高步数下更不可以一概而论。分步描绘的 40 步 A 再加上 40 步 B 最后可能形成一个带有 B 基底特征的 A,但它会表现出明显的分立感。而融合描绘的 40 步 A 再加上 40 步 B 最后将形成简直像是化在一起的融合体。

短元素,中元素与长元素

咏唱大致有着三种不同形式——最常见的直接咏唱、稍不常见的短句咏唱和堪称行为艺术一般的长咏唱。
假设要生成一个有着黄色头发、蓝色眼眸、白色上衣、红色裙子、黑色裤袜的全身坐姿二次元美少女,且强调服饰颜色,那么这三种咏唱分别看上去大概是这样的:

直接咏唱(pitch 式咏唱):
masterpiece, best quality, 1 girl, (blue eyes), (yellow hair), (white clothes), (red skirt), (black leggings), sitting, full body

短句咏唱(AND 强调咏唱):
masterpiece, best quality, 1 girl, (blue eyes) AND (yellow hair), (white clothes) AND (red skirt) AND (black leggings), sitting, full body

长咏唱(自然语言咏唱):
masterpiece, best quality, (1 girl with blue eyes and yellow hair wearing white clothes and red skirt with black leggings), sitting, full body

注意短句咏唱的 AND 必须是三个大写字母,AND 两侧的小括号是不必要的(但建议加上),这是一个专用语法,不过因为效果仍未明晰所以不单独介绍。此外,该语法并不能应用于所有采样方法,例如 DDIM 就不支持 AND,会导致报错。

不同咏唱方法不会显著改变咒语的解析方式,直接咏唱总是难以很好地绑定元素颜色,短句式咏唱会有明显元素颜色错误,但是错误的视觉占比变小,长咏唱没有出现明显元素颜色错误,很好地处理了各个颜色与元素的绑定关系
长咏唱能加强主体与元素之间的绑定关系、提高不同元素之间的区分度,在有明确绑定需求的情况下优于 pitch 式咏唱;直接咏唱则更擅长处理关系要求不强的情景,往往能营造更多样化的场面;短句式咏唱介于两者之间
咏唱的关键在于也几乎必须要用一个小括号包括整个句子,以略微提升权重(权重略大于 1.0 的情况下表现最佳,但太大就有点过头了),否则无法和直接咏唱拉开差距。

这即为“元素污染”这一概念的根本原因和初级建议应对方法。

提示词关联性

采用直接咏唱的方式,但不难发现输入的咒语依然一定程度上具备自然语言的特征—-以逗号隔开,词与词之间有着形如自然语言间隔一样的距离,而且在一定程度上的顺序加持下表现更好
在考虑到了顺序的大关系之后,词与词之间的距离这一更细节的构成也是十分重要的。距离较近的词的确更容易产生关联、进行叠加,而更远的则倾向于降低互相的关联性、进而互相隔离

占位提示词

占位词可以用于进一步调整词与词的距离,从而加强切割某些不希望绑定在一起的元素,是“元素污染”情况的又一有力解决方案
词与词之间也不能毫无节制地加入占位词来降低关系。词与词之间的关联度似乎和距离有着一定程度上的反比例关系或保底关联度,因此加入过多占位词不会有额外的好处,适量添加即可
在sd中,每75个单词为一段,每两段描述之间几乎是弱关联或者无关联,通常使用这个特性来防止元素混乱
75个单词之后的作用效果很弱,除非强行提高权重
BREAK为sd的标准占位符,意思是占满75个单词的剩余所有位置
BREAK打断的是整体的关联,BREAK后面的部分跟前面的部分不会有强关联

提示词的联想关系

许多 tag 有着逻辑上合理的“前置”关系,比如存在 sword 这个 tag 的作品往往还存在 weapon 这个 tag、存在 sleeves past finger 这个 tag 的作品往往还存在 sleeve past wrists 这个 tag。
这样在训练集中往往共存且有强关联的 tag,最终会让模型处理包含它的咒语时产生一层联想关系。
在出现联想关系的情况下,词与被联想的词的距离是最小的
联想词之间极易互相强化,进而提高画面的稳定性。例如给人物稳定添加一把剑的最好做法不是仅加上 sword,而是加上 weapon, sword。同理,其他存在强联想且希望出现的元素也推荐同时在咒语内连续出现。
为了在画面内取消两个词之间的联想,最简单但不一定有效的做法是将被联想词写入负面咒语并加上较高权重。如果没有效果,那么不妨试一试在咒语内加上被联想词的对立面,比如用 aged up 对抗 flat chest 对于 child 的强联想。

emoji的使用

Emoji 是单个字符,可以无视 SD 框架对它识别时的一切拆分尝试,以最短的字符长度代表出一个概念。
它的信息密度的分母是最小的,信息量与其它词相比却差不多,所以信息密度高到吓人,因而导致其准确度高到可怕。
而还因为它信息密度如此之高,它受权重影响也大得难以描述,一对小括号就能体感上产生(prompt:1.35)左右的强大效果。
想要修手?用✋或其它想要的手势。想要群像?👪屡试不爽。想要烟花背景?🎇驱散一切问题。想要难以被描绘的骷髅头骨?💀出场就是现在。铅笔画风?✏秒了。浮世绘?🎏解决。哪怕是最难凹的海盗船,也只需要一个🏴‍☠️就能展现了!甚至,只需要♿和动态模糊(motion blur)的描述,就能即时上演轮椅漂移的戏码。
想要解决一切问题?看看有没有EMOJI可以表达它。

emoji大全:
Emoji大全 | Emoji表情符号词典 📓 | EmojiAll中文官方网站

可参考资料:
元素同典:确实不完全科学的魔导书
Tags基本编写逻辑及三段术式入门与解析v3
浅考sd-webui大括号{}处理.pdf
[C站/社区常用高质量提示词]High quality parameters on Civitai&community - v2.0 | Stable Diffusion Other | Civitai


图片高分

高分辨率修复

可用的放大算法(可自行添加而外的放大算法)

放大算法 描述 推荐重绘幅度
Latent 基于 VAE 模型的图像增强算法,通过将原始图像编码成潜在向量,并对其进行随机采样和重构,从而增强图像的质量、对比度和清晰度。一般情况下,这个算法就能得到不错的效果,和4x-UltraSharp、R-ESRGAN等相比,显存消耗比较小,但效果不是最优 >0.5,小于0.5会导致画面出现模糊(可用于制作景深效果)
Lanczos 将对称矩阵通过正交相似变换变成对称三对角矩阵的算法(鸡肋,通常不用) 0.2~0.4
ESRGAN 是对SRGAN关键部分网络结构、对抗损失、感知损失的增强。从这里开始就不是单纯的图像算法,进入人工智能的领域了。实测确实增加了很多看上去很真实的纹理,但是有时又会把一张图片弄得全是锯齿或怪异的纹理。可能对待处理的图片类型有要求 0.2~0.4
4x-UltraSharp 基于ESRGAN做了优化模型,更适合常见的图片格式。真人模型最佳选择 0.2~0.4
ESRGAN 4x 完全使用纯合成数据去尽量贴近真实数据,然后去对现实生活中数据进行超分的一个方法 0.2~0.4
R-ESRGAN 4x+(推荐) 基于Real ESRGAN的优化模型,针对照片效果不错 0.2~0.4
R-ESRGAN 4x+ Anime6B(推荐) 基于Real ESRGAN的优化模型,二次元最佳,如果你的模型是动漫类的,该选项是最佳选择 0.2~0.4
SwinIR_4x 使用Swin Transformer思想,采用一个长距离连接,将低频信息直接传输给重建模块,可以帮助深度特征提取模块专注于高频信息,稳定训练 0.2~0.4
LDSR Stable Diffusion最基础的算法模型,但速度比较慢 0.2~0.4
  • 高分迭代步数
    设置进行高分辨率修复的步数

  • 重绘幅度
    高分辨率修复时在原图上铺噪声的强度,幅度越高,画面的变化越大

文生图放大

启用高分辨率修复 (Hires. fix),放大算法选择R-ESRGAN 4x+ Anime6B(三次元选择R-ESRGAN 4x+),重绘幅度在0.2~0.4
放大倍数调的比较大的时候,开启Tiled VAE降低显存占用

图生图放大

放大有以下几种放大

  • 直接图生图
  • Ultimate SD upscale 扩展
  • Tiled Diffusion 扩展
  • ControlNet Tile
  • StableSR

放大的时候建议打开Tiled VAE降低显存占用


采样器说明

  • 1、采样器基础:

带a的采样器,祖先采样器:生成的画面不收敛
带Karras的采样器:渲染时间一样,但在大约8步采样后,噪点就会比不带Karras的少了
带Exponential算法:画面会更柔和一些,背景更干净一些,但细节会少一些
3M新算法:速度和2M一致没有改变,需要更多的采样步骤,适当调低一点点CFG效果会更好,大于30步采样可以选用

  • 2、老派采样器:

LMS:线性多步法,速度和Euler差不多,实测没Euler稳定,容易出色块
LMS Karras:LMS的Karras算法
Heun:Euler的改进算法,但速度慢一倍
Euler:经典ODE采样器,简单直接,不容易出错,中规中矩,收敛
Euller a:Euler祖先采样器,不收敛
DDIM:最早的采样器,已经过时
PLMS:最早的采样器,已经过时

  • 3、DPM采样器:

DPM2:DPM的2代算法,画质更好,但速度比1代慢一倍
DPM2a:DPM的2代祖先采样器
DPM++2S a:DPM单步算法
DPM++2S a Karras:DPM单步Karras算法
DPM++2M:DPM 2阶多步算法
DPM++2M Karras:推荐算法,收敛,速度快,质量ok
DPM++SDE:随机微分方程,调用了祖先采样,速度慢,生成高通真度的图像
DPM++SDE Karras:SDE的karras算法,渲染真实系人物时推荐
DPM++2M SDE:不收敛,2M和SDE两者的平衡,速度保持2M一致
DPM++2M SDE Karras:2M SDE的karras算法
DPM++2M SDE Exponential:2M SDE的Exponential算法
DPM++2M SDE Heun:2M+SDE+Heun算法
DPM++2M SDE Heun Karras:2M+SDE+Heun的Karras算法
DPM++2M SDE Heun Exponential:2M+SDE+Heun的Exponential算法
DPM++3M SDE:3M SDE算法,速度和2M一致没有改变,需要更多的采样步骤,适当调低一点点CFG,效果会更好,大于30步采样可以选用
DPM++3M SDE Karras:3MSDE的Karras算法
DPM++3M SDE Exponential:3MSDE的Exponential算法,画面会更柔和一些,背景更干净一些,但细节会少一些
DPM2 Karras:DPM的2代算法,画质更好,但速度比1代慢一倍
DPM2 a Karras:DPM的2代算法,画质更好,但速度比1代慢一倍
DPM fast:DPM快速算法,效果很差,基本不用
DPM adaptive:不考虑采样步数,自适应时长来渲染画面,渲染时间很长

  • 4、新派采祥器:

UniPC:UniPC(Unified Predictor-Corrector)2023年新算法,统一预测校正器,兼容性很好,收敛,10步左右就能生成可用画面
Restart:每步渲染速度慢一些,但几步就有效果,比UniPC还少步数,就能生成质量不错的画面

推荐的预处理器搭配

  • Eular a + uniform / exponential | 20 步
  • DPM++系 + exponentia / rho = 0.666 的 polyexponential | 20 步
  • Restart + 自动 | 10 步
  • Unipc + 自动 | 13 步

exponential 就是 rho = 1 的 polyexponential


FP32 FP16 FP8 的区别

fp32、fp16、fp8 这其实是三种精度格式,fp是floating-point的缩写,它的另一个叫法是float,全称是half-precision floating-point,其实就是半精度浮点数
在AI模型中就是三种存储格式,fp32指的是用32位二进制表示的浮点数,fp16就是16位,fp8就是8位
fp32最完整,可以携带和存储的信息最多,所以在大部分时候,默认使用的是fp32,也就是你看到的那些controlnet模型,每一个都是1.35G的原因
实际上在webUI中,默认使用的是FP16。即便你提供FP32的模型,它在运算之前还是会先转换为FP16的再使用,因此实际上对于普通用户来说,直接使用FP16模型才是最优选择,因为反正都要转为FP16的,与其安装FP32再让程序转为FP16,还不如一开始就下载FP16的模型,尺寸小了一半,效果不会有任何区别——因为本来程序就要转为FP16
FP16要比FP32运行速度更快,理论极限是2倍速度差,但因为实际运行比较复杂,肯定不可能这么高,但总之能够提高很大的速度
而FP8跟FP32到FP16的原理一样,8是16的一半,所以速度更快
FP32和FP16的运行结果完全一致,但FP8的运行结果确实与FP16和FP32有细微区别,但这种区别微乎其微,而且不存在好坏的区别,FP8甚至会看起来更加舒适
总的来说,无论是大模型还是什么类型的模型,只要有FP16就用FP16,有FP8就用FP8,可以有效提高载入和运行速度
但是,最后有一点需要特别注意,FP16和FP8的模型,理论上只适合使用GPU运行,CPU模式运行下似乎只能使用FP32的

参考:
【AI绘画】模型修剪教程:8G模型顶级精细?全是垃圾!嘲笑他人命运,尊重他人命运 - 哔哩哔哩
[琥珀開發紀錄] 4G顯存就能跑SDXL?!? FP8優化簡介_哔哩哔哩_bilibili
LLM大模型之精度问题(FP16,FP32,BF16)详解与实践 - 知乎


Lora

Lora 作用层及作用

lora作用在U-NET中,在 SD1.5 中总共作用在17层中,如下

lora的作用位置
BASE 1
IN 2,3,4,5,6,7
MID 8
OUT 9,10,11,12,13,14,15,16,17

lora作用的不同层对出图的影响

层次 效果 数值
1 固定 必须写1,不然不稳定
2,3,4,5 角色的服装特征与背景
6 背景
7 躯干服装与动作 效果大,数值保守写
8 躯干动作
9,10 面部、躯干的动作与角色特征 效果中等,数值写0.8~1
12,13,14,15 背景
16,17 上色风格

这些权重可使用lora-block-weight插件进行调整,调用lora的时候可这样写

格式 例子
<lora:lora的名字:lora权重:分层权重> <lora:Hutao:0.75:lbw=0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0>
<lora:lora的名字:lora权重:分层权重预设> <lora:Hutao:0.75:lbw=ALL>

一些lora分层的预设

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 身体
BODY:1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1
BODY0.5:1,1,1,1,1,1,0.2,1,0.2,0,0,0.8,1,1,1,1,1

# 脸部(脸型、发型、眼型、瞳色等)
FACE:1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0
FACE0.5:1,0,0,0,0,0,0,0,0.8,1,1,0.2,0,0,0,0,0
FACE0.2:1,0,0,0,0,0,0,0,0.2,0.6,0.8,0.2,0,0,0,0,0

# 修手专用
HAND:1,0,1,1,0.2,0,0,0,0,0,0,0,0,0,0,0,0

# 服装(搭配tag使用)
CLOTHING:1,1,1,1,1,0,0.2,0,0.8,1,1,0.2,0,0,0,0,0

# 动作(搭配tag使用)
POSE:1,0,0,0,0,0,0.2,1,1,1,0,0,0,0,0,0,0

# 上色风格(搭配tag使用)
PALETTE:1,0,0,0,0,0,0,0,0,0,0,0.8,1,1,1,1,1

# 角色(去风格化)
KEEPCHAR:1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0

# 背景(去风格化)
KEEPBG:1,1,1,1,1,1,0.2,1,0.2,0,0,0.8,1,1,1,0,0

# 减弱过拟合(等同于OUTALL)
REDUCEFIT:1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1

Lora 分层的值需根据实际进行测试,不同 LoRA 的每一层控制的内容都不一致。

其他种类的 Lora 所控制的层数需参考:hako-mikan/sd-webui-lora-block-weight
类似的插件:Merge Block Weight
帮助文档:Merge Block Weight 魔法密录


ControlNet

ControlNet是一种神经网络结构,通过添加额外的条件来控制扩散模型,使生成的图像更可控

功能

  • 低显存模式

降低Controlnet模型对显存的占用

  • 完美像素模式

让ControlNet自适应预处理分辨率,开启后Preprocessor Resolution将隐藏

  • 允许预览

预处理器处理完图片后展示处理解决

  • 控制权重

Controlnet对画面的控制强度

  • 引导介入时机

Controlnet介入生图过程并引导生图过程的时机

  • 引导终止时机

Controlnet退出生图过程的时机

缩放模式

  • 仅调整大小

调整图像大小并拉伸以适应新的纵横比

  • 裁剪后缩放

在保持纵横比的同时进行缩放,直到图像完全覆盖该区域(将切断纵横比的差异)

  • 缩放后填充空白

缩放直到图像完全在框内,缺失的空间将为黑色

控制模式

  • 均衡

提示词和controlnet共同对生图过程起作用

  • 更偏向提示词

增强提示词对生图过程的作用,减少controlnet对生图过程的作用

  • 更偏向ControlNet

无提示词模式,增强controlnet对生图过程的作用,减少提示词对生图过程的作用

控制类型

  • Canny (硬边缘)

使用粗略的线条描绘图片中物体的边缘(没有lineart那么细致),生成线稿图。生图过程中使用线稿图约束物体的边缘

可用预处理器 描述
canny 硬边缘检测,提取图像的轮廓
  • Depth (深度)

生成一个灰度图,通过灰度的深浅描述物品的前后远近关系,指导大模型生成图片时物品的远近关系

可用预处理器 描述
depth_leres LeReS 深度图估算,细节更多,但也倾向于渲染背景
depth_leres++ LeReS 深度图估算++,更多细节
depth_midas MiDaS 深度图估算,经典的深度估算器,也用于官方v2深度到图像模型
depth_zoe ZoE 深度图估算,细节水平介于 Midas 和 Leres 之间
  • NormalMap (法线贴图)

生成从输入图像派生的基本法线贴图,该图像使用了三种颜色:红色、绿色和蓝色。在3D程序领域,这些颜色用于确定物体表面的感知光滑度或凹凸度。每个颜色通道对应于一个特定的方向,例如左/右、上/下和朝/远,从而可以在三维环境中模拟复杂的表面特征

可用预处理器 描述
normal_bae Bae 法线贴图提取,使用Bae等人提出的正态不确定性方法估计法线图
normal_midas Midas 法线贴图提取,跟据Midas深度图估计法线贴图
  • OpenPose (姿态)

将图片中的人物动作分析出来,并生成骨骼图,指导大模型绘制人物时的动作

可用预处理器 描述
animal_openpose 动物姿态提取
dw_openpose_full 二阶蒸馏 - 全身姿态估计,OpenPose_full的增强版本
openpose OpenPose 姿态,检测眼睛、鼻子、眼睛、颈部、肩部、肘部、手腕、膝盖和脚踝
openpose_face OpenPose 姿态及脸部
openpose_faceonly OpenPose 仅脸部
openpose_full OpenPose 姿态、手部及脸部
openpose_hand OpenPose 姿态及手部
  • MLSD (直线)

将图片中的场景(不包括人物)使用直线进行轮廓的大致描绘,生成大致的线条结构图。在生图过程通过线条结构图约束场景中大物件的边缘,常用于场景设计

可用预处理器 描述
mlsd M-LSD 直线线条检测,提取具有直边的轮廓,例如室内设计、建筑物、街景、相框和纸张边,曲线将被忽略
  • Lineart (线稿)

使用更加精细的线条对图片进行描绘,生成线稿图。在生图过程中通过线稿图约束物体的边缘,常用于比较精细地还原物品的结构,保持构图结构

可用处理器 描述
lineart_standard 标准线稿提取 - 白底黑线反色
lineart_realistic 写实线稿提取,此预处理器旨在生成逼真的线条。它旨在捕捉传统手绘素描或插图的细微差别和特征,模拟更逼真、更自然的线条质量
lineart_coarse 粗略线稿提取,粗线条粗略预处理器可生成具有较重权重的逼真样式的线条。它强调大胆的笔触和较粗的线条,从而产生更明显和大胆的外观
lineart_anime_denoise 动漫线稿提取 - 去噪,线条艺术预处理的这种变体侧重于生成细节较少的动漫风格线条。它应用降噪算法来简化和平滑线条,从而使外观更干净、更复杂
lineart_anime 动漫线稿提取,此预处理器专门用于生成动漫风格的线条。它应用了一种线条渲染技术,模仿了日本动画艺术作品中常见的独特线条
  • SoftEdge (软边缘)

将图片中物体的边缘用软边缘线条进行描绘,生成线条图。在生图过程中通过线条图约束物体的边缘,常用于还原物品的大致结构,保持构图结构

可用预处理器 描述
softedge_hed 软边缘检测 - HED
softedge_hedsafe 软边缘检测 - 保守 HED 算法
softedge_pidinet 软边缘检测 - PiDiNet 算法
softedge_pidisafe 软边缘检测 - 保守 PiDiNet 算法
  • Scribble/Sketch (涂鸦/草图)

将图片处理成涂鸦,类似手绘的效果,然后利用生成的涂鸦图片指导大模型生图,常用于自己画一张粗糙的涂鸦,使用该涂鸦来生成一张效果不错的图片

可用预处理器 描述
scribble_hed 涂鸦 - 整体嵌套,适用于重新着色和重新设计图像
scribble_pidinet 涂鸦 - 像素差分,结果类似于 HED,但通常会导致线条更清晰,细节更少
scribble_xdog 涂鸦 - 强化边缘
t2ia_sketch_pidi 文本到图像自适应控制 - 草绘边缘像素差分
  • Segmentation (语义分割)

Segmentation将图片进行语义分割,将不同的画面元素用不同的颜色进行标注,生成语义分割图。在生图的过程中使用语义分割图指导大模型在对应的区域绘制不同颜色对应的物品,常用于大致规划图片构图

可用预处理器 描述
seg_anime_face 语义分割 - 动漫面部
seg_ofade20k 语义分割 - OneFormer 算法 - ADE20k 协议
seg_ofcoco 语义分割 - OneFormer 算法 - COCO 协议
seg_ufade20k 语义分割 - UniFormer 算法 - ADE20k 协议
  • Shuffle (随机洗牌)

Shuffle将图片进行随机变换,然后将变换后的图像作为参考,指导图片生成的过程(风格迁移?)

可用预处理器 描述
shuffle 随机洗牌,“搅动”或重新排列输入图像的像素值。它引入了颜色的随机洗牌或排列,从而产生原始图像的修改版本。这个过程可以通过改变图像中的颜色分布和排列来产生有趣且不可预测的视觉效果
  • Tile/Blur (分块/模糊)

Tile将图片分割成一个个小区快,在对每个小区快进行重绘,同时降低显存的压力。Tile不仅可以用作图片放大,增加图片的细节,也可以保持图片的整体构图不被改变,可用于风格转换
Blur将图片进行高斯模糊,用作生成图片的参考,有点类似图生图,但整体构图不会改变太多

可用预处理器 描述
tile_resample 分块 - 重采样
tile_colorfix+sharp 分块 - 固定颜色 + 锐化
tile_colorfix 分块 - 固定颜色
blur_gaussian 模糊 - 高斯模糊
  • 局部重绘

重绘画笔涂抹过的区域,和stable diffusion webui自带的局部重绘功能类似,但可以实现更好的效果

可用预处理器 描述
inpaint_only 仅局部重绘
inpaint_only+lama 仅局部重绘 + 大型蒙版
inpaint_Global_Harmonious 重绘 - 全局融合算法
  • InstructP2P

将提示词作为命令,指定修改图片中的元素

  • Reference (参考)
    将输入的图片作为参考,有点类似图生图。相对于图生图的效果,画面有着更多样的变化,不会过于呆板,输入图的风格也能迁移到生成出来的图片中
可用预处理器 描述
reference_adain 仅参考输入图 - 自适应实例规范
reference_adain+attn 仅参考输入图 - 自适应实例规范 + Attention链接
reference_only 仅参考输入图
  • Recolor (重上色)

根据提示词的描述,对黑白的图片进行上色

可用预处理器 描述
recolor_intensity 重上色 - 调节 “图像强度” 以去色
recolor_luminance 重上色 - 调节 “图像亮度” 以去色
  • Revision

使用CLIP分析图片,并指导图片的生成(反推tag并使用tag指导生图?),但对图片的控制效果不强,弱于Reference,并且预处理过程会消耗较大的内存

可用预处理器 描述
revision_clipvision CLIP 集成嵌入图像提示 - 作为补充
revision_ignore_prompt CLIP 集成嵌入图像提示 - 忽略原有提示词
  • T2I-Adapter

T2I-Adapter和Controlnet的功能类似,但控制原理和Controlnet不同。虽然控制能力比Controlnet弱,但控制模型的体积更小。T2I-Adapter既可以使用自己配套的预处理器,也可以使用Controlnet的预处理器

可用预处理器 描述
T2ia_Color_Grid 文本到图像自适应控制 - 色彩像素化
T2ia_Sketch_PiDi 文本到图像自适应控制 - 草绘边缘像素差分
T2ia_Style_Clipvision 文本到图像自适应控制 - 风格迁移
  • IP-Adapter

IP-Adapter使用CLIP分析输入图片的信息,并将得出的信息作用于图像的生成过程中(将图片作为了提示词,并且对输入图片的理解能力更强,出图效果更好,总体效果比Revision要好)。IP-Adapter常用于迁移画风,并搭配其他控制构图的Controlnet一起使用

可用预处理器 描述
ip-adapter_clip_sd15 图像提示词自适应控制 - CLIP - SD1.5
ip-adapter_clip_sdxl 图像提示词自适应控制 - CLIP - SDXL
ip-adapter_clip_sdxl_plus_vith 图像提示词自适应控制 - CLIP - SDXL(升级版)

参考:
ControlNet: A Complete Guide - Stable Diffusion Art
ControlNet
lllyasviel/ControlNet-v1-1-nightly
[Major Update] sd-webui-controlnet 1.1.400 · Mikubill/sd-webui-controlnet · Discussion #2039
tencent-ailab/IP-Adapter
ControlFit - Which resize mode do you use? : r/StableDiffusion


ControlNet 的应用

线稿提取

准备需要提取线稿的图片和白色背景的图片,进入图生图界面
正向提示词框填入lineartposing sketchmonochrome这些描述线稿的提示词,然后将白色背景导入图生图界面中
启用第一个controlnet,勾选上传独立的控制图像,导入需要提取线稿的图片,预处理器选择lineart_anime,controlnet模型选择lineart_anime
生图参数中,重绘幅度调至0.95(重绘幅度越高,线稿的线条越深),然后生图

线稿清理

将线稿图片导入tagger插件进行反推,把提示词导入图生图中,填写好反向提示词
将重绘幅度调至0.5,如果线稿比较潦草时可以调高重绘幅度

重绘幅度较高时,图片会带有淡淡的色彩,加上lineartposing sketchmonochrome这些描述线稿的提示词可以稍微抑制这种效果

启用第一个controlnet,导入线稿图片,预处理器选择invert,controlnet模型选择scribble,控制权重可以适当提高一点
然后进行图片生成,如果效果不理想可多生成几次,得到想要的效果后可以对线稿进行放大
将重绘尺寸调大,并且重绘尺寸的比例和线稿图片的比例相同
把原先的controlnet模型改成canny,如果显存较小,开启Tiled VAE降低显存占用
然后进行生图,得到的图片不仅分辨率大了,线条也变得比较干净

线稿上色

将线稿图片使用tagger插件进行tag反推,然后将tag导入文生图界面,删去不需要的tag并补充一些tag来描述画面
启用第一个controlnet,导入线稿图片
预处理器选择invert/canny或者lineart/lineart_anime/lineart_standard,controlnet模型选择canny或者lineart/lineart_anime
然后进行生图,如果出现色彩问题,可适当降低控制权重

预处理器如果选择invert,有概率导致控制效果变差

如果想要将上色好的图片进行放大,则将图片发送到图生图中,调整重绘尺寸倍数,重绘幅度调至0.5,开启Tiled VAE
然后启用第一个controlnet,勾选上传独立的控制图像,参数和上面步骤的相同,然后进行生图

图像特征迁移与人物换装

准备一张用于迁移特征的原图和一张用于接收特征的原图
将用于迁移特征的原图导入tagger插件中进行图片tag反推,然后将tag发送到文生图中,删除掉不需要的tag
启用三个controlnet,分别设置参数
controlnet1:
导入用于迁移特征的原图,预处理器选择reference_adain+attn,用于指导生成人物特征
controlnet2:
导入用于接受特征的原图,预处理器选择softedge_hed,controlnet模型选择softedge
控制权重调到0.6,控制模式选择更偏向提示词,用于指导还原人物外形
controlnet3:
导入用于接受特征的原图,在人物上用画笔绘制需要接受特征的位置的遮罩
预处理器选择inpaint_global_harmonious,模型选择inpaint,控制模式选择更偏向ControlNet
然后开始生图,生成的图片中遮罩部分有了特征图的特征
可以用绘制遮罩指定接受特征的位置,也可以更换迁移特征的原图,得到类似的换装的效果

为人物生成多套服装

进入文生图界面,提示词框写描写人物服饰的tag
启用3个controlnet,将需要进行生成服饰的图片导入:
controlnet1:
预处理器选择openpose/dw_openpose_full,模型选择openpose,控制权重调至2。控制模式选择更偏向 ControlNet
controlnet2:
将人物原本的服饰用画笔涂上蒙版,预处理器选择inpaint_global_harmonious,模型选择inpaint
controlnet3(可选):
模型选择ip2p,控制权重调至0.6,用于保持画面一致性
然后生成图片

为服装生成人物

准备好服装的图片(最好白色背景),将图片tag进行反推,然后将tag复制到文生图中,并检查、修改提示词,调整生图分辨率
启用第一个controlnet,导入服装的图片
预处理器选择tile_resample,controlnet模型选择tile,控制权重调至0.75
控制模式选择更偏向 ControlNet,缩放模式选择缩放后填充空白
然后生图,生成的图像已经出现了人物,但人物受到白色背景的影响而发白
这时把图片和参数发送至图生图,启用第一个controlnet
预处理器选择lineart/lineart_anime,controlnet模型选择lineart/lineart_anime
然后进行生图,再次生成的图像中人物的颜色就鲜艳很多了

使用图像提示融合图像与风格重建

进入文生图界面,启用第一个controlnet,导入风格图像,预处理器选择ip-adapter_clip,controlnet模型选择ip-adapter/ip-adapter_plus
启用第二个controlnet,导入用于控制构图的图片,预处理器和controlnet模型的类型可选择canny/lineart/depth等用于控制图像整体构图组合
正向/反向提示词根据需求填写,然后生图

ip-adapt把图片作为提示词进行输入,和文本提示词、controlnet模型一起配合完成图片生成

扩充图片区域

反推需要扩充的图片的tag,并适当增加描述
将需要扩充图片区域的图片提前扩充区域,然后导入第一个controlnet,使用画笔工具将需要扩充的区域涂上蒙版
预处理器选择inpaint_global_harmonious,controlnet模型选择inpaint,控制模式选择更偏向提示词
第二个controlnet导入参考图,用于给扩充区域进行参考,预处理器选择reference_only

图片风格融合

在图生图界面中,导入需要被融合风格的图片
启用第一个controlnet,预处理器选择lineart_anime_denoise/lineart_anime,控制模型选择lineart
启用第二个controlnet,勾选“上传独立的控制图像”,导入用于统一风格的图片,预处理器选择tile_resample,控制模型选择tile,控制权重调到0.1
设置完这些后即可进行生图,当然还可以加上提示词来控制图片
在文生图界面中也是类似操作只是导入被融合的图像的位置改成controlnet的选项卡中

去除图片中的人物

将需要去除人物的图片进行裁剪,截取背景的部分(不包含人物),对该部分进行tag反推
将反推得到的tag复制到文生图的提示词框中,检查提示词是否有问题
检查完成后,将需要去除人物的图片导入controlnet中,将人物用画笔进行涂抹
预处理器选择inpaint_global_harmonious,controlnet模型选择inpaint,控制模式选择更偏向提示词
控制权重可适当提高

为人物添加背景

准备好背景的tag(可以加上人物的tag),复制到文生图的提示词框中
将需要添加为人物添加背景的图片导入3个controlnet中
第一个controlnet的预处理器选择lineart_anime_denoise/lineart_anime,controlnet模型选择lineart
第二个controlnet的预处理器选择t2ia_color_grid,controlnet模型选择t2iadapter_color,控制权重调成0.5,引导时机为0~0.5
第三个controlnet的预处理器选择tile_resample,controlnet模型选择tile,控制权重调成0.5,引导时机为0.5~1

大致原理:使用lineart生成线稿控制人物的形体,t2ia_color为线稿填充颜色,tile细化画面

图片局部替换

打开文生图界面,启用第一个controlnet,导入需要进行局部替换的图,然后使用画笔工具涂抹图片中需要替换的物品
预处理器选择inpaint_global_harmonious,模型选择inpaint
提示词描述写上对新物品的描述,最后开始生图,新物品就会替换被涂抹区域的物品了

controlnet的inpaint相对于stable-diffusion-webui的局部重绘,重绘区域和非重绘区域之间的过渡更加和谐
因为controlnet的inpaint模型不仅把把被涂抹的区域进行重绘,也把未被涂抹的区域进行了重绘,所以重绘效果会更好

命令修改图片内容

进入文生图界面,启用第一个controlnet,导入图片,预处理器选择none,controlnet模型选择ip2p
正向提示词写上需要修改的内容的描述,反向提示词正常填写
最后生成图片,此时就会发现图片整体保持原样,但是被描述的东西被画成你所描述的样子

ip2p相当于命令SD根据你的描述去修改图片中的内容

人物设计概念生成

进入图生图界面,导入参考图
启用第一个controlnet,预处理器选择shuffle,controlnet模型选择shuffle
控制模式选择更偏向提示词,提示词根据你想要的结果去描述,然后生成图片
最后的图片整体布局不会有太大的变化,但是设计风格和样子已经随着提示词而改变

ControlNet inpaint only替换背景优化方法:潜空间图像修复

进入文生图界面。启用第一个controlnet,导入需要重绘背景的图片,将背景用画笔画出遮罩
预处理器选择inpaint_only,controlnet模型选择inpaint
提示词填入描述新背景的图片,然后开始生图,这时候得到一张人物与背景融合不是很完美的图片
打开高分辨率修复 (Hires. fix),放大算法选择latent,高分迭代步数选择2,重绘幅度选择0.01,固定图片的种子

1、高分迭代步数选择1会出现UnboundLocalError: local variable 'h' referenced before assignment
2、重绘幅度选择0.01会出现RuntimeError: min(): Expected reduction dim to be specified for input.numel() == 0. Specify the reduction dim with the 'dim' argument.

然后进行生图,这样就可以得到一张放大的潜空间图像(latent space image),而且遮罩外面的部分得到了保留
发送图片到图生图,将重绘幅度设置为0.2~0.4,保证图片整体不会有太大的变化
启用Loopback脚本,重绘幅度曲线设置为激进(Aggressive),在每次迭代时添加何种反推模型反推出的提示词设置为DeepBooru
点击生成,得到的图像中,人物和背景比较好的融合在一起,并且背景有一点柔和的景深效果

这个方法本质是就是高清修复的工作过程,利用前面的几个步骤在文生图中生成低分辨率的图像,再使用放大器保留或增强细节,然后发送到图生图中重绘
参考:
[1.1.202 Inpaint] Improvement: Everything Related to Adobe Firefly Generative Fill · Mikubill/sd-webui-controlnet · Discussion #1464
New High res fix · AUTOMATIC1111/stable-diffusion-webui · Discussion #650909

去除背景的景深效果

进入图生图界面,输入描述图片背景的tag,tag可以使用tagger插件进行反推
将图片导入PBRemTools插件,在蒙版设置启用选项卡,图像切分提示词填入需要切割出来的内容,比如1girl
然后点击提交,生成蒙版,将蒙版保存下来(蒙版可以使用ps之类的图片编辑软件制作)
回到图生图界面,选择上传重绘蒙版,导入原图和蒙版图片(蒙版用于保护蒙版区域不会被重绘)
蒙版模式选择重绘非蒙版内容,重绘区域选择仅蒙版区域,重绘幅度调到0.5
启用第一个controlnet,预处理器选择tile_resample,controlnet模型选择tile
控制权重适当提高,提高画面的还原能力,控制模式选择更偏向提示词
启用回送(Loopback)脚本,最终重绘幅度适当拉高,最后生成图像


Tiled VAE 和 Tiled Diffusion 的使用

参考:Home · pkuliyi2015/multidiffusion-upscaler-for-automatic1111 Wiki

Tiled Diffusion

  • Tiled Diffusion

该功能用于放大图片,增加图片的清晰度
启用后,Tiled Diffusion 将图片分割成多个小块并送入潜空间进行降噪,再将这些分块融合成一张图片,该步骤将重复多次
注意,Tiled Diffusion 需配合 Tiled VAE 一起使用

可选方案

  • MultiDiffusion
  • Mixture of Diffusion

推荐使用 Mixture of Diffusion 这个放大方案,该方案可选择更小的潜空间分块重叠

  • 潜空间分块宽度与高度

这个值设置了将图片分块后,送入潜空间时其大小,通常该值的设置与模型推荐的出图分辨率有关。若模型推荐的出图分辨率为768~1024,则将该值除以8后将得到96~128这个推荐的值。该值越高,占用的显存越高

个人测试的时候这个值建议调高而不是调低,该值较高的时候可缓解放大后出现鬼影的问题

  • 潜空间分块重叠

重叠可减少融合时的接缝,减少分块融合时带来的瑕疵的影响。但当该值越大时,生成图片所需的时间越长。

插件作者建议的值

  • MultiDiffusion:32~48
  • Mixture of Diffusion:16~32

将该值调高可缓解放大后出现鬼影的问题,但是不如调高潜空间分块宽度与高度那么有效

  • 潜空间分块单批数量

该值用于设定同时处理的分块数量,该值越高,所需的显存越高

  • 放大算法

该选项可选择放大时选择使用的算法

  • 放大倍数

这个值就是放大图片分辨率的倍数了

下面列举一个可以参考的值

  • 方案:Mixture of Diffusion
  • 潜空间分块宽度与高度:128
  • 潜空间分块重叠:16
  • 潜空间分块单批数量:8
  • 放大算法:R-ESRGAN 4x+ Anime6B
  • 放大倍数:3

如果放大后出现鬼影的情况,可将正向提示词中用于具体描写内容的提示词删去,只留下画风提示词和质量提示词(插件作者推荐)

其实不删也行,比如我就是不删的。如果出现鬼影的情况,我选择调高潜空间分块宽度与高度潜空间分块重叠

Tiled VAE

减少 VAE 编码/解码时的显存占用,降低爆显存的概率

  • 编码/解码器分块大小

设置 VAE 编码/解码时分块的大小,在没有出现爆显存的情况时尽量使用比较大的值以提高速度,如果爆显存后就适当降低该值

  • 使用快速编码/解码器

加快分块处理速度

  • 快速编码器颜色修复

当使用快速编码器时出现方法出来的图发灰可启用该选项

如果要使用 Tiled VAE 时直接勾选启用就行,一般不需要调整设置

噪声反转

类似于图生图,但是放大后和原图一致性更高,不改变原图的构图
这个功能可使放大后的图片细节更好,但是会导致一些笔触被改变。比如水彩风的图片放大后就没有那么水彩了

  • 反转步数

用于调节进行反转噪声需要走的步数。步数较高时,放大出来的图细节会比较好。步数较低时,出来的图细节就没那么多(有种朦胧感)

  • 修复程度

适当调高该值可以提高放大后图片的细节

我也说不出这东西具体是什么,wiki上也没相关对这个选项的说明

  • 重铺噪声强度

反转噪声的强度,一般不用调,因为反转的步数足够时,调高这个值带来的细节提升不是很明显(虽然有一点点提升,但肉眼也很难看出)

  • 重铺噪声大小

这个值比较高时,放大出来的图和原图一致性更强(貌似)

启用噪声反转后一般可以保持参数默认,或者适当调高反转步数修复程度的值

以下为反转噪声的原理参考:
Tiled Noise Inversion for better upscaling 方法原理 · Issue #162 · pkuliyi2015/multidiffusion-upscaler-for-automatic1111
noise inversion implementation principle? · Issue #289 · pkuliyi2015/multidiffusion-upscaler-for-automatic1111

分区提示词控制

这个功能用于分区绘制一张图,实现不同区域绘制不同的内容

该选项在 Tiled Diffusion 中,启用分区提示词控制后分块大小将失效,可忽略调节该值

下面列举两个例子

  • 绘制多人图

SD WebUI 的正面提示词只填写质量提示词或者画师提示词(不能出现具体描述画面内容的提示词),负面提示词填写通用的提示词
启用分区提示词控制后,点击创建文生图画布,勾选区域 1、2、3。

区域 1:
铺满整个画布,类型选择背景,正面提示词填写描述背景内容的

1
house,tree,sunlight,sky,cloud,potted plant,hill,

区域 2:
只框选部分画布,类型选择前景,正面提示词填写描述人物的

1
1girl,white hair,blue eyes,white dress,

区域 3:
只框选部分画布,类型选择前景,正面提示词填写描述人物的

1
1girl,red hair,red eyes,lolita,

这样可以画出多人图,且保证每个人不出现特征污染
注意,该方法画出的人物很难做到互动效果,如果需要实现互动效果,请使用Regional Prompter/Latent Couple扩展

  • 绘制超大背景

SD WebUI 的正面提示词只填写质量提示词或者画师提示词(不能出现具体描述画面内容的提示词),负面提示词填写通用的提示词
启用分区提示词控制后,点击创建文生图画布,勾选区域 1、2。

区域 1:
铺满整个画布,类型选择背景,正面提示词填写描述背景内容的

1
house,tree,sunlight,sky,cloud,potted plant,hill,

区域 2:
只框选部分画布,类型选择前景,正面提示词填写描述人物的(可以加背景的描述)

1
2
1girl,white hair,blue eyes,white dress,
house,tree,sunlight,sky,cloud,potted plant,wind,hill,

这样可以画出高分辨率的背景但又保证人物在高分辨率的情况不出现变形的问题

使用 Latent Couple 插件进行分区绘制

插件:ashen-sensored/stable-diffusion-webui-two-shot

在Latent Couple插件选项卡勾选启用,并使用AND语法进行编写

提示词例子

1
2
3
4
5
6
7
2girls,pastel colors,watercolor,hugging,
AND,2girls,(loli:1.1),cat ears,animal ear fluff,hair ribbon,pink eyes,grey hair,short hair,bangs,hair between eyes,eyebrows visible through hair,blush,closed mouth,light smile,neck ribbon,white lolita,fashion lolita,frilled_collar,crease,flat chest,
arms behind back,looking looking at viewer,from side,
cloud,sky,day,mountain,tree,grass,bridge,river,bird,blue sky,
AND,2girls,cherry blossoms,hair flower,hair ribbon,cat ears,animal ear fluff,blue eyes,grey hair,short hair,bangs,hair between eyes,eyebrows visible through hair,blush,closed mouth,light smile,neck ribbon,white sleeveless dress,crease,frilled_collar,detached_sleeves,flat chest,
hand on own chest,looking at viewer,pov,
cloud,sky,day,mountain,tree,grass,bridge,river,bird,blue sky,
1
2
3
4
5
hiten,miyase_mahiro,ray tracing,2girls, faceoff, hug, yuri,looking at another,face to face, full body, 
AND, hiten,miyase_mahiro,ray tracing,blonde hair, blue eyes, one side up,long hair, medium breasts, white veil, cross necklace,light smile, faceoff, hug, yuri,looking at another,
AND,hiten,miyase_mahiro,ray tracing,silver hair, long hair,red eyes, loli, bat wings, lolita fashion, faceoff, hug, yuri,looking at another,flying,
Negative prompt: lowres,bad anatomy,bad hands,text,error,missing fingers,extra digit,fewer digits,cropped,worst quality,low quality,normal quality,jpeg artifacts,monochrome,signature,watermark,username,blurry,mutation,poorly drawn,uncoordinated body,one hand with more than 5 fingers,one hand with less than 5 fingers,solo
Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 3619499167, Size: 960x1344, Model hash: 1449e5b0b9, Model: animagineXLV3_v30, Clip skip: 2, ENSD: 31337, Latent Couple: "divisions=1:1,1:2,1:2 positions=0:0,0:0,0:1 weights=0.2,0.8,0.8 end at step=20", Discard penultimate sigma: True, Schedule type: exponential, Eta: 0.667, Version: v1.7.0
1
2
3
4
5
6
7
8
9
10
11
pastel style,watercolor,
2girls,faceoff,detail light,
flower,cloud,sky,day,mountain,tree,grass,bridge,river,yellow flower,blue sky,road,water,nature,landscape,building,sun,field,
AND,pastel sttyle,watercolor,
cherry blossoms,hair flower,hair ribbon,cat ears,animal ear fluff,blue eyes,grey hair,short hair,bangs,hair between eyes,eyebrows visible through hair,blush,closed mouth,smile,neck ribbon,white sleeveless dress,crease,frilled_collar,detached_sleeves,flat chest,
yuri,looking at another,kiss,faceoff,
simple background,white background,detail light,
AND,pastel sttyle,watercolor,
silver hair,long hair,red eyes,(loli:1.2),bat wings,lolita fashion,light smile,
yuri,looking at another,kiss,faceoff,
simple background,black background,detail light,

插件使用A1111 SD WebUI的特性:Features · AUTOMATIC1111/stable-diffusion-webui Wiki

待完成


四种放大策略的简单比较

文档来自Novel AI中文频道@追光者

本测试简单比较了Stable Diffusion WebUl下的四种图像放大策略。他们都可以有效地将低分
辨率图像转化为4k高质量高清图片

相关插件

测试的四种方法涉及到四个插件

放大插件:

UNet控制插件:

四个插件产生了四种非常强力的图像放大策略,是目前生成高质量4K AIGC图片的主要手段

比较的方法及其参数

原图为漫画图,尺寸1920x1536,2x放大后为3840x3072。均使用StableSR官方VQVAE以获
得最清晰的放大结果

TiledDiffusion + StableSR

官网推荐配置完全不变。具体来讲有下面这些影响生成图片的参数:

  • 主要设置

    • 没有Prompt,采样器 Euler a,步数20步
  • TiledDiffusion

    • CFG Scale =2
    • Method = Mixture of Diffusers
    • Latent Tile Size = 64
    • Latent Tie Overlay =32(目前看来设置成这么大效果最好)
    • Upscaler=None
  • StableSR

    • Pure Noise 启用 (开启这个选项,插件将无视重绘幅度,添加尽可能多的细节)
    • Color Fix= wavelet

注意Tiled VAE会影而早存爆炸与不,对结里不构成干扰,比小不列参类

其他三种方法

他们均依赖ControlNet Tile且有大量共同参数,此处先行列出:

  • 模型:Anything V4.5
  • Positive Prompt: masterpiece, best quality, highres, very clear, city, sky scratchers
  • Negative Prompt: ng_deepnegative_v1 75t, EasyNegative, (signature:1.5), (watermark:1.5)
  • 采样步数20步,采样器DPM++ 2M Karras
  • 初始放大器4x foolhary_Remacri

Tiled Diffusion + Noise Inversion + ControlNet Tile

  • 重绘幅度0.6
  • Method = Mixture of Diffusers
  • Latent Tile Size = 96
  • Latent Tile Overlay=8
  • 启用Noise Inversion
  • Noise Inversion Steps = 30
  • Renoise Strength = 0.4

注意overlay是影响速度的最关键因素。其他保持默认即可

Tiled Diffusion + ControlNet Tile

  • 关闭Noise Inversion
  • 重绘幅度0.4和0.6都做了测试
    。其他参数与前面相同

Ultimate SD Upscaler + ControlNet Tile

  • 重绘幅度0.4和0.6都做了测试
  • Tile width = 768, Tile height = 768
  • Mask blur =24, padding = 32
  • 没有开缝隙修复,因为原图纹理较为复杂不规则,不易发现缝隙

用时记录

  • 借了一张16 GB Tesla V100上完成测试,每种方法都跑了三次取平均时长

  • 显存足够,因此Tiled Diffusion的Latent Tile Batch Size可以设置为8来加速

  • 从快到慢排序

    • TiledDiffusion + ControlNet: 1分09秒(重绘0.4)1分26秒(重绘0.6)
    • Ultimate SD Uoscaler:1分54秒(重绘0.4)2分03秒(重绘0.6)
    • TiledDiffusion+ StableSR: 2分38秒
    • TiledDiffusion + Noise Inversion + ControlNet Tile: 3分04秒
      注:测了一下Ultimate SD Upscaler的缝隙修复功能,发现时间暴涨50%,每种修复的时间增量还都不一样,因此没有继续测试
  • 显存足够时TiledDiffusion + ControlNet最快,否则他与Ultimate SD Upscaler不开缝隙修
    复接近,只相差几秒钟

    • 这很容易理解,同样是分块绘制,Tiled Diffusion能8块一起画
  • Tiled Diffusion + StableSR为什么慢很多

    • 这是因为StableSR是64的尺寸,32的overlap,比TiledDiffusion多出5倍的tile数量(32 ->160)
    • 此外Pure Noise是文生图,会多出7个采样步数(13-20)
    • 也就是多算了892/2=448张512*512小图。按每8张小图1.5秒计算,差不多就慢了一分半
  • Tiled Diffusion + Noise Inversion + ControlNet Tile为什么最慢

    • 多出来的时长都是Noise Inversion的锅,显然30步Noise Inversion太多了,应酌情减
    • 经测试10步就够了,耗时相对Tiled Diffusion增加20秒左右,效果依然可用(然而比30步略糊一些)

出图结果对比

我提供了图包,也有在线对比:https://imgsli.com/MTgwNzg0/1/5

Tiled Diffusion + StableSR

  • 这个方法是最优越的,因此首先介绍
  • 优点:
    • 几乎完全忠实于原图。没有任何原图不存在的小物体或色斑等,人物的面部及瞳色等没有明显改变
    • 大幅提高清晰度,图片比其他方法看上去都更加清晰锐利,细节细致不糊
  • 缺点:
    • 需要下载一个5.21GB的SD 2.1 512模型,一个400MB的SRModule,和一个700MB的VAE
    • 耗时并不短,需要消耗最快方法的2.5倍时间
  • 然而瑕不掩瑜,就效果而言此方法最理想,测试的其他三种方法不仅会明显改图,且都比
    它糊

Tiled Diffusion + ControlNet Tile

  • 优点:
    • 借助ControlNet Tile model的力量为原图添加丰富的细节。
    • 在Latent Tile Batch Size 能设置为8时(要求显存>=12GB)该方法最快,比第二快的Ultimate SD Upscaler快40%
      • 在显存 <= 6GB 时须设置Latent Tile Batch Size为1,该方法的速度降低到1分47秒,两者时间接近
      • 注意不要按官方默认设置的Overlap=48,请设置Overlap为8,否则出图差不多但是消耗时间2.5倍
    • 与Ultimate SD Upscaler相比,仔细观察也没有肉眼可见的缝隙。纯色背景(如蓝天)下这个优势更加明显
  • 缺点:
    • 与Ultimate SD Upscaler结里类似
    • 清晰度不太够,画面有轻微朦胧感。换用初始upscaler为UltraSharp或者RealESRGAN Anime6B改善有限
    • 虽然会增加细节,但细节缺少整洁感,画面显得凌乱。在高重绘(0.6)下产生大量不合理细节,人物瞳色也变了
  • 该方法能在速度和质量上都超过Ultimate SD Upscaler + ControlNet Tile

Ultimate SD Upscaler + ControlNet Tile

  • 优点:
    • 最大的优点还是功能少,用起来简单的多
    • 出图细节和Tiled Diffusion + ControlNet Tile差不多
  • 缺点:
    • 对于纯色的背景或者区域,易产生缝隙,需要开启缝隙修复
    • 一旦开启缝隙修复则时间暴增,耗时超过Tiled Diffusion+ StableSR,得不偿失
    • 其他缺点和Tiled Diffusion + ControlNet Tile-样

Tiled Diffusion + Noise Inversion + ControlNet Tile

  • 优点:
    • 在为图片补充细节的同时,可没有多余的细节,画面整洁干净
    • 出图线条清晰,边缘锐利,对比度高,审美上较好
  • 缺点:
    • 太慢了。耗时是最快方法的近三倍
    • 依然会改图。效果类似StableSR和ControlNet之间的折衷

结论

比较结果:

  • 出图高清程度:Tiled Dlffusion + StableSR >>Tiled Diffusion + Noise Inversion + ControlNet Tile>剩下两个方法(重绘幅度0.4,0.6都差不多)
    • 注意高清不一定是好事。有的图就是要朦胧产生美,清晰了就变丑了(狗头)
  • 出图速度:Tiled Diffusion + ControlNet Tile >Ultimate SD Upscaler(不开seam fix)>Tiled Diffusion + StableSR > Tiled Diffusion + Noise Inversion + ControlNet Tile
    • 出图速度前两名的两个方法都会添加大量细节,重绘幅度越高添加细节越多
    • 注意额外的细节不一定是好事,反而可能破坏画面,显得脏乱

根据画图目的,可以做如下划分:
1.放大图像,想要非常清晰的细节,又不想大幅改变图片内容:Tiled Diffusion+StableSR
2.原图太干净,想要添加很多细节:Tiled Diffusion + ControlNet Tile Model/Ultimate SD Upscaler,效果差不多,前者速度快
3.想要适当补充合理细节,又时间充裕:Tiled Diffusion+Noise Inversion + ControlNet
Tile

我个人无脑选择Tiled Diffusion + Stable SR
然而作为Tiled Difusion插件作者,我认为虽然其功能和出图性能都更加强大,但Ultimate SD Upscaler能作为其简单替代品

Tiled Diffusion插件的缺点:

  • 必须要配合Tiled VAE,否则炸显存。但两个插件加在一起选项变得很多,难以快速上手
  • 不支持很多AMD GPU(因为DirectML有个bug,大张量左下角会归0,我也没法修)
  • 在不使用StableSR时,overlap有陷阱。调高则耗时暴涨,结果却没有明显改善
    • 实际上4到8就够了,我默认却给的48。主要是那个时候还没有ControlNet Tile Model

Ultimate SD Upscaler插件的优点:

  • 兼容AMD GPU,不会在左下角产生黑图。可能是黑图的AMD GPU的唯一解
  • 功能单一,容易学习,你即便调错参数也不会导致耗时暴涨,适合入门选手
  • 图是一块一块的生成,不开Tiled VAE也不会炸显存

在如下三种情况下可以使用Ultimate SD Upscaler:
1.AMD GPU用户,发现Tiled Diffusion出图左下角有黑块
2.不想学习复杂的插件参数


杂项

解决SDXL鬼图的

设置 -> SD,把强调模式改为No norm

调整 模型卡片的大小

打开设置->扩展->,在扩展模型卡片宽度扩展模型卡片高度修改模型卡片的大小

禁用 SD WebUI 自动隐藏不匹配大模型版本的模型的功能

设置 -> 扩展模型,将在 Lora 页面保持显示所有模型 (否则, 将隐藏不兼容当前加载的 Stable Diffusion 模型版本的模型)选项勾上

HuggingFace 设置镜像

  • 1、

    1
    export HF_ENDPOINT="https://huggingface.sukaka.top"
  • 2、

    1
    2
    import os
    os.environ["HF_ENDPOINT"] = "https://huggingface.sukaka.top"

ComfyUI 和 SD WebUI 共享模型目录

编辑ComfyUI目录中的extra_model_paths.yaml.example
找到a111选项,把base_path的路径修改为stable-diffusion-webui的路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#Rename this to extra_model_paths.yaml and ComfyUI will load it


#config for a1111 ui
#all you have to do is change the base_path to where yours is installed
a111:
base_path: E:/Softwares/stable-diffusion-webui # 填写sd-webui的路径

checkpoints: models/Stable-diffusion
configs: models/Stable-diffusion
vae: models/VAE
loras: |
models/Lora
models/LyCORIS
upscale_models: |
models/ESRGAN
models/RealESRGAN
models/SwinIR
embeddings: embeddings
hypernetworks: models/hypernetworks
controlnet: models/Controlnet
ipadapter: models/Controlnet # ipadapter模型
clip_vision: extensions/sd-webui-controlnet/annotator/downloads/clip_vision # clip_vision模型
# animatediff模型共享的说明: https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved?tab=readme-ov-file#model-setup
animatediff_models: extensions/sd-webui-animatediff/model # animatediff模型
animatediff_motion_lora: extensions/sd-webui-animatediff/model # animatediff lora模型


#config for comfyui
#your base path should be either an existing comfy install or a central folder where you store all of your models, loras, etc.

comfyui:
# base_path: path/to/comfyui/
# checkpoints: models/checkpoints/
# clip: models/clip/
# configs: models/configs/
# controlnet: models/controlnet/
# embeddings: models/embeddings/
# loras: models/loras/
# upscale_models: models/upscale_models/
# vae: models/vae/


#other_ui:
# base_path: path/to/ui
# checkpoints: models/checkpoints
# gligen: models/gligen
# custom_nodes: path/custom_nodes

extra_model_paths.yaml.example文件的名字改为extra_model_paths.yaml
重启ComfyUI后生效


Lora 训练

正则训练的原理

正則的簡單攻略:
假設你有一系列A的圖,打標a

但是實際上它可能是
ab → AB
abc → ABC

那你現在只打標a,那就會變成
a → AB
a → ABC

使用的時候可能就會變成
ade → ABCDE

為什麼?因為模型學到的不是a→A,是a→AB/ABC

那麼要怎麼解決這個問題呢?
很簡單,讓模型知道B/C是什麼就好:

所以你變成
a → AB
a → ABC
b → B
c → C

這時候模型就知道B/C跟a無關
而是跟b/c綁定
於是你單走a就會輸出A,而不是ABC

而b→B c→C就是正則

dim

Dim 为网络维度,影响模型的大小(Dim 越大,模型越大,但某些参数下 Dim 的值将失效)、训练时显存的占用大小(和 Dim 值成正比)。Dim 并不是越大越好,通常来说训练单人物 / 单画风 用 Dim 8 就行,用 Dim 4 也可以达到比较好的效果。

batcb size

训练批量大小,指训练时同时进行训练的图片张数,该值越高显存占用越大。在其他参数不变的情况下,Batch Size 较大时将会出现类似囫囵吞枣的情况,也就是学习的速度慢了,在较高的 Epoch 下才看到比较好的训练效果,这时就需要更高的学习率

梯度累加步数

通过时间换空间,增加 batch size 的大小,当 batch size 设置为 2,梯度累加步数设为 4,则等效 batch size 为 8.

优化器

名字带有 8bit 的优化器为启用 int8 的优化器,显存占用率较低。

Lion 优化器需要较高 Batch Size,但在高 Batch Size 下需要调整学习率时可使用该优化器。,通常情况下 Lion 需要的学习率比 AdamW 要低。
Lion 在学习速度上较快,如果使用较高的学习率可能会导致出现比较奇怪的结果 / 过拟合。

如果使用较低的 batch size,建议使用 AdamW。

Lion 拟合速度快的特效适合搭配 cosine_with_restarts 学习率调度器。

关于 Lion 优化器的论文:[2302.06675] Symbolic Discovery of Optimization Algorithms

lokr

建议触发 full dim(full matrix)来使用,可通过将 network dim 和 conv dim 同时设置为一个非常大的值(非正常的值)进行触发,如100000,此时 network dim 和 conv dim 的值将被忽略。

学习的深度由 lokr factor 进行调整,该值越小,模型学习的深度越高,学得的东西越多,可使学习的效果更容易迁移,即 LoRA 模型可在别的模型上也有较好的表现,而 LoRA 模型的体积将越大。

lokr factor 较小时,可能需要较小的学习率防止过拟合。

使用 lokr 训练二次元的 LoRA 时可尝试的参数:factor=8full_matrix=True(通过 full dim 触发),lr=1e-4~1e-3

train norm

启用后将训练 layernorm 和 groupnorm,增强学习能力,并且训练的时候对初始值的依赖度会降低(如学习率等),提高容错率,泛化率,或者间接防止过拟合。

实测中启用该值后可能需要调小学习率。

梯度检查点

模拟高 batch size(?),启用后可以降低显存占用。

ARB 桶

启用后可以不用将图片进行裁剪就可以进行训练。

注意,ARB 桶分辨率必须大于训练分辨率,如果素材中存在较低分辨率的图片,建议使用放大工具(可使用 SD WebUI 的后期处理)将图片进行放大,因为 ARB 桶的放大算法可能会造成图片缩放后质量更低,影响训练效果。

仅训练 U-Net

在训练 SDXL 的 LoRA 时推荐启用,训练画风也推荐启用,训练人物 LoRA 时则关闭

NovelAI 在训练模型时并没有训练 Text Encoder。Text Encoder 并不容易训练,而且容易训练烂,所以仅训练 U-Net 比较适合。

仅训练 U-Net 时打标也起作用,在训练多画风 LoRA 时使用了触发词进行训练并启用了仅训练 U-Net,训练得到的模型也能够正常使用触发词触发画风,也就是仅训练 U-Net 也能把触发词练进去。

多卡训练

多卡训练默认为多 BS,当训练参数中 BS 设为 1,但使用 2 张显卡进行训练,则实际上的 BS 为 2。

full fp16

可降低内存和显存占用。

最大范数正则化

提高泛化性,限制训练时不偏离模型太远,防止过拟合,但会使训练拟合的速度变慢。

Loss、学习率、学习率调度器、优化器的关系

把 Loss 简化成三维的面,梯度下降算法就是不断的找出当前点周围坡最陡的地方,一步步向下。学习率大相当于每步迈的大,假如坑比较小,每步都会跨到坑另一边,就会不断的循环震荡。学习率退火相当于走的越来越慢,会逐步的向面中的某个坑靠拢,最后停在坑中相对较低的地方。

noise offset

使训练出来的模型能更好的表现暗处和亮处,而不是生成

有关偏移噪声的说明:Diffusion with Offset Noise

零终端信噪比

zero_terminal_snr 可以使模型在暗处和亮处的表现更好,并且解决颜色污染问题,NovelAI 3 就使用了 zero_terminal_snr 改善模型在此部分的表现效果。

NovelAI 3 的技术报告:[2409.15997] Improvements to SDXL in NovelAI Diffusion V3

训练集处理

训练画风

将图片中的所有元素进行标记,尽量去除训练集中有画风不一致的图。

训练人物

将需要保留的人物特征的标签删除,但对人物特征的更改更难。

另一种方法是将图片中所有的元素进行标记,但写上触发词,使用 LoRA 时通过触发词使 LoRA 生效(推荐)。

训练人物一般不需要使用正则化,这会降低拟合度,使角色还原度降低,如果要练人物身上的衣服或者其他装饰才需要正则化,使装饰和人物不再绑定。

处理工具

数据集处理
imgutils
HakuBooru
cheesechaser
GPT4V-Image-Captioner
训练
lora-scripts
sd-scripts
waifuc
OneTrainer
SimpleTuner
kohya_ss

可供参考的:
https://arxiv.org/html/2309.14859v2
https://huggingface.co/KBlueLeaf/Kohaku-XL-Delta/blob/main/docs/train_script.sh
https://arxiv.org/abs/2309.14859v2
https://arxiv.org/abs/2402.09353v6
https://github.com/KohakuBlueleaf/LyCORIS/blob/main/example_configs/training_configs/kohya/lokr_config.toml
https://github.com/KohakuBlueleaf/LyCORIS/blob/main/docs/Algo-List.md
https://github.com/bmaltais/kohya_ss/wiki/LoRA-training-parameters
https://github.com/kohya-ss/sd-scripts?tab=readme-ov-file#links-to-usage-documentation

可用的一些训练参数

SD Trainer 默认的训练参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
model_train_type = "sd-lora"
pretrained_model_name_or_path = "./sd-models/model.safetensors"
v2 = false
train_data_dir = "./train/aki"
prior_loss_weight = 1
resolution = "512,512"
enable_bucket = true
min_bucket_reso = 256
max_bucket_reso = 1024
bucket_reso_steps = 64
output_name = "aki"
output_dir = "./output"
save_model_as = "safetensors"
save_precision = "fp16"
save_every_n_epochs = 2
max_train_epochs = 10
train_batch_size = 1
gradient_checkpointing = false
network_train_unet_only = false
network_train_text_encoder_only = false
learning_rate = 0.0001
unet_lr = 0.0001
text_encoder_lr = 0.00001
lr_scheduler = "cosine_with_restarts"
lr_warmup_steps = 0
lr_scheduler_num_cycles = 1
optimizer_type = "AdamW8bit"
network_module = "networks.lora"
network_dim = 32
network_alpha = 32
log_with = "tensorboard"
logging_dir = "./logs"
caption_extension = ".txt"
shuffle_caption = true
keep_tokens = 0
max_token_length = 255
seed = 1337
clip_skip = 2
mixed_precision = "fp16"
xformers = true
lowram = false
cache_latents = true
cache_latents_to_disk = true
persistent_data_loader_workers = true

下方的训练参数基于默认参数进行修改。

  • 1、
    使用 LyCORIS 中的 lokr 算法训练 SDXL 的画风 LoRA,使用 RTX 4090 进行训练,显存占用在 21GB 左右。
1
2
3
4
5
6
7
8
9
10
11
12
13
resolution = "1024,1024"
max_bucket_reso = 1536
max_train_epochs = 50
train_batch_size = 12
gradient_checkpointing = true
network_train_unet_only = true
optimizer_type = "Lion8bit"
network_module = "lycoris.kohya"
network_dim = 100000
train_norm = true
conv_dim=100000
algo=lokr
factor=8

要更快的学习速度,可以把学习率升到 15e-5,不过要注意高学习率可能会导致的画面崩坏(肢体容易崩),12e-5 会比较好点。
如果不想让肢体那么容易崩坏,用 1e-4 的学习率就行了,学得慢就调高 epoch。

2、
使用 LyCORIS 中的 lokr 算法训练 SDXL 的画风 LoRA,使用 RTX 4090 进行训练,显存占用在 21GB 左右。LoRA 体积较小,牺牲了训练结果可迁移性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
resolution = "1024,1024"
max_bucket_reso = 1536
max_train_epochs = 50
train_batch_size = 12
gradient_checkpointing = true
learning_rate = 1e-3
unet_lr = 1e-3
network_train_unet_only = true
optimizer_type = "Lion8bit"
network_module = "lycoris.kohya"
network_dim = 100000
train_norm = true
conv_dim=100000
algo=lokr
factor=32

3、
使用 LyCORIS 中的 lokr 算法训练 SDXL 的画风 LoRA,使用 RTX 4060 Laptop 进行训练,显存占用在 5.6GB 左右。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
resolution = "1024,1024"
max_bucket_reso = 1536
max_train_epochs = 50
save_every_n_epochs = 1
gradient_checkpointing = true
network_train_unet_only = true
network_module = "lycoris.kohya"
network_dim = 100000
network_alpha = 100000
fp8_base = true
conv_dim=100000
conv_alpha=100000
algo=lokr
factor=8
train_norm=True

4、
使用 LyCORIS 中的 lokr 算法训练 SDXL 的画风 LoRA,使用 RTX 4060 Laptop 进行训练,显存占用在 7.2GB 左右。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
resolution = "1024,1024"
max_bucket_reso = 1536
max_train_epochs = 50
save_every_n_epochs = 1
learning_rate = 14e-5
unet_lr = 14e-5
train_batch_size = 3
gradient_checkpointing = true
network_train_unet_only = true
network_module = "lycoris.kohya"
network_dim = 100000
network_alpha = 100000
fp8_base = true
conv_dim=100000
conv_alpha=100000
algo=lokr
factor=8
train_norm=True

如果想训练更快,可以将学习率调到 2e-4,实测调到 23e-5 时就会出现轻微崩坏。

5、
使用 LyCORIS 中的 lokr 算法训练 SDXL 的人物 LoRA,使用 Tesla T4 x 2 进行训练。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
resolution = "1024,1024"
max_bucket_reso = 1536
max_train_epochs = 50
save_every_n_epochs = 1
unet_lr = 1e-4
text_encoder_lr = 1e-5
train_batch_size = 3
scale_weight_norms = 1
gradient_checkpointing = true
network_module = "lycoris.kohya"
network_dim = 100000
network_alpha = 100000
fp8_base = true
conv_dim=100000
conv_alpha=100000
algo=lokr
factor=8
train_norm=True
  1. 使用 LyCORIS 中的 lokr 算法训练 SDXL 的人物 LoRA,使用 Tesla T4 x 2 进行训练。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
resolution = "1024,1024"
max_bucket_reso = 1536
max_train_epochs = 50
save_every_n_epochs = 1
unet_lr = 1e-4
text_encoder_lr = 1.4e-5
train_batch_size = 3
scale_weight_norms = 1
gradient_checkpointing = true
network_module = "lycoris.kohya"
network_dim = 100000
network_alpha = 100000
fp8_base = true
conv_dim=100000
conv_alpha=100000
algo=lokr
factor=8

未完成


Stable Diffusion 那些事
http://licyk.github.io/2023/12/23/learn-sd-note/
作者
licyk
发布于
2023年12月23日
许可协议