Stable Diffusion的最大魅力体现在其DIY的能力上。它不是什么图都能画出来,但是我们可以根据自己的需求,训练它成为我们想要的样子。
其中,Text Inversion 就是一种最简单有效的训练方式。它比 Lora 训练更简单,对数据集的要求比较低,适合入门。 它的训练过程和 Lora 有很多共通的地方,熟练掌握的话对于后期 Lora 训练也是很有帮助的。 和 Lora 一样,它也可以用来训练任何人脸,生成任何人的照片。
其实,早在一年以前,就有很多关于它的教程。然而,那时的 WebUI 跟现在的有所不同,可能会让你感到困惑。而且,之后还出现了一些新的处理数据集的方法。 所以,我觉得有必要写一篇新的文章,让大家从原理层面深入了解 Text Inversion。
在这篇教程中,我会用著名好莱坞女明星 Angelina Jolie 的照片进行训练。
如果你喜欢看视频教程,那么我非常欢迎你观看本文所对应的视频(B站同名帐号):
https://www.bilibili.com/video/BV1sZ421y7kQ/
有人可能会问,Angelina 是个名人,Stable Diffusion 训练过她的照片。那么我再为她训练 Embedding 有什么意义呢?
让我来解释一下。 我们都知道,Stable Diffusion 是用网络上公开的6亿张包含描述的图片训练而成的。 这些图片的质量都不太高,而且未必符合我们心目中的 Angelina 的形象。如果我们要生成自己心目中 Angelina 的样子,就可以筛选出我们喜欢的照片,然后用它们来进行训练。这才是训练的真正意义。
看,下面是训练前后的对比图片。左边这列是原版的Angelina。右边是我训练的Angelina。它们的区别还是挺大的吧。
接下来,我将一步步引导大家通过实例学习Text Inversion的训练过程,包括数据集的准备、图片的预处理、训练过程以及测试训练结果。
数据集的准备
训练开始前,数据集的准备是至关重要的一步,它直接影响到最终生成图像的质量。遵循以下两个原则以确保数据集的质量:
-
图片质量优于数量:选择高质量的图片比大量低质量图片更为重要。
-
多样化:尽可能选择角度、表情和背景各异的人脸图片,以便AI能全方位学习人物特征。
推荐至少准备10张以上的面部图像,并可以包含一些上半身或全身照片,以学习人物的体型和姿态。注意,图片中不应包含水印,以避免影响最终结果。
看,这是我用不同质量的数据集生成的效果。左边这列的是用质量比较差的数据集,跟右边的效果还是有差距的吧?
图片预处理
图片准备工作完成后,接下来的重要步骤是进行图片的预处理,包括裁剪和打标,以确保所有图片都有统一的分辨率,推荐尺寸为512x512。这一步骤对于提高训练效果和最终图像的质量至关重要。以下是详细的预处理步骤:
1️⃣ 选择合适的工具:由于新版本的WebUI已经移除了"图片预处理"功能,因此需要借助外部工具进行预处理。我在这里推荐一个在线批量处理图片的网站,使用起来非常方便。网址是:
https://www.birme.net/?target_width=512&target_height=512
2️⃣ 上传图片:
-
访问推荐的在线批量处理图片网站。
-
点击"BROWSE FROM YOUR COMPUTER"按钮打开文件浏览器。
-
进入包含要处理图片的文件夹,按
Ctrl + A
选择所有图片,然后点击"打开"。
3️⃣ 自动裁剪和焦点检测:
-
上传后,网站会自动识别每张图片的焦点,通常是面部,确保裁剪区域的准确性。
-
确认"Auto detect image focal point"(自动检测图像焦点)选项已勾选。
4️⃣ 手动调整:
- 预览处理效果,对于自动标注不准确的图片,手动调整裁剪区域。例如,如果某张图片的脸部被不当裁剪,可以通过拖动裁剪框来调整。
5️⃣ 保存和下载:
-
调整完成后,点击"SAVE AS ZIP"按钮,将处理后的图片保存为ZIP文件。
-
选择一个位置保存压缩文件,完成图片的批量裁剪和预处理。
通过上述步骤,我们可以确保数据集中的每张图片都被正确地裁剪和标注,为接下来的训练过程打下良好的基础。这一环节虽然看似简单,但对于提升最终生成图像的质量起到了决定性作用。
精确打标
为了充分利用Stable Diffusion的能力,精确地为图片打标是一个不可忽视的步骤。这一过程通过添加描述性的提示词来为图片内容进行标注,是使用Text Inversion或Lora训练方法的关键环节。下面,我将详细介绍如何高效地完成这一任务。
打标的重要性
Stable Diffusion的训练依赖于大量带有描述的图片,正是这些描述使得我们能够通过提示词来生成特定的图片。因此,为你的训练图片准确打标,能够显著提高生成图像的质量和相关性。
使用WebUI的Tagger插件打标
1️⃣ 安装Tagger插件 :首先,确保你的WebUI中安装了Tagger插件。如果尚未安装,可以去Github上下载(https://github.com/toriato/stable-diffusion-webui-wd14-tagger)。也或者访问我分享的度盘链接(https://pan.baidu.com/s/1jvg7A0j20XiilvJK-NYmoA?pwd=v5d8)。
2️⃣ 批量处理图片 :进入WebUI后,切换到Tagger标签页并点击"从目录批量处理",输入你的图片路径。这一路径依据你运行Stable Diffusion的环境而定,可能是本地或服务器。
3️⃣ 选择模型和调整参数:
-
在"反向推导器"下拉列表中选择一个模型。对于处理人像图片,"ViT v2"模型通常是一个不错的选择。
-
调整权重阈值(Weight threshold)以控制标注的详细程度。记住,阈值设置得越小,生成的标注就越详细,但同时也可能增加无效标注的数量,从而需要更多时间进行手动修正。
4️⃣ 开始打标:设置好参数后,点击"反向推导"按钮开始打标过程。这一过程完成后,你可以在输出目录中看到每张图片对应的文本文件,里面包含了生成的提示词。
审核和调整标注
完成自动打标后,不要忘记检查并调整这些文本文件中的提示词。尽管自动打标可以节省大量时间,但人工审核和精细调整是不可替代的,特别是当你追求最优的训练效果时。
-
查看并编辑文本文件:转到数据集的文件夹,你会发现许多与图片同名的文本文件。打开任一文件,检查里面的提示词。
-
精确调整:根据需要编辑或添加提示词,以确保它们尽可能准确地描述图片内容。更精确的标注意味着更优质的Text Inversion训练结果。
批量修改标注
在进行Text Inversion训练前,对图片的标注进行精确调整是关键一步,这不仅关乎训练效果的优化,还涉及到训练过程的高效性。以下是如何利用特定工具来批量修改标注的详细指导。
使用Dataset Tag Editor插件
为了高效管理和修改图片标注,我们将利用一个称为Dataset Tag Editor的插件。这个工具可以大幅简化标注的编辑过程。
-
安装插件 :首先,确保安装了Dataset Tag Editor插件。如果尚未安装,可以去Github上下载(https://github.com/toshiaki1729/stable-diffusion-webui-dataset-tag-editor)。也或者访问我分享的度盘链接(https://pan.baidu.com/s/1L6_RFnU9By5hPmNkSv0hMw?pwd=r3kw)。
-
加载图片和标签:在Dataset Tag Editor的标签页内,填写图片和标签文件所在的路径,然后点击"加载"按钮。加载成功后,页面上将显示文件夹内的所有图片及其标签。
理解标注的重要性
如何处理标注呢?这个过程有一些反直觉。 我们都知道,嘴唇是 Angelia 非常独特的特征。我们要 AI 学习这个特征的话,需要保留"lips"嘴唇这个词吗? 我们的第一反应可能是需要。但实际上是不需要的。
因为我们是无法通过文字准确地描述出Angelia嘴唇的特征的,AI 真正依靠的是图片来学习,而不是文字。这一点跟人类是一样的。我们告诉一个画家Angelina嘴唇的厚度和形状,他就能准确的画出来吗?还是得给参考图片,你说对不对?文字只是用来让人类给 AI 发送指令。 希望我这个解释你能够理解。
批量编辑标注
1️⃣ 选择和删除标签 :通过Dataset Tag Editor,你可以轻松查看并选择特定的标签,以便批量删除不需要的标签。例如,"lips"、"breasts"、"nose"等描述可能并不必要,而有关背景的标签如"white background"则可能需要保留。这样AI就不会把白色背景跟Angelina扯上关系。否则最后哪怕提示词里没有白色背景这个词,出来的图也可能是白色背景的。
2️⃣ 执行批量删除 :在"批量编辑图片描述"区域,使用"搜索和替换"、"移除"和"高清化"等功能来批量处理标签。选择"移除"选项卡,选择你想要删除的标签,并执行删除操作。
3️⃣ 单个编辑标注 :有些出现频率不高的词,我们还可以一个一个删除。然后点击"批量编辑图片描述"右边的"编辑所选图片的描述"按钮。这里出现了选中图片的描述,可以点击"复制并覆盖"按钮,把提示词复制到下方的文本框里进行编辑。
比如说我删掉"eyelashes"这个单词,然后点击"应用变更到所选图像"。
就这样通过批量编辑和单个编辑的功能,我们就可以完成对所有图片描述的编辑。最后再点击"保存所有更改"。
准备训练:基础设置指南
在启动Text Inversion训练之前,正确配置Stable Diffusion的WebUI设置是非常关键的一步。这些设置不仅影响训练的效率,还关系到最终训练结果的质量。下面是如何进行这些基础设置的详细指导。
访问WebUI设置
-
在WebUI中,点击"设置"标签页。
-
向下滚动,找到"训练"的设置选项并点击。
-
进入后,根据需要进行一些基本配置。
基础设置项
-
训练时将VAE和CLIP从显存(VRAM)释放到内存(RAM):如果你的设备显存较小,可以勾选第一个选项以优化显存使用。这有助于在显存受限的情况下进行训练,但可能会略微影响训练速度。
-
启用Dataloader的pin_memory:追求更快的训练速度可以勾选第二个选项,但需注意这会增加内存的使用。
-
将优化器状态保存为单独的optim文件:勾选第三个选项会在训练文件夹内生成备份文件,使得训练可以在中断后无损恢复,这对长时间的训练尤为重要。
-
在每次训练开始时将文本倒置和超网络设置保存在文本文件中:第四个选项通常默认勾选,负责自动备份训练过程,可以保持默认。
-
训练进度保存:"每N步保存一个CSV文件"的选项可以帮助你跟踪训练进度。默认值可能设置为每500步保存一次,根据需要你可以调整为更频繁的保存,比如每50步,这有助于更密切地监控训练过程中的loss变化。
应用设置
设置完成后,别忘了点击"应用设置",随后点击"重新加载WebUI"以确保所有设置生效。这一步是准备训练的最后环节,确保了训练环境根据你的具体需求进行了优化。
启动Text Inversion训练
在完成所有基础设置之后,下一步就是实际开始Text Inversion训练。本节将指导你如何进入训练界面,创建embedding,并选择合适的底模进行训练。
进入训练界面
-
在WebUI中,找到并点击"训练"按钮以进入训练界面。
-
训练界面是Text Inversion训练的操作中心,在这里你将配置和启动你的训练任务。
创建Embedding
训练的首要步骤是创建一个embedding,这是一个表示你要训练图像特征的向量。正确设置embedding对于训练结果的质量至关重要。
选择合适的底模
底模的选择对训练的成功和最终效果有着重大影响。推荐选择版本为1.5的底模,因为它提供了更好的泛化性,即训练好的模型可以在基于1.5版本的其他模型上表现良好。
-
避免选择SDXL模型:请注意,选择SDXL模型可能会导致训练过程出错。
-
下载底模 :如果你还没有1.5版本的底模,可以在Hugging Face上进行下载(https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main)。较大的这个模型,可以提供更优秀的训练效果。
其他设置
-
**VAE设置:**在设置时,VAE(变分自编码器)最好选择为"无"。
-
**命名你的训练任务:**给你的训练任务起一个名字,这个名字可以是任意的,但最好能反映出训练的内容或目标。例如,在本例中,我们将训练任务命名为"ajaj"。
-
初始化文本:留空,确保从零开始训练,避免受到底模影响。
-
每个token的向量数:理论上,数值越高,能表现的特征也越多。实际上,1或2已足够。
参数设置好以后,点击"创建embedding",一个空的embedding就被创建好了。现在,一切准备就绪,你可以启动训练过程,开始创建属于你的定制化模型。
Text Inversion训练的底层逻辑解析
Text Inversion训练的过程和目的是利用Diffusion模型,通过训练使得特定的embedding能够生成与训练图像高度相似的结果。为了帮助大家更好地理解这一过程,下面是对Text Inversion底层逻辑的详细讲解,包括embedding的作用以及训练过程中的关键步骤。
Embedding的角色
-
什么是Embedding:在AI和机器学习领域,embedding是一种将离散变量(如单词)映射为连续向量的技术。这些向量代表了高维空间中的点,能够捕捉到变量之间的某些关系,如语义相似性。
-
名称与提示词:在Text Inversion中,我们给定的名称(如"ajaj")实际上是一个提示词,它代表了我们想要生成的特定图像特征的embedding。训练开始时,这个embedding是空的,或者说,它并未包含足够的信息来指导Diffusion模型生成我们期望的图像。
训练过程
-
从噪点到图像:训练开始时,Stable Diffusion将使用的训练图(如Angelina Jolie的照片)转换成一堆像素或噪点。这些噪点通过训练逐步组织成有意义的图像,过程中embedding起到了指导作用。
-
图像生成与对比:Diffusion模型会尝试根据当前的embedding去除噪点中的随机性,生成图像的初步版本。然后,模型会将这个版本与原训练图进行对比,评估二者之间的差异。
-
损失计算(Loss):通过比较生成图像与训练图之间的差异,模型计算出一个loss值,这个值表示两者之间的差异程度。Loss值越低,意味着生成的图像与训练图越相似。
-
迭代优化:根据loss值,Stable Diffusion会不断调整embedding,通过反复的迭代过程,逐步减少生成图像与训练图之间的差异,直到达到一个理想的状态,此时的embedding能够指导模型生成与训练图高度相似的图像。
通过上述讲解,我们可以看到Text Inversion训练实质上是一个不断迭代的过程,旨在优化embedding,以便Diffusion模型能够根据这个优化后的embedding生成与训练图非常接近的图像。这个过程涉及到对训练图的深入理解,以及如何通过不断调整和优化embedding来减少loss值,从而提高生成图像的质量和相似度。
启动Text Inversion训练:深入设置与优化指南
在深入了解Text Inversion的底层逻辑后,是时候将这些理论应用到实践中,启动我们的训练过程了。下面的指南将帮助你进行更精细化的设置,以优化训练效果和效率。 我们点击"训练",进入训练参数的设置界面。Embedding就选择我们刚才创建好的embedding。如果在下拉列表里找不到的话,可以点击右边的刷新按钮。
"超网络"、"超网络学习率"、"梯度裁剪"都不用设置。这几个都是关于训练"超网络"的。比较重要的是"学习率"。
Text Inversion训练中的学习率策略
在Text Inversion训练过程中,合理设置学习率对于达到最佳训练效果至关重要。学习率决定了AI模型学习的速度,太高或太低都可能影响最终结果。下面详细介绍如何在训练中设置和调整学习率。
学习率的重要性
学习率可以被视为训练过程中的"步伐大小"。一个适当的学习率使得模型能够有效地学习,避免过快学习导致的过拟合或学习不足。
-
高学习率:在训练初期使用较高的学习率可以快速达到一个较好的起始点,类似于快速雕刻出佛像的轮廓。
-
低学习率:随着训练的进行,逐渐降低学习率可以帮助模型更细致地调整,精确雕刻出细节,防止过度拟合。
学习率策略
一个经验丰富的Reddit用户分享了他们的学习率策略,该策略在多个数据集上都显示出了有效性。策略如下:
-
初始阶段:从第1步到第10步,使用较高的学习率0.05,快速捕捉基本特征。
-
中期调整:随后降低学习率,例如,10-20步降至0.02,20-60步降至0.01,逐步细化模型。
-
后期微调:从第3000步开始,学习率进一步降低至0.0005,进行精细调整直到训练结束。
实际应用
-
默认学习率:默认的学习率可能是固定的,例如0.05,这对于许多情况已经足够。但是,采用动态调整的学习率策略可能会带来更精细的控制和更好的结果。
-
个别数据集测试:对于特定的数据集,测试不同的学习率策略,观察效果,选择最适合你项目的设置。
通过采用这种分阶段调整学习率的策略,可以在训练的不同阶段对模型进行不同程度的调整,既保证了快速收敛,又避免了过拟合,最终获得满意的训练效果。记得在实际操作中,根据模型的反应和训练结果灵活调整学习率,以达到最佳的训练效果。
其他参数
Batch Size和梯度累计步数
-
Batch Size:影响训练速度和显存使用。较大的Batch Size可以加快训练速度,但也可能导致显存不足的问题。
-
梯度累计步数:如果提高了Batch Size,相应地也需要调整梯度累计步数,以保持训练的稳定性和效率。
它们两个的关系比较复杂,如果不是非常追求训练速度的话,建议维持默认就好。
数据集目录和日志目录
-
数据集目录:指向你的训练数据集所在的路径。正确设置这一路径确保模型能够访问到所有训练用的图片。
-
日志目录:用于存放训练过程中生成的日志文件。可以使用默认设置,这样训练日志就会被保存在WebUI的根目录下的特定文件夹中。
提示词模板的选择和定制
可以从WebUI自带的模板中选择,或者使用自定义模板。WebUI本身自带了一些模板,对于训练人像的话,可以选择名称为"subject_filewords"的模板。
自带的模板存放在WebUI根目录的'textual_inversion_templates'文件夹。其中,'subject_filewords.txt'模板的内容是这样的。
我觉得很多内容是多余的,可能会影响训练的效果。于是把这个模板复制了一份,然后重命名一下。 删掉大部分内容,最后只保留"[name], [filewords]"。这里的"name"代表了embedding的名称,也就是"ajaj"。"filewords"代表了图像的标注。
假如说,我们在某一阶段的训练图是下面这张。它对应的标注是"looking at camera",看着镜头。
那么,根据模板,提示词就变成了"ajaj, looking at camera"。
于是,Diffusion 模型就根据这个提示词开始了训练。这个就是提示词模板的效果。
下面的宽度和高度不用改。
最大迭代步数
-
含义:代表训练过程中模型迭代的最大次数。每一次迭代,模型都会尝试减少生成图像与目标图像之间的差异。
-
设置建议:虽然默认值可能高达10万,但实际上设置为3000步往往就足以获得良好的训练结果。设置过高的迭代步数可能会导致模型过度拟合,例如使特定特征过于夸张。不过,设置的过高也不用担心。因为可以随时终止训练,之前的embedding都会被保存下来。最后选一个效果比较好的embedding就好了。
图像与Embedding的保存设置
-
每N步保存图像:此参数允许模型每隔N步将生成的图像保存至日志目录,有助于监控训练进度和效果。如果你在训练的过程中,想要频繁的看这个图的效果,可以设置的小一些。
-
每N步保存Embedding:与图像保存类似,此设置允许定期保存训练过程中的embedding状态,便于后续分析和选择最优模型。如果你追求最佳效果,可以把数值设置的小一些,这样可以多生成一些embedding的版本,从中选择一个最佳的。
训练速度优化选项
- 使用PNG alpha通道作为损失权重:此选项可以加快训练速度,但可能需要对数据集进行额外的处理,并调整其他相关参数,因此一般不推荐勾选。
额外功能
-
保存Embedding在PNG图像信息内:启用此功能将在训练过程中生成包含embedding信息的预览图,有助于追踪和管理训练状态。
-
按逗号随机打乱标签:此选项通过随机打乱提示词中的标签顺序,有助于平衡各个词汇对生成图像的影响,提升模型质量。
采样器选择
- 随机采样 vs 确定性采样:虽然官方推荐使用随机采样,社区中有提议使用确定性采样("deterministic"),这可能会对模型训练的稳定性和重现性有所帮助。
开始训练
一旦所有参数都设置好,点击"训练embedding"按钮即可开始训练过程。训练可以在任何时候暂停并重新开始,而且这种中断不会影响到训练的质量,因为训练的状态会被定期保存。这样的设计确保了训练的灵活性和可控性,允许研究者在训练过程中进行必要的调整以获得最佳结果。
开始训练以后,向上滚动。通过右边的预览区域,我们可以监测训练过程和进度。
刚开始可能跟Angelina不太像。到后面会越来越像。预览图看上去效果可能不太好,有时候还会出现崩坏的手和脚。这是因为它是用底模生成的,而且提示词里面没有提升质量的词,比如"best quality"等等。也没有负面提示词来减弱诸如手脚崩坏的问题。等我们用训练好的embedding和其他模型,比如realistic vision生成Angelina的图片,效果就会好很多。 当我们暂停训练或者训练已完成,就可以检查生成的embedding的效果了。Stable Diffusion 会在'text_inversion'文件夹内按照日期放置训练产生的数据。
日期文件夹里会按embedding的名称来组织文件。训练好的embedding会放在这个'embeddings'文件夹里面。 我之前设置了每N步生成一个embedding,所以这里可以看到已经生成了很多个embedding。这些embedding的名称里的数字就代表步数。我这里用的是服务器,形式上跟本地电脑不太一样,但文件夹的结构是一样的。
这么多embedding,我们如何得知哪个效果最好呢?可以把测试的embedding拷贝到WebUI根目录下的embeddings文件夹。接着,就可以在WebUI中生成这些embedding的对比图来对比它们的实际效果了。
其实,之前我已经展示了几张对比图,都是用我将要介绍的方法生成的。
如何评估和选择最佳的Embedding
在Text Inversion的训练过程中,可能会生成多个不同步数的embeddings。为了确定哪个embedding的效果最佳,我们可以通过在WebUI中生成和比较这些embeddings的对比图来进行评估。下面是如何执行这个评估过程的详细指南。
准备Embeddings
-
将要测试的embeddings拷贝到WebUI根目录下的
embeddings
文件夹中。 -
在WebUI中,选择一个合适的底模进行测试。你可以选择Realistic Vision或1.5的底模,这取决于你的训练配置和目标。
设置提示词进行测试
-
在提示词输入框中,输入要开始测试的embedding名称,例如"ajaj-500"。
-
其他提示词可根据需要添加,但负面提示词通常可以留空。
-
保持下面的设置为默认,这些通常不需要调整。
生成对比图表
-
滚动到"脚本"部分,从下拉列表中选择"XYZ图表"脚本。
-
对于X轴(横轴),选择"提示词搜索/替换",并在"X轴值"处输入不同步数下的embedding名称,例如"ajaj-500,ajaj-1000,ajaj-1500"等,用以测试不同步数的embedding效果。
-
对于Y轴(纵轴),也选择"提示词搜索/替换",并输入不同的发型描述词汇,如波浪卷发,直发等,用逗号分隔。
-
确保所有输入的值末尾没有逗号,以避免错误。
评估和选择
-
生成的图表将展示不同步数的embedding与不同发型提示词组合的效果,使你能够直观地比较它们生成的Angelina的不同发型效果。
-
通过对比这些图表,你可以评估哪个步数的embedding最接近你的期望效果。
实用提示
-
测试过程可能需要一些时间,需要耐心等待图表的生成。
-
除了发型,还可以测试其他维度,如不同的表情、场景等,以全面评估embedding的效果。
-
Text Inversion虽然是一种较为简单的训练方法,但通过细致的评估和选择,仍然可以获得满意的结果。
通过上述步骤,你可以有效地评估不同训练步数下的embeddings,从而选择出最佳的embedding进行进一步的应用。这种方法提供了一种直观的方式来比较不同embeddings的效果,帮助你做出更加明智的选择。