【AIGC】StableDiffusion学习笔记
本文目的:简单介绍ComfyUI下StableDiffusion的基本使用方法,及对各基本节点、技术的理解,让未接触过SD的同学能够快速入门。
注:本文中所有tooltips为【可下载导入工作流】的图片均可通过插件进行工作流导入,方便检索下载对应的自定义节点。
一、什么是StableDiffusion?
Stable Diffusion是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如内补绘制、外补绘制,以及在提示词指导下产生图生图的转变。
CCTV简单打个样:
绝了!AI视角下的神州大地 每一帧都是屏保 (cctv.com)
技术架构
Stable Diffusion使用的潜在扩散结构图。扩散模型所用的去噪过程。
Stable Diffusion是一种扩散模型(diffusion model)的变体,叫做“潜在扩散模型”(latent diffusion model; LDM)。扩散模型是在2015年推出的,其目的是消除对训练图像的连续应用高斯噪声,可以将其视为一系列去噪自编码器。Stable Diffusion由3个部分组成:变分自编码器(VAE)、U-Net和一个文本编码器。与其学习去噪图像数据(在“像素空间”中),而是训练VAE将图像转换为低维潜在空间。添加和去除高斯噪声的过程被应用于这个潜在表示,然后将最终的去噪输出解码到像素空间中。在前向扩散过程中,高斯噪声被迭代地应用于压缩的潜在表征。每个去噪步骤都由一个包含ResNet骨干的U-Net架构完成,通过从前向扩散往反方向去噪而获得潜在表征。最后,VAE解码器通过将表征转换回像素空间来生成输出图像。研究人员指出,降低训练和生成的计算要求是LDM的一个优势。
去噪步骤可以以文本串、图像或一些其他数据为条件。调节数据的编码通过交叉注意机制(cross-attention mechanism)暴露给去噪U-Net的架构。为了对文本进行调节,一个预训练的固定CLIP ViT-L/14文本编码器被用来将提示词转化为嵌入空间。
二、本地部署
本地部署SD最常用的环境有两类:
ComfyUI:https://github.com/comfyanonymous/ComfyUI
WebUI:https://github.com/AUTOMATIC1111/stable-diffusion-webui
个人推荐ComfyUI,封装程度低、工作流的操作模式,更有利于使用者理解整个执行过程和灵活调整,通过添加效率节点也能够达到不输于WebUI的易操作性。
ComfyUI的缺点:
1、教程相对WebUI偏少,不那么容易上手。
2、某些插件首发WebUI,在ComfyUI中的功能不完备(比如ComfyUI中Deforum不支持图像引导模式)。
安装过程很简单:
①安装Git
②git clone https://github.com/comfyanonymous/ComfyUI.git (下载zip包也可以)
③执行一下update文件夹中的update_comfyui_and_python_dependencies
④run_nvidia_gpu启动
(WebUI的安装过程类似,只是它没有embeded python环境,所以需要提前安装python,建议的版本是3.11.x)
必备插件:
ComfyUI Manager:https://github.com/ltdrdata/ComfyUI-Manager
没有Manager插件的ComfyUI就是手动档,所有的自定义节点都只能手工下载安装到指定目录,升级自动档后搜索安装节点都会变得更方便,并且当你拷贝别人的工作流发现一大片红色报错后,Manager也可以一键搜索缺失节点。
下载到custom_nodes文件夹下即可完成安装。
三、从最简单的default工作流说起
一切准备就绪后,进入ComfyUI加载默认工作流,我们就看到了SD最基本的执行流程:
不管以后学习到多么复杂的插件和工作流,图中的这些节点都是必不可少的,它们就是SD算法的核心。
3.1)Load Checkpoint
Checkpoint文件格式是由谷歌的TensorFlow团队发明的。它是一种在深度学习中常用的文件格式,用于保存训练过程中的模型状态。这些文件非常重要,因为它们允许模型训练在中断后可以恢复,同时也用于模型的分发和部署。
包含的内容包括模型权重、优化器状态、训练进度等。
checkpoint文件就相当于游戏存档点,保存了模型训练者的“游戏”进度,使用者可以在训练者的基础上做执行或者继续训练。
加载的ckpt文件即一般说的“基础模型”(俗称“底模”),底模的质量非常大程度上决定了输出图片的效果。
liblib上搜索底模的选项,除【基础算法Vx.x】的其他大多是基于SD官方底模进行精调后的模型:
最常用的是1.5和XL,一般在模型名称上会标注为sd15和sdxl。
工作流中使用的其他模型必须与所选底模基于通用的算法版本,工作流执行过程中的报错基本上都是源于模型基础算法版本不一致。
3.2)CLIP Text Encode (Prompt)
CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于对比文本-图像对的预训练模型。
正如节点名称中括号注释的内容,这个节点的作用是输入提示词,通过CLIP算法将提示词编码为约束条件Conditioning。
与我们平时使用LLM时不同,我们除开正向提示词还可以独立输入负向提示词,这是因为SD模型训练过程中会对每一个生成结果打标记,通过负向提示词就可以控制扩散算法在可选路径中将部分选项排除掉。
针对正向/负向提示词,前人们总结了很多通用的质量提示词、和谐提示词,比如正向的:
masterpiece, best quality, hyper detailed, ultra realistic, 32k, RAW photo......
负向的:
(worst quality, low quality:2), NSFW, watermark, text, bad hand,((extra hands)),extra fingers, too many fingers, fused fingers, bad arm, distorted arm, extra arms, fused arms, extra legs, missing leg,disembodied leg......
既然有通用的提示词,那为什么不直接训练到模型中去呢?个人理解是因为,与语言模型训练不同的,图像生成目前更偏向于艺术创作,生成的结果好坏很难有一套客观的评判标准,不合逻辑的艺术有时候就是我们所需要的结果。
3.3)Empty Latent Image
潜在扩散模型,如 Stable Diffusion,并不在像素空间中操作,而是在潜在空间中去噪。这些节点提供了使用编码器和解码器在像素空间和潜在空间之间切换的方法,并提供了多种操纵潜在图像的方式。
如果必须用一句话来描述潜在空间,它仅仅意味着压缩数据的表示。
图形结构转换到潜空间时隐去了大量的“噪声”,只保留关键要素,以此让模型把握到两个结构之间所具有的相同“模式”。
在图像生成过程中,与潜空间相对应的是“像素空间”,这个节点的作用就是基于一个给定尺寸的像素空间来创建一个潜空间,用于后续的图像生成。
3.4)KSampler
K采样器使用提供的模型以及正向和负向条件来生成给定潜在图像的新版本。首先,根据给定的seed和denoise强度对潜在图像进行加噪,部分擦除潜在图像。然后,使用给定的Model和positive、negative条件作为指导,去除这些噪声,"想象出"在图像被噪声擦除的地方生成新的细节。
该节点对应了Stable Diffusion中“扩散”的部分,它首先在输入的潜空间中初始化一个只有噪点的图像,然后在输入条件的约束下随机“擦除”图像中的噪声,根据给定的steps参数进行多轮迭代,每一轮迭代结果作为下一轮的初始图像,再继续进行降噪。
采样降噪的效果和效率取决于采样器的算法:
3.5)VAE Decode
正如前文所述,整个加噪采样降噪的过程都是在潜空间中进行的,最终需要通过VAE解码到像素空间,变成可视的图像。
相对应的,还有VAE Encode节点,可以将像素空间图像转换到潜空间,由此来进行进一步的处理,也是一种图生图的过程。
四、LoRA低秩适应
LoRA(Low-rank adaptation,低秩适应)是一种基于适配器的有效微调模型的技术。其基本思想是设计一个低秩矩阵,然后将其添加到原始矩阵中。
LoRA最初应用于NLP领域对LLM进行微调,但由于使用普通的消费级显卡就能够训练出一个效果极佳的LoRA模型,使得它现在在大众更为喜闻乐见的图像生成领域也有非常高的热度。
简单来说LoRA的原理是通过把模型中的高秩矩阵分解为两个低秩矩阵,在降低了规模的模型上进行微调,再添加到基础大模型上之后对其产生影响。
4.1)看几个例子
图1:
图2:
图3:
这几个图都是使用了第三章默认工作流中的全部设置(基础模型、提示词、采样器参数等)生成的,效果差别非常大。
分别使用了【真实摄影—目前全网最真实的摄影lora_v1.0.safetensors】【电商产品摄影,光影交错的写实场景_1.0.safetensors】【油画模型_v1.0.safetensors】这三个LoRA,是不是很容易看出来它们和输出结果的对应关系?
4.2)使用LoRA
将下载好的模型(在哪下载,后文推荐)放到ComfyUI安装目录的【models/loras】下,然后就可以开始搭建工作流了:
可以看到使用LoRA非常简单,只需要在默认工作流中添加一个加载LoRA的节点就行了。
加载LoRA节点的位置直接处于基础模型的输出下游,符合之前所说的理论知识,因为它是直接对模型产生影响的。
4.3)多LoRA共同工作
我们可以在ComfyUI中将多个LoRA加载器串联起来让它们同时生效,就像这样:
不过更优雅的方式是这样:
4.4)注意事项
- 由于LoRA的训练过程是基于某一个特定的基础模型,所以通常下载使用一个新的LoRA时也需要留意它的基础模型,只有在LoRA和基础模型配套的情况下它才能发挥出最佳的效果。
- 不同的LoRA训练素材通常也都有巨大差异,素材中包含的内容元素也不尽相同,如果使用人物向的LoRA来生成物品类的图像,结果可能会出人意料。比如用一个大量动漫人物素材训练出的LoRA来生成我们的瓶子就可能得到这样的结果:
- 节点上默认的LoRA强度是1.0,如果想要让LoRA的“个性”不要过于强烈,可以适当降低其权重,比如将上图使用的LoRA权重调整到0.8时,我们又能看到这个熟悉的瓶子了:
五、ControlNet控制网络
ControlNet 是一个控制预训练图像扩散模型(例如 Stable Diffusion)的神经网络。它允许输入调节图像,然后使用该调节图像来操控图像生成。
在此之前,AIGC的内容一直是有非常大的不确定性的,想要得到一个需求比较明确的输出图像(比如想要精确控制人物的姿态、场景布局等)通常需要非常多次的“抽卡”。
但是ControlNet的出现打破了这一窘境,文字提示词对图像的描述本身就存在着巨大的模糊空间,而一旦使用图像来描述图像,就可以进行精确的控制了。
5.1)举个例子
如果我们想让默认工作流的提示词输出一个曲颈瓶,在不改动提示词的情况下可能得花很长时间来撞大运。但是有了ControlNet之后,只需要随便找一张曲颈瓶的图片:
我们就能够得到它:
我们所需要的工作流也非常简单:
相比于默认工作流,我们多使用了4个节点(预览节点不参与处理不算数):
【Load Image】加载“提示词”图片这个很好理解,不多赘述了。
【Canny Edge】是ControlNet预处理器的一种,用于分析图像边缘。
【Load ControlNet Model】用于加载ControlNet模型。
【Apply ControlNet】最后将ControlNet应用到处理过程中。
从应用ControlNet节点的位置及其输出可以看到,与LoRA不同,它对模型不产生任何影响,而是通过控制“CONDITIONING条件”来达到目的。
5.2)关于预处理器
可以通过下图来直观感受各个不同的预处理器的作用:
不同的预处理器可以搭配不同的ControlNet模型进行使用,但是预处理器并不总是必须的,它的作用仅仅是用于输出供ControlNet使用的参考图像。
5.3)多ControlNet共同工作
和LoRA类似,也可以使用ControlNet堆来快速加载多个ControlNet:
5.4)注意事项
ControlNet虽好,但是不能过量。由于ControlNet本身并不能理解输入图像的内容,所以当输入图像与文本提示词、模型素材有相当大冲突的时候,过分地使用ControlNet进行限制,反而会产生匪夷所思的结果,比如:
六、IPAdapter
IPAdapter就像是一个通过一张图片训练出的LoRA,它能够实时分析输入图像的主体、风格等信息,然后融合到基础模型中去。
同样是用图像进行控制,IPAdapter却又不同于ControlNet,ControlNet主要是基于图像的二维或三维结构来对生成条件进行控制,而IPAdapter则是对输入图像的风格进行参考。
6.1)风格迁移
下图展示了基本的IPAdapter工作流以及三种强度模式的差异:
“标准”强度下模型对输入图像的参考远超过了提示词的关注;“提示词为主”强度下则在保留了瓶子主体的同时使用了参考图的卡通风格;“风格迁移”强度下则融合了提示词的内容和参考图中的糖果元素。
6.2)图片融合
在使用SDXL模型的前提下,还可以同时给IPAdapter提供两张参考图,其中一个作为风格参考,另一个作为内容参考:
在少量提示词的情况下,输出图像很好地迁移了老鼠图的卡通风格和实拍图的多个元素,不过融合两个风格迥异的图片时非常容易出现比较鬼畜的结果。
七、文/图生视频
每秒播放数张图像帧就构成了视频,但是由于孤立的图片生成具有很大的随机性,所以文/图生视频却不仅仅是简单地生成多张图像就能够实现的。
其中的问题包括:
- 如何控制相邻的两帧平滑过渡?
- 如何控制图像元素的运动模式?
- 如何保持人物主体的一致性?
- 如何维持运动过程中前后景元素的三维空间位置关系?
目前已经有许多开源模型提供了解决方案,比如SVD、AnimateDiff、SteerableMotion、Deforum等。
成熟的商业化产品则有如Gen3、Luma、Sora等等。
后续继续学习再来更新这块内容...
八、资源站
自定义节点:
模型:
工作流:
PS:很多自定义节点都会提供示例工作流,下载后到对应文件夹中找一下examples目录即可。