一篇绝对值得躺在你收躲夹里的 Stable-Diffusion Tutorial
一篇绝对值得躺在你收躲夹里的 Stable-Diffusion Tutorial
做者:coreyzhong,腾讯IEG利用研究员
跟着stable-diffusion的开源,让更多人有时机间接参与到AI绘画的创做中,相关的教程也如雨后春笋般的呈现。可是目前我看到的教程同量性较高,凡是只能称做为"利用流程讲解",但是凡是没有对其原理和逻辑停止深进阐明。
所以本文的目标,是用尽可能少的废话,给各人填补一些重要的相关常识。关于"怎么用"那类的问题,凡是有他人已经讲解过,我就不会过多赘述(而是贴一个教程链接,请读者本身进修)。假设你想领会更多关于"是什么"、"为什么"的问题,那么本文将会给你更多的解答,尽可能让读者做到"知其然,亦知其所以然"。
假设对本文感兴致,欢送存眷做者的知乎账号,用户名为:coreyzhong
布景常识
Stable Diffusion是什么?
Stable Diffusion是操纵扩散模子停止图像生成的产物,能够撑持text2image、image2image。而且因为“论文公开+代码开源”,其用户群体远大于其他AI图像生成产物。别的,并且世人拾柴火焰高,代码和项目开源使得各项优化手艺在其上快速利用,使其不竭迭代优化。
传送门:官网 | 论文 | Git
WebUI是什么?
Stable Diffusion WebUI是 AUTOMATIC1111 为Stable Diffusion开发的一套UI操做界面,大幅度降低了Stable Diffusion的利用门槛,让用户以至能够不消写代码就可以实现模子的推理、操练等操做。
传送门:Git
启动器是什么?
启动器是秋葉aaaki 团推开发的用来启动Stable Diffusion WebUI的启开工具。不只可以实现一键启动(不然需要用户先翻开webui办事,在翻开阅读器网页),还包罗了诸如情况选项、疑难解答、版本治理、模子治理、扩展插件治理等诸多功用。让没有开发体味的同窗可以用起来更随手。
传送门:教程 | 网盘下载
那三者依次递进,最末闪现在我们面前,让我们可以便利的利用Stable Diffusion的才能。下面我们分2个大块,别离介绍若何利用WebUI停止推理(即生成内容)和操练,以及他们的利用场景。
1 上篇:推理利用
在起头之前,需要用户安拆Stable-Diffusion-WebUI,收集上有良多安拆教程,好比:
展开全文
但是现实上,在WebUI的官方介绍中已经列举了安拆步调:
1.1 文生图 1.1.1 模子风气介绍
起首差别模子所生成的图风气是会完全纷歧样的,在 C站 上能够间接下载模子。用户只需要把CHECKPOINT格局的模子下载下来并放到 stable-diffusion-webui/models/Stable-diffusion那个途径下就能够间接利用。在WebUI界面左上角既能够抉择模子:
我将其按风气分红两大类:偏二次元风气 和 偏写实风气。下面我们别离以“Call of Duty”做为prompt,看一些差别模子生成图片的效果:
【阐明】:问了便利,本文后面的介绍全数都是基于chilloutmix模子停止的。
1.1.2 text2image超参数设置
【阐明】:该界面跟着版本迭代会有些差别,假设读者本身的界面和我那个欠亨,不消太在意
我们举一个例子,翻开txt2image的标签,左上角抉择你想用的模子;鄙人方两个方框平分别输进提醒词(prompt)来生成你想要什么样的图片,以及反向提醒词来掌握你不想要什么图片;后面几个参数阐明如下:
如许输进相关参数后,能够看到girl holding a gun做为prompt,所生成的6张图片
1.1.3 ControlNet的利用
是做什么的?
We present a neural network structure, ControlNet, to control pretrained large diffusion models to support additional input conditions.
我们提出了一个神经收集构造,ControlNet,以掌握预操练的大型扩散模子,以撑持额外的输进前提。
We present a neural network structure, ControlNet, to control pretrained large diffusion models to support additional input conditions.
我们提出了一个神经收集构造,ControlNet,以掌握预操练的大型扩散模子,以撑持额外的输进前提。
其实就是在大型扩散生成模子的根底上,再加上一个构造,使得扩散生成模子可以承受一个新的“图像输进”。而且对模子的输出起到掌握造用,使其与输进图像类似。
特征是什么?
怎么做到的?
Step1: 将预操练好的扩散生成模子参数冻结,并copy一个新的可操练模子
The ControlNet clones the weights of a large diffusion model into a "trainable copy" and a "locked copy"
The ControlNet clones the weights of a large diffusion model into a "trainable copy" and a "locked copy"
Step2: 将得到的两个模子根据下图的形式一路操练,此中可操练模子中的Decoder构造是“零卷积”构造
The trainable and locked neural network blocks are connected with an unique type of convolution layer called "zero convolution", where the convolution weights progressively grow from zeros to optimized parameters in a learned manner.
The trainable and locked neural network blocks are connected with an unique type of convolution layer called "zero convolution", where the convolution weights progressively grow from zeros to optimized parameters in a learned manner.
怎么利用?
重述下本文的原则是,已经有人讲解过我就不废话了,间接把现有的教程链接贴给你。
在text2image页面的左下方供给了脚本的抉择。那里的脚本其实就是保留在stable-diffusion-webui/s/途径下的python脚本文件,目标就是为我们供给了一些便利的功用。
截至目前,text2image功用撑持4个脚本抉择:
我们别离简单介绍:
提醒词矩阵:当我们有多个提醒词时,该脚本供给一个可以看差别组合效果的功用。例如我们输进"girl with skirt|gun|blue hair"做为prompt,此中包罗3个提醒词,且用"|"朋分。如许就能够生成下图那种两两组合的效果图:
从文本框或文件载进提醒词:望文生义,就是让用户可以从文件中导进提醒词。举个例子我们在上面的prompt中输进girl,鄙人面的文本框中输进boy,成果生成的图片是男孩,阐明通过“脚本”导进的提醒词笼盖了在上面文本框中的提醒词
X/Y/Z图表:针对特定prompt,比照差别纬度的参数取差别值时的效果。如下例中,我们选用prompt为“girl holding a gun”,然后比照三个模子以及10,20,30三个差别摘样步数的效果:
controlnet m2m:那个是一个视频处置功用,素质上是把用户上传的视频切帧,并别离停止image2image,最初捏成一整个新的视频。因为视频不便利展现,并且text2image的m2m效果一般,随便产生图像的跳动/闪烁,本文在那里就间接略过了,各人感兴致能够往测验考试一下。
1.2 图生图 1.2.1 Deepbooru
传送门:代码
关于一些通用的超参数,如:摘样器、摘样步数在前文text2image中就已经介绍过了,那里介绍一下image2image特有的一个功用:Deepbooru反向推导提醒词。即输进一张图片,输出该图像对应的提醒词,以求根据该提醒词能尽可能的复原输进图像。
怎么做到的?
根据代码可知,素质上它就是把self.model.tags遍历一遍,而且通过阈值过滤以及排序给出来的一份tags列表。
怎么利用?
在image2image中,上传图片后,点击“DeepBooru反向推倒提醒词”,等一会就能够看到提醒词窗口中生成了一串提醒词。而且该提醒词会被利用后续的图像生成过程。
1.2.2 功用介绍
除了停止image2image,还供给了其他功用,如涂鸦绘造(sketch)、部分绘造(inpaint)等:
涂鸦绘造(sketch):容许用户在上传的图像长进行涂鸦,并根据涂鸦后的成果生成新的图像。如下例中,我把角色和黄色布景用黑笔框起来,生成的图片就会把那部门内容放在手机屏幕上。
部分绘造(inpaint):容许用户指定在图像中特定区域停止修改,而包管其他区域稳定。如下例中,我们把角色的头发涂掉,然后在prompt中输进"colorful hair",试图让模子把头发改成彩色。
部分绘造-涂鸦蒙版(inpaint sketch):其实也是一种部分绘造(inpaint),区别之处在于在部分绘造(inpaint)中,用户涂黑的部门表达该部门能够被重绘;而在部分绘造-涂鸦蒙版(inpaint sketch)中,用户涂鸦的部门不只表达能够重绘,用户涂鸦的内容还会成为图像生成的内容来源。下例中仍然涂抹了角色的头发,而且在prompt中写进“colorful hair”试图让模子生成彩色头发:
成果发现没有胜利生成彩色头发,反而是黑色头发(并且量量也不高),那是因为我们用黑笔停止的涂鸦。模子会把我们涂鸦的内容做为生成图像的素材来源。
部分绘造-上传蒙版(inpaint upload):其实就是不需要用户手动在前端页面停止涂鸦,取而代之是用户上传一张图片做为蒙版(类似于我们前面的涂鸦的感化)。那里就不展现了。
1.2.3 ControlNet的利用
那部门内容网上已经有良多例子和教程了,好比:
那里我们只简单举一个例子,拔取下面那张角色跳舞的图停止control,形式抉择人物姿势检测
然后随意找一张图片来停止生成,根据成果能够明显看出ControlNet起到了感化,成果图中的人物都摆出了不异的姿势,但是输进图片的内容中只要色彩和输出图片接近,人物的形象/打扮等都没有很好的保留。
1.2.4 脚本的利用
比拟text2image来说,目前的版本中image2image有更多的脚本能够利用,除了已经介绍过的4个,还有:图生图替代测试(img2img alternative test)、图像迭代(Lookback)、向外绘造第二版(Outpainting mk2)、低量量画布补全(Poor man's outpainting)、SD形式办法(SD upscale)共5个脚本功用。关于每种脚本的功用和利用阐明,因为有WebUI做者的 官方阐明 ,而且内容良多很杂,本文就不在那里废话了。
2 下篇:模子操练
目前常用的模子微调办法,次要包罗以下几种形式:
因为Textual Inversion和HyperNetworks的操练难度较大,效果也凡是不尽如人意,目前并没有成为模子微调的支流抉择。所以下文我们次要介绍Dreambooth和LoRA(以及LoRA的变体LyCORIS)相关的手艺原理、特征、利用场景、利用办法。
2.1 Dreambooth
传送门:论文 | 代码 | 插件
2.1.1 是做什么的?
our technique enables synthesizing the subject in diverse scenes, poses, views, and lighting conditions that do not appear in the reference images
我们的手艺可以在参考图像中没有呈现的差别场景、姿势、视图和光照前提下合成主题
our technique enables synthesizing the subject in diverse scenes, poses, views, and lighting conditions that do not appear in the reference images
我们的手艺可以在参考图像中没有呈现的差别场景、姿势、视图和光照前提下合成主题
起码只需要3-5个样本停止微调(但那几个样本需要时统一个主体的差别图片)
生成的成果是那个主体(subject)在差别场景下的图片(如下图)
起码只需要3-5个样本停止微调(但那几个样本需要时统一个主体的差别图片)
生成的成果是那个主体(subject)在差别场景下的图片(如下图)
2.1.3 怎么做到的?
Step1: 通过图像-提醒词的独一标识符,来微调低辨认率模子
We first fine-tune the low-resolution text-to- image model with the input images and text prompts containing a unique identifier followed by the class name of the subject (e.g., “A [V] dog”)
We first fine-tune the low-resolution text-to- image model with the input images and text prompts containing a unique identifier followed by the class name of the subject (e.g., “A [V] dog”)
而那一步的难点是制止过拟合,文中做者通过新增一种 autogenous class-specific prior preservation loss,来制止遗忘问题
A key problem is that fine-tuning on a small set of images showing our subject is prone to overfitting on the given images. For this, we present an autogenous class-specific prior preservation loss, where we alleviate overfitting and prevent language drift by encouraging the diffusion model to keep generating diverse instances of the same class as our subject.
A key problem is that fine-tuning on a small set of images showing our subject is prone to overfitting on the given images. For this, we present an autogenous class-specific prior preservation loss, where we alleviate overfitting and prevent language drift by encouraging the diffusion model to keep generating diverse instances of the same class as our subject.
Step2: 通过低-高辨认率的配对,来微调超辨认率组件(就是根据低辨认率生成高辨认率的阿谁模子)
In the second step, we fine-tune the super-resolution component with pairs of low-resolution and high-resolution versions of the input images.
In the second step, we fine-tune the super-resolution component with pairs of low-resolution and high-resolution versions of the input images.
而其模子构造如下:
此中reconstruction loss就是AutoEncoder常用的重建缺失,而class-specific prior preservation loss在文中的形式为:
2.1.4 若何利用?
起首那是关于Dreambooth插件的详尽阐明 ,以及为各人供给一份Dreambooth的参数设定指南 ,本文简单介绍一个例子:
Step1: Create Model
所谓Create Model,就是创建一个初始化的模子,后面操练微调会在此根底长进行梯度更新。Create出来的模子,会做为中间文件保留在stable-diffusion-webui/models/dreambooth途径下,而是包罗logging、samples、working、db_config.json等多个子途径和文件的空间(而非ckpt文件),你能够把他理解成一个workspace,该空间做为中间文件。
此中,Source Checkpoint参数就是抉择哪一个模子的参数做为初始化模子参数,模子途径为:stable-diffusion-webui/models/Stable-diffusion/下的ckpt文件模子。而所谓Scheduler,也就是摘样器,就是抉择扩散模子的形式。 都设置好之后,点击黄色的Create Model,再等一会就能看到创建好的模子了。那时在Output处能够看到successfully的日记,以及在右边Model Selection处能够看到本身刚Create出来的模子。
Step2: 设置相关参数
那部门参数比力多,各人能够参考前文提到的 官方阐明 ,既然有了官方阐明,本文只做简要阐明:
Settings部门次要需要设置能否摘用LoRA、Epochs、模子保留战略、Batch Size、进修率等,都是根本参数根本不需要额外介绍。
Concepts部门次要有两个,一个是数据途径,另一个是class和promote。所谓prompt,就是我们的目标样本对应应该输进什么提醒词;而class是在前文dreambooth原理介绍中,为了制止过拟合,需要填补一些与目标主体属于统一类别但不是统一个别的样本,并计算class-specific prior preservation loss的那部门样本的类别(prompt),模子会根据此内容来生成一部门图片,做为微调样本。
Saving部门次要设置ckpt耐久化保留战略,详细来说就是.ckpt文件、loRA小模子、扩散模子别离以什么样的战略停止保留。
Generate部门次要设置模子生成
Step3: 操练和监控
全都参数都设置好后,间接点击上面橙色的Train,就能够起头操练了。在操练过程中,不需要我们做什么,假设感兴致的话能够盯着日记/WebUI的Output界面看一看操练过程中的loss,以及模子生成出来的图片。
此中Steps指的是正在停止本次操练的几步,而Lifetime指的是那个模子总共操练了几步(关于初次操练的模子二者相等,假设那个模子之前被你操练过,此次拿出来陆续操练,那么Lifetime大于Steps)。上例中我们摘用CODM中的一个角色“Ghost”做为prompt停止微调操练,操练数据共8张图片:
因为数据量很小,不到半个小时就操练完成了。下面是微调前后根据“Ghost”停止生成的图像比照,微调前:
微调后:
模子已经进修到了,“Ghost”是一个带着面罩+护目镜+耳罩的军人(而不是鬼魂),但是目前还没有进修到ghost面罩上的骷髅图案。想必在更大都据以及愈加精巧化的微调后,是可以做到的。下面是拔取了50张颠末简单清洗的样本,停止操练的成果,可见模子已经可以进修到ghost的良多细节了,并且胜利剔除了无关的文字。
以及我们能够试图造造一版圣诞节主题的图片:
并且还能够连系ControlNet,停止人物动做的掌握:
别的我们能够通过prompt对ghost的风气停止调整:
2.1.5 填补阐明A
在Dreambooth操练中,class的信息是可选的(对应论文中的class-specific prior preservation loss),在我本身的体味中,假设不是为了操练比力通用的大模子,一般能够漠视class选项。下面举一个栗子:
不加class项的操练过程(从左到右,操练epoch递增):
加了class项(man)的操练过程(从左到右,操练epoch递增):
明显看出,在加了class信息之后,关于布景的进修的更好了,但是在以下2个方面的效果下降了:
详细原因,小我理解为:加了class之后,模子会认为把target sample中呈现,但是在class sample中没有呈现的元素都当做要进修的目标内容,当样本不太清洁时,会让模子把冗余的布景信息也学进往(好比ghost旁边的人、CODM的logo),从而招致过拟合。反而不加class时,模子会漠视那些样本中时有时无的布景信息。
有趣的是,一项以制止过拟合而提出的手艺,却在样本不太清洁的情状下,反而招致了过拟合。
2.1.6 填补阐明B
Dreambooth能够在一次操练中,指定多个concepts一路操练。但是笔者发现如许会让操练变得困难,招致成果不如之前。下面举一个ghost和星瞳的例子:
成果就是,同时设置多个concept时,模子会学到每个concept(固然学的不如单concept好),但是假设让模子同时输出多个concept成果,或多个concept之间的关系,就比力困难。
原因阐发:当输进一个短语时(如:ghost and 星瞳),多主体之间的关系,应该是由CLIP模子停止语义解码的。颠末微调后,模子固然学到了特定词对应的图像信息,但是CLIP模子解码得到的语义信息没有足够进修(或被笼盖掉了),招致微调后多个新主题之间的复杂关系难以间接通过提醒词表现。
2.2 LoRA手艺原理和在Dreambooth上的利用
传送门:论文 | 代码
2.2.1 是做什么的?
We propose Low-Rank Adaptation, or LoRA, which freezes the pre- trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable pa- rameters for downstream tasks.
我们提出了低秩自适应(Low-Rank Adaptation, LoRA),它冻结了预操练的模子权重,并将可操练的秩合成矩阵注进到Transformer架构的每一层,极大地削减了下流使命的可操练参数的数量。
We propose Low-Rank Adaptation, or LoRA, which freezes the pre- trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable pa- rameters for downstream tasks.
我们提出了低秩自适应(Low-Rank Adaptation, LoRA),它冻结了预操练的模子权重,并将可操练的秩合成矩阵注进到Transformer架构的每一层,极大地削减了下流使命的可操练参数的数量。
其实就是加速微调:通过“矩阵合成”的体例,只需要微调更少的参数。
2.2.2 特征是什么?
Step1: 冻结原模子(图中蓝色部门)
Step2: 操练微调两个小矩阵参数A和B(图中橙色部门),能够理解为进修一个残差,只不外是通过矩阵合成的形式表达
Step3: 把模子参数矩阵相乘(BA)后,加到本来的模子参数上,构成新的模子
2.2.4 若何利用?
目前利用LoRA手艺停止AI绘画的体例次要有2个:
因为后者的内容良多,下一节中我会零丁停止介绍,本节次要介绍LoRA手艺在Dreambooth上的利用。即间接在Dreambooth的Settings中勾选“Use LoRA”选项。
小我觉得Dreambooth摘用了LoRA后,效果略有下降,比照图如下:
2.2.5 填补阐明
如斯一来,Dreambooth导出的LoRA模子岂不是全无用武之地?
2.3 LoRA的脚本操练与代码解读 2.3.1 一些根底
关于LoRA的操练,一般摘用秋葉aaaki 的那个LoRA教程 (请读者先进修该教程),除了教程内包罗的利用办法以外,简单填补几个常识点:
在lora-s/train.ps1中能够看出,现实挪用的是 lora-s/sd-s/train_network.py
而在那个过程中现实上有两个次要过程:
创建模子过程
在lora-s/sd-s/train_network.py中,在操练前会先读取base模子,并创建一个带lora的可操练模子
然后我们详细看下creat_network那个函数内部,若何创建新的lora模子的,脚本在 lora-s/sd-s/networks/lora.py。
进进到LoRANetwork类的 __init__函数内部看看,详细若何创建新的lora模子的。下方代码中展现,会根据原始的unet和text-encoder创建新的带lora的unet和text-encoder(不会针对vae停止操练):
再进一步,看一下LoRAModule的 __init__函数内部,是若何创建一个lora的。现实上就是针对原始模子中每一个层,都创建两个全毗连层(就是lora):
在最初停止前向计算时,把原始模子该层的输出与两个全毗连层的输出相加。那与论文中的做法是一样的。
操练模子过程
创建好带lora的模子(network)后,看lora-s/sd-s/train_network.py中核心操练过程如下,中规中矩
然后我们看下最核心的遍历样本操练的过程,能够看出有完全的正向扩散和反神驰噪两个过程。
2.3.3 跑几个demo
Ghost的case
为了便利与前文停止比照,我抉择ghost的数据集停止操练,下图展现了差别的 “操练step“ x ”lora权重” 的效果:
结论:
星瞳的case
同样的体例,我们在星瞳的例子长进行测验考试:
在星瞳的例子中,生成图中有很多“类文字”的内容,那是因为操练样本中有良多图片中就包罗文字,在ghost操练样本中文字被我手动抹往了。那也从另一方面阐了然lora与dreambooth的一个差别点:
总结起来能够理解为:dreambooth进修的是,认真比照差别样本中同时呈现的特定元素;而lora进修的是,可能看一眼差别样本中同时呈现的可能内容。
多concept合成的badcase
那里我同样测验考试下lora的多concept能否表示更好,在数据目次下别离创建了ghost和星瞳两个concept,并停止操练。但是在操练完成后,同样呈现了concept合成的情状:
关于concept合成的一些体味,目前网上的讲解不多,我看到比力好的是那篇:Lora人物操练(多concept)导论 ,他操纵多concept来对统一个角色停止换拆,concept之间的差别较小。
【填补阐明】:上边那篇材料中提到,秋叶的脚本无法调整keep_tokens,但现实上是能够的。在秋叶脚本的 train_util.py中, add_dataset_arguments那个函数里能够看到 keep_tokens参数的定义。当然我们也就能够在launch的号令中加进那个参数。
总的来说,concept合成是比力难以制止的问题,因为从原理上看,模子就是把多个concept的数据放在一路间接停止操练的,模子在进修过程中不免会学混。(没有像CLIP模子那样摘用了比照进修的办法,小我揣度,假设摘用比照进修的办法,再对错误配对的样本停止必然的赏罚,也答应以处理那个问题)
别的,假设对每个concept零丁操练一个lora模子,然后在推理时一路利用,也会呈现比力严峻的合成现象。因为现实利用时,时先将所有lora模子加和到大模子上,在停止生成的。下面是同时利用2个lora生成的badcase:
对此,我总结了一些小我的体味:
所以目前的结论就是:假设要操练多个concept,只要两种办法:
LyCORIS(Lora beYond Conventional methods, Other Rank adaptation Implementations for Stable diffusion) 是一些在LoRA的思惟根底上,对详细收集构造的改进。
A project for implementing different algorithm to do parameter-efficient finetuning on stable diffusion or more.
A project for implementing different algorithm to do parameter-efficient finetuning on stable diffusion or more.
畴前面代码中能够领会到,LoRA现实上是对原始模子中每个层,都创建了2层线性全毗连层,并在该层输出的时候加上往。那么假设我们创建的新构造不是2层线性全毗连,而是其他什么构造,能否会有更好的效果呢?那就是LyCORIS项目研究的内容。
详细来说,截至目前(2023.04.04)LyCORIS包罗了2种办法(也就是2种差别的构造来替代2层全毗连),别离为LoCon和LoHa。那是官方的阐明文档 ,下面我们别离简单介绍:
【填补阐明】:与lora差别,lycoris的脚本不放在lora-s/sd-s/networks下,而是在安拆过程中间接集成在python情况中(详细在 lora-s/install.ps1中的 pip install --upgrade lion-pytorch lycoris-lora),因而其脚本保留在 lora-s/venv/Lib/site-packages/lycoris下面。
LoCon介绍
模子原理在官方的阐明中已经介绍的很清晰了,其实就是用两个Conv操做,取代本来的两个矩阵相乘(Wa和Wb相乘)的操做:
下面我们浅浅的看一下关键代码,模子脚本位置:lora-s/venv/Lib/site-packages/lycoris/locon.py
素质上是把LoRA的2层全毗连替代成了带卷积构造的收集,最末该层输出为原始模子输出+卷积构造输出*一些因子。
LoHa介绍
LoHa办法,素质上是在LoCon的根底上,对Wa和Wb停止矩阵合成,其目标是为了提拔成果矩阵W的秩的上限。那基于一种假设,即秩矩阵的秩越高,凡是来讲其信息承载的才能越高。
下面我们浅浅的看一下关键代码,模子脚本位置:lora-s/venv/Lib/site-packages/lycoris/loha.py
素质上是仍然是摘用了LoCon的卷积操做,只不外此中参数不是间接初始化的大矩阵,而是通过初始化的小矩阵停止叉乘而得到的大矩阵。
2.4.2 LyCORIS理论 2.4.2.1 利用办法
想要利用lycoris模子,需要安拆lycoris插件:
然后就能够将lycoris模子和lora模子一样,加进到prompt中来利用了
并且也能够在“X/Y/Z plot”脚本中,比照差别模子的成果:
【填补阐明】:目前的lycoris插件不撑持addtional network插件,所以无法通过addtional network插件使其生效。(但是我亲身试用了下,locon是能够生效的,但是loha是没生效)
2.4.2.2 Demo展现和阐发
LoCon - Ghost
LoCon - 星瞳
LoCon - 一些结论:
LoHa - Ghost
LoHa - 星瞳
LoHa - 一些结论:
【填补】:关于LoHa的操练身手,假设读者小伙伴随更多的体味,欢送在评论区指点一二。 那里我就先贴一个关于几种模子调参数的体味贴:《Stable Diffusion Lora locon loha操练参数设置》
2.4.2.3 与LoRA的比照
为了同一度量,我们仍然在ghost和星瞳两个例子上来看察效果。起首看操练过程的loss
在那两个例子中,单纯从操练过程的loss来看模子效果(其他参数一样),loha locon lora。但是loss不代表一切,畴前面的例子中能够看出,locon和loha别离有一些的问题,反而loha的效果最不睬想。 (那不料味着该缺点无法制止,C站上仍然有良多优良的LyCORIS模子,那里只是论述LyCORIS的操练难度和利用难度可能比LoRA更大一些)。
2.5 Textual Inversion
传送门:论文 | 代码 | 插件
2.5.1 是做什么的?
Using only 3-5 images of a user-provided concept, like an object or a style, we learn to represent it through new “words” in the embedding space of a frozen text-to-image model.
只利用用户供给的概念(如对象或款式)的3-5张图像,我们进修通过冻结的文本到图像模子的嵌进空间中的新“单词”来表达它
Using only 3-5 images of a user-provided concept, like an object or a style, we learn to represent it through new “words” in the embedding space of a frozen text-to-image model.
只利用用户供给的概念(如对象或款式)的3-5张图像,我们进修通过冻结的文本到图像模子的嵌进空间中的新“单词”来表达它
其实就是进修一个新的词表达,做者在文中论证了,单纯进修词的表征已经可以进修到特殊而多样的概念。
2.5.2 特征是什么?
其实原理上很简单,从图中能够很明显看出来,做者把整个Generator部门都冻结,以及整个Text Encoder中的Transformer也冻结,其他词的embedding也都冻结,最初只留下目标词的embedding会参与到梯度更新中。
2.5.4 浅浅看一下代码
固然详细利用选举间接用WebUI停止操练,就已经很便利了。但是为了愈加曲看的理解他详细做了什么,我们仍是看一下 sd-s 项目中的关键代码:
在 sd-s/train_textual_inversion.py脚本中能够看到操练过程代码,整体流程上与前文的LoRA操练是差不多的,但是有几点关键差别:
因而能够看出,textual_inversion的操练,现实上是愈加地道的一种体例。仅仅是通过参数冻结的体例,更新特定词embedding来停止操练。
2.5.5 怎么利用?
一般来说,textual_inversion那种操练体例,因为指更新词embedding,梯度感化范畴低,限造了操练效果的上限。所以那种办法对样本的要求更高、操练难度更大,凡是不是首选办法。因而本文就给出一些教程链接,和简单的样例:
Textual-Inversion插件详尽介绍
教程1:
教程2:
为了便利比照,我们同样用Ghost的例子,来操练textual_inversion。期间创建词embedding、设置参数、起头操练等步调已经在教程中有介绍,本文就不赘述了。我们间接看一下操练效果:
可见固然最末效果不见得有Dreambooth那样精巧,但是模子已经完万能够晓得"Ghost"那个词的含义了。
2.6 HyperNetworks 2.6.1 HyperNetworks是什么
与Textual Inversion让梯度仅感化于词embedding比拟,HyperNetworks是让梯度感化于模子的Diffusion过程。他在Diffusion过程中的每一步都通过一个额外的小收集来调整往噪过程的成果。
准确的说,是感化在Diffusion的Attention部门,通过额外的小收集,把key和query停止变更,从而影响整个diffusion过程。
但是和Textual Inversion一样,因为其效果和操练难度的原因(需要设置收集构造、操练参数等),目前并没有成为支流抉择。
2.6.2 怎么利用?
HyperNetworks的操练与前文介绍的Textual Inversion十分类似,因而关于若何利用的问题,本文不外多赘述,仅贴出相关的教程供各人参考:
教程1:/
教程2:
教程3:
教程4:
教程5:/
在笔者更进一步的测验考试中发现,利用textual_inversion来操练多主体,仍然无法制止concept合成的现象(即无法把ghost和星瞳的两张脸画在统一张图里)。除此之外不只新进修的多个主体味呈现合成,连原有的主体词的信息也会被笼盖(如"ghost next to a dog",生成的图片中没有dog,只要ghost),即便调整提醒词权重也没有获得抱负效果。
那使我反过甚来,测验考试dreambooth和lora的操练成果(prompt: ghost next to a dog,并调整ghost和dog的权重),成果是
dreambooth模子呈现了concept笼盖,没有胜利生成dog,只要ghost。
lora的操练成果纷歧定会呈现concept笼盖,成果图中可能同时包罗ghost和dog,如下图(约一半概率出badcase)
那个例子也阐了然,lora操练出来的模子,固然精巧度不如dreambooth,但具有更高的泛化性。关于为什么会呈现那种情状,我小我倾向于把它理解成一种过拟合,即少数新的样本把大模子给带偏了。假设读者伴侣有那方面的相关体味,欢送在评论区指出~
3.2 写在最初
在文章的结尾,我列举一些我认为比力好的参考链接,期看可以帮到各人:
AUTOMATIC1111的一个十分全的文档:
一篇对各类插件的阐明:
Stable Diffusion Lora locon loha操练参数设置:
一些好用的插件介绍:
差别Tag和摘样办法效果:/
提醒词身手:
提醒词身手:
模子网站:/
模子网站:/
模子网站:/
提醒词网站:/
提醒词网站:/
提醒词网站:/
提醒词网站:/
提醒词网站:/
提醒词网站:/
提醒词网站:/#/
提醒词网站:
导航:/
导航:/
体味贴:
最初,本文是做者在摸索测验考试过程中,梳理总结得出的小我体味,此中难免会有疏漏之处。假设细心的小伙伴发现,请在评论区指出~