Stable diffusion文生图一文全解

您所在的位置:网站首页 磁力链怎么转化成种子 Stable diffusion文生图一文全解

Stable diffusion文生图一文全解

2023-04-27 17:53| 来源: 网络整理| 查看: 265

免费试用,与本地部署的界面不一样,比较简单,可以体验一下:

https://stablediffusionweb.com/#demo

原来是在飞书文档编辑的,放在这里有点乱了,推荐去原文观看:https://m6xmaedd3o.feishu.cn/docx/GuMtdXsYjoGchjxk08vczYtQnMh

原理简介与相关参数详解

Stable diffusion是一个深度学习模型。我会简单介绍一下它的大概原理与结构,不会涉及数学,主要从概念出发,请各位放心食用。

为什么需要知道原理呢?如果你不想了解也是可以跳过的,但是了解原理可以让你更深入的理解各个参数的作用,这样你才能够更好的调整,以达到你需要的效果。

结构

我们先从整体结构开始讲起,大家从整体上有个了解之后,我们再对各个部分详细展开进行讲解。

原理主要可以分成两部分,一是模型的训练,二是图片的生成(模型的使用)。这一篇主要对第二点进行说明,因为对于初学者来说,并没有必要去训练模型,所以也不必去纠结模型的训练原理。

结构图:

生成图片,我们主要需要两个输入:1. 提示词(prompt),2. 种子(生成噪声图)。

提示词(prompt)在提供给模型之前,需要进行一些处理,这是因为模型无法直接识别文本。第一步是使用CLIP,其作用是将提示词(prompt)转换成Tokenizer(也叫token),也就是数字,一个词语转换成的token数量是不一定的。第二步是将token转换成Embedding,Embedding是一个768维的向量,简单理解就是768个数字。第三步是将Embedding通过Text transformer转换成模型的输入。这里术语比较多,大家不一定需要非常了解,只要简单记住大概的作用就可以了,想要详细了解的话后面也会详细一些展开讲解。

种子的作用,是生成噪声图,一个固定的种子+固定的分辨率,生成的噪声图就是固定的。模型会以这个噪声图为基础进行图片生成。需要说明的是,噪声图并不是一张图片,它是在潜空间里的,你可以简单理解为是压缩后的噪声图。

图片的生成过程,主要分成两步:1. 去噪,2. 从潜空间转换成真实的图片

去噪是生成图片的主要过程,是stable diffusion的精华所在,但是这个过程我们不会讲的非常详细,因为讲的详细会涉及到很多的数学知识,不容易理解,我们主要看一下它的过程。去噪可以简单理解为,模型觉得噪声图像什么,就把图片往什么东西修改。这个像什么的判断,会受到提示词的影响,也会受到模型的影响。修改是分步进行的,前面会进行比较大的修改,后面的修改会越来越小。修改图片使用的是U-Net,U-Net就是模型的主要内容。

去噪完成后,我们就得到我们的结果图了,但这是在潜空间里的,也就是说是被压缩过的,无法直接显示成图片。所以需要将其进行转换,变成我们能够看到的图片,这里就是用的VAE模型进行转换。需要说明的是,stable diffusion的模型都是自带VAE模型的,但效果不一定好,我们也可以自己选择需要使用的VAE模型。

参考:

https://www.bilibili.com/read/cv21564981?spm_id_from=333.999.0.0

https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

https://stable-diffusion-art.com/how-stable-diffusion-work/

Prompt相关token的生成

这个就不讲原理了,就是把文本转换成数字,讲几个注意点:

一个词不一定只生成一个token,可能会生成多个。一个苹字有三个token。

中文一个词生成的token数量会比较多,而且很多词模型是不认识的,所以最好使用英文。apple只需要一个token,苹果要6个token。

逗号也会生成token,所以你的词中如果多加了一个逗号,重新生成图片就会发生变化。

token数量存在上限。现在测试貌似没有上限了

可以使用tokenizer插件测试prompt生成的token

https://github.com/AUTOMATIC1111/stable-diffusion-webui-tokenizer

Clip skip

face作为prompt,测试clip skip的影响

原理:prompt最终在模型中使用时,是分层的,对于stable diffusion模型来说,分成了12层。clip skip就是说,我不需要完整的使用这12层,而是跳过其中一些层。跳过的层越多,对细节的控制就越少。比如上面的图中,我们的描述词是face,那么face会有一些细节:眼睛、鼻子、嘴巴的具体形状应该怎么样,肤色应该怎么样等等。我们对比高的clip skip和低的clip skip,可以发现在clip skip较低时,基本都可以看到脸上的细节,而clip skip较高时,就比较随机,经常出现类似没有眼珠的这种情况,这是因为没有对细节进行控制,所以细节的随机性会更大。

如何调整clip skip?在settings中找到Quicksettings list,增加CLIP_stop_at_last_layers:

再点击Apply settings,再点击Reload UI,即可在最上方看到

参考:https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/5674

CFG scale

CFG scale控制prompt对画面的控制强度,设的小会导致画面不容易生成你在prompt中描述的内容,设的大则会导致用力过猛,出现画面过饱和的现象。

我们看测试图:

过饱和的现象可以通过调高steps来略微缓解,上图是在steps=20时生成的,修改steps=50,得到:

参考:

https://decentralizedcreator.com/cfg-scale-in-stable-diffusion-and-how-to-use-it/

https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/5674

测试:

https://github.com/thekitchenscientist/sd_lite/wiki/recommended

prompt语法

正向提示词与反向提示词

输入提示词有两个位置:

Prompt:你需要生成的

Negative prompt:你不想要生成的。常见的例如控制不要生成各种奇怪的物体,例如多只手、低质量图片等。

权重控制

推荐使用(),例如apple,用()控制权重则写成(apple:1.5),数字可以在0~2之间,越大表示你越想要生成apple。

() [] {}

步数

采样器(sampler)是什么

先再次看下结构图:

图片的生成过程叫做sampling,使用的方法叫采样器(sampler),也就是图中使用U-Net处理图片的部分。

sample的过程是分步进行的,文生图界面中有一个Sampling steps(采样步数)就是控制这里的步数,也就是会经过几次降噪。通常来说,采样步数越多,生成的效果越好,但是耗时会更长。采样步数到一定大小后,增加步数基本就没什么区别了。一般来说,使用默认的20步就够了。

Noise schedule(default/Karras)

每次降噪,都是对图片的一次修改,通常修改的强度是前面几步较强,越到后面修改强度越弱。对每一步降噪强度的控制,叫做Noise schedule,这就是sampler的一部分功能,也就是说不同的sampler每一步的降噪强度可能是不同的。

普通的,以及名字中带Karras的Noise schedule:

ancestral

sampler有很多种(如右图),我们可以看到,其中有很多种sampler是带后缀a的(Euler a, DPM2 a...),这指的是ancestral,从名字不太容易看出含义,它指的是在每次sample之后,会再给新生成的图片加一次噪声,这会造成什么影响呢?图片被增加了一些随机性,因为加入的噪声是随机的。具体来说,就是使用这些sampler时,生成的结果图片在其他条件不变时,修改sampling steps,会导致生成的结果有比较大的变化。

对比图:

Euler a

Sampling steps 2~40

Euler

Sampling steps 2-40

不同sampler的效果对比

通常来说,我们更关注图像的生成速度而不是质量,一般的采样方法质量相差不会太大,质量主要由模型、提示词等来控制。

所以我们淘汰速度比较慢的:DMP2,DPM adaptive,Heun,DPM++ 2S

剩下的sampler中推荐(不绝对,可以自己多尝试):

    如果你需要收敛性,那么选择DPM++ 2M Karras, Euler和UniPC也可以。

    如果你需要比较高的质量,可以选择DPM++ SDE Karras,Euler a。

    如果你需要更快的速度,可以选择UniqPC,并且把步数调的很低。

收敛性

速度

最慢的是DPM adaptive。

剩下的可以分为两档,主要是因为一类使用的是 2nd order solvers,一类使用的是first order solvers,使用2nd order solvers会更精确,但速度更慢。

质量

越小越好。

参考:

https://www.reddit.com/r/StableDiffusion/comments/11oke60/comparison_of_new_unipc_sampler_method_added_to/

https://www.reddit.com/r/StableDiffusion/comments/12o2l9j/sampler_cfg_vs_step_count_comparison/

https://stable-diffusion-art.com/samplers/

cobanov.dev

模型

这里说的模型,是大模型(也叫checkpoint model),除了大模型之外还有Lora、embedding、hypernetwork等,暂不做介绍。

模型中包含了CLIP、U-Net、VAE。

虽然有很多模型,但从基础模型来说,目前最常用的就只有SD 1.5和SD 2.1,SD 1.5是最多的。其他模型都是基于这两个模型去进一步训练的,也叫fine tune。

SD1.5和SD2.1的主要区别,是SD1.5的训练集是512*512的图像,而SD2.1的训练集是768*768的图像,所以相对来说SD2.1更擅长生成大图。不过SD2.1有一个缺点,就是无法生成NSFW的图片。还有一点区别,是SD2.1使用的是OpenCLIP而不是CLIP,clip skip参数是不生效的。

模型有两种格式,对应文件名后缀是.ckpt和.safetensors,.ckpt是旧版本,.safetensors是为了解决安全问题而新出现的版本,对于本地部署使用来说都是没有问题的,如果要开放使用,那么最好只使用.safetensors。

模型按照精度,可以分为fp16和fp32两种。说精度可能不太理解,总之如果只是用来生成图片,那么fp16就够了,通常fp16大小更小、更省显存、生成速度更快,图片质量和fp32相差不大。如果你需要基于某个模型自己训练模型,那么可能fp32是更好的选择。

VAE模型是包含在大模型当中的,但是你也可以自己指定要使用的VAE模型,可以从网络上获取。

模型介绍:

https://www.bilibili.com/read/cv21362202

https://zhuanlan.zhihu.com/p/597504900

https://www.reddit.com/r/StableDiffusion/comments/11s6485/eli5_what_are_sd_models_and_where_to_find_them/

模型推荐:

https://www.reddit.com/r/StableDiffusion/comments/11gzbc0/i_did_the_work_so_you_dont_have_to_my_quick/

文生图使用方法基本使用,一图讲解参数

百文不如以图,基本的使用方法参考图片吧:

高清修复

高清修复(Hires fix)单独再讲一下,是生成高质量图片的常用选项。开启高清修复后,生成图片的过程分成三步:

基本的文生图方法,生成配置的分辨率大小的图片。

使用指定的放大算法,将第一步中生成的图片放大到高清修复中指定的分辨率大小。

使用图生图,以放大后的图片为基础,重新生成图片。

为什么要分成三步,而不是直接生成大图呢?这是因为模型训练时使用的图片分辨率大小是512*512(SD1.5是512*512,SD2.1是768*768,目前使用的模型大部分是512*512),所以不擅长直接生成大图,直接生成大图容易出现奇怪的现象,例如两个头。所以需要先生成小图,再去放大,这样才能得到更高质量的图片。

使用:

参考:https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/6509

如果觉得写的还可以,顺手转发一下吧^_^



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3