Stable diffusion文生图一文全解 |
您所在的位置:网站首页 › gsea结果图如何看 › Stable diffusion文生图一文全解 |
免费试用,与本地部署的界面不一样,比较简单,可以体验一下: 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 skipface作为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 scaleCFG 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: ancestralsampler有很多种(如右图),我们可以看到,其中有很多种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 |