Text Inversion

Text Inversion: 比 Lora 更简单地训练人脸【Stable Diffusion 炼丹教程】

Stable Diffusion的最大魅力体现在其DIY的能力上。它不是什么图都能画出来,但是我们可以根据自己的需求,训练它成为我们想要的样子。

其中,Text Inversion 就是一种最简单有效的训练方式。它比 Lora 训练更简单,对数据集的要求比较低,适合入门。 它的训练过程和 Lora 有很多共通的地方,熟练掌握的话对于后期 Lora 训练也是很有帮助的。 和 Lora 一样,它也可以用来训练任何人脸,生成任何人的照片。

其实,早在一年以前,就有很多关于它的教程。然而,那时的 WebUI 跟现在的有所不同,可能会让你感到困惑。而且,之后还出现了一些新的处理数据集的方法。 所以,我觉得有必要写一篇新的文章,让大家从原理层面深入了解 Text Inversion。

在这篇教程中,我会用著名好莱坞女明星 Angelina Jolie 的照片进行训练。有人可能会问,Angelina 是个名人,Stable Diffusion 训练过她的照片。那么我再为她训练 Embedding 有什么意义呢?

如果你喜欢看视频教程,那么我非常欢迎你观看本文所对应的视频(B站同名帐号):

让我来解释一下。 我们都知道,Stable Diffusion 是用网络上公开的6亿张包含描述的图片训练而成的。 这些图片的质量都不太高,而且未必符合我们心目中的 Angelina 的形象。如果我们要生成自己心目中 Angelina 的样子,就可以筛选出我们喜欢的照片,然后用它们来进行训练。这才是训练的真正意义。

看,下面是训练前后的对比图片。左边这列是原版的Angelina。右边是我训练的Angelina。它们的区别还是挺大的吧。

bad dataset result image.jpg
good dataset result image.jpg

接下来,我将一步步引导大家通过实例学习Text Inversion的训练过程,包括数据集的准备、图片的预处理、训练过程以及测试训练结果。

数据集的准备

训练开始前,数据集的准备是至关重要的一步,它直接影响到最终生成图像的质量。遵循以下两个原则以确保数据集的质量:

  1. 图片质量优于数量:选择高质量的图片比大量低质量图片更为重要。
  2. 多样化:尽可能选择角度、表情和背景各异的人脸图片,以便AI能全方位学习人物特征。

推荐至少准备10张以上的面部图像,并可以包含一些上半身或全身照片,以学习人物的体型和姿态。注意,图片中不应包含水印,以避免影响最终结果。

看,这是我用不同质量的数据集生成的效果。左边这列的是用质量比较差的数据集,跟右边的效果还是有差距的吧?

angelina jolie before and after.jpg
angelina jolie before and after 1

图片预处理

图片准备工作完成后,接下来的重要步骤是进行图片的预处理,包括裁剪和打标,以确保所有图片都有统一的分辨率,推荐尺寸为512×512。这一步骤对于提高训练效果和最终图像的质量至关重要。以下是详细的预处理步骤:

1️⃣ 选择合适的工具:由于新版本的WebUI已经移除了“图片预处理”功能,因此需要借助外部工具进行预处理。我在这里推荐一个在线批量处理图片的网站,使用起来非常方便。网址是:

https://www.birme.net/?target_width=512&target_height=512

2️⃣ 上传图片

  • 访问推荐的在线批量处理图片网站。
  • 点击“BROWSE FROM YOUR COMPUTER”按钮打开文件浏览器。
  • 进入包含要处理图片的文件夹,按Ctrl + A选择所有图片,然后点击“打开”。
birme image editor

3️⃣ 自动裁剪和焦点检测

  • 上传后,网站会自动识别每张图片的焦点,通常是面部,确保裁剪区域的准确性。
  • 确认“Auto detect image focal point”(自动检测图像焦点)选项已勾选。
birme image editor 2

4️⃣ 手动调整

  • 预览处理效果,对于自动标注不准确的图片,手动调整裁剪区域。例如,如果某张图片的脸部被不当裁剪,可以通过拖动裁剪框来调整。

5️⃣ 保存和下载

  • 调整完成后,点击“SAVE AS ZIP”按钮,将处理后的图片保存为ZIP文件。
  • 选择一个位置保存压缩文件,完成图片的批量裁剪和预处理。

通过上述步骤,我们可以确保数据集中的每张图片都被正确地裁剪和标注,为接下来的训练过程打下良好的基础。这一环节虽然看似简单,但对于提升最终生成图像的质量起到了决定性作用。

精确打标

为了充分利用Stable Diffusion的能力,精确地为图片打标是一个不可忽视的步骤。这一过程通过添加描述性的提示词来为图片内容进行标注,是使用Text Inversion或Lora训练方法的关键环节。下面,我将详细介绍如何高效地完成这一任务。

打标的重要性

Stable Diffusion的训练依赖于大量带有描述的图片,正是这些描述使得我们能够通过提示词来生成特定的图片。因此,为你的训练图片准确打标,能够显著提高生成图像的质量和相关性。

使用WebUI的Tagger插件打标

​​ 安装Tagger插件:首先,确保你的WebUI中安装了Tagger插件。如果尚未安装,可以去Github上下载(https://github.com/toriato/stable-diffusion-webui-wd14-tagger)。也或者访问我分享的度盘链接(https://pan.baidu.com/s/1jvg7A0j20XiilvJK-NYmoA?pwd=v5d8)。

​​ 批量处理图片:进入WebUI后,切换到Tagger标签页并点击“从目录批量处理”,输入你的图片路径。这一路径依据你运行Stable Diffusion的环境而定,可能是本地或服务器。

tagger 1

​​ 选择模型和调整参数

  • 在“反向推导器”下拉列表中选择一个模型。对于处理人像图片,“ViT v2”模型通常是一个不错的选择。
  • 调整权重阈值(Weight threshold)以控制标注的详细程度。记住,阈值设置得越小,生成的标注就越详细,但同时也可能增加无效标注的数量,从而需要更多时间进行手动修正。
tagger 2

​​ 开始打标:设置好参数后,点击“反向推导”按钮开始打标过程。这一过程完成后,你可以在输出目录中看到每张图片对应的文本文件,里面包含了生成的提示词。

审核和调整标注

完成自动打标后,不要忘记检查并调整这些文本文件中的提示词。尽管自动打标可以节省大量时间,但人工审核和精细调整是不可替代的,特别是当你追求最优的训练效果时。

  • 查看并编辑文本文件:转到数据集的文件夹,你会发现许多与图片同名的文本文件。打开任一文件,检查里面的提示词。
  • 精确调整:根据需要编辑或添加提示词,以确保它们尽可能准确地描述图片内容。更精确的标注意味着更优质的Text Inversion训练结果。
caption files

批量修改标注

在进行Text Inversion训练前,对图片的标注进行精确调整是关键一步,这不仅关乎训练效果的优化,还涉及到训练过程的高效性。以下是如何利用特定工具来批量修改标注的详细指导。

使用Dataset Tag Editor插件

为了高效管理和修改图片标注,我们将利用一个称为Dataset Tag Editor的插件。这个工具可以大幅简化标注的编辑过程。

  1. 安装插件:首先,确保安装了Dataset Tag Editor插件。如果尚未安装,可以去Github上下载(https://github.com/toshiaki1729/stable-diffusion-webui-dataset-tag-editor)。也或者访问我分享的度盘链接(https://pan.baidu.com/s/1L6_RFnU9By5hPmNkSv0hMw?pwd=r3kw)。
  2. 加载图片和标签:在Dataset Tag Editor的标签页内,填写图片和标签文件所在的路径,然后点击“加载”按钮。加载成功后,页面上将显示文件夹内的所有图片及其标签。
dataset tag editor 1

理解标注的重要性

如何处理标注呢?这个过程有一些反直觉。 我们都知道,嘴唇是 Angelia 非常独特的特征。我们要 AI 学习这个特征的话,需要保留“lips”嘴唇这个词吗? 我们的第一反应可能是需要。但实际上是不需要的。

因为我们是无法通过文字准确地描述出Angelia嘴唇的特征的,AI 真正依靠的是图片来学习,而不是文字。这一点跟人类是一样的。我们告诉一个画家Angelina嘴唇的厚度和形状,他就能准确的画出来吗?还是得给参考图片,你说对不对?文字只是用来让人类给 AI 发送指令。 希望我这个解释你能够理解。

批量编辑标注

​​ 选择和删除标签:通过Dataset Tag Editor,你可以轻松查看并选择特定的标签,以便批量删除不需要的标签。例如,“lips”、“breasts”、“nose”等描述可能并不必要,而有关背景的标签如“white background”则可能需要保留。这样AI就不会把白色背景跟Angelina扯上关系。否则最后哪怕提示词里没有白色背景这个词,出来的图也可能是白色背景的。

tagger 3

​​ 执行批量删除:在“批量编辑图片描述”区域,使用“搜索和替换”、“移除”和“高清化”等功能来批量处理标签。选择“移除”选项卡,选择你想要删除的标签,并执行删除操作。

dataset tag editor 2

​​ 单个编辑标注:有些出现频率不高的词,我们还可以一个一个删除。然后点击”批量编辑图片描述“右边的”编辑所选图片的描述“按钮。这里出现了选中图片的描述,可以点击”复制并覆盖“按钮,把提示词复制到下方的文本框里进行编辑。

dataset tag editor 3

比如说我删掉”eyelashes“这个单词,然后点击”应用变更到所选图像“。

tagger 4

就这样通过批量编辑和单个编辑的功能,我们就可以完成对所有图片描述的编辑。最后再点击”保存所有更改“。

tagger 5

准备训练:基础设置指南

在启动Text Inversion训练之前,正确配置Stable Diffusion的WebUI设置是非常关键的一步。这些设置不仅影响训练的效率,还关系到最终训练结果的质量。下面是如何进行这些基础设置的详细指导。

访问WebUI设置

  1. 在WebUI中,点击“设置”标签页。
  2. 向下滚动,找到“训练”的设置选项并点击。
  3. 进入后,根据需要进行一些基本配置。
webui setting 1
webui setting 2

基础设置项

  • 训练时将VAE和CLIP从显存(VRAM)释放到内存(RAM):如果你的设备显存较小,可以勾选第一个选项以优化显存使用。这有助于在显存受限的情况下进行训练,但可能会略微影响训练速度。
  • 启用Dataloader的pin_memory:追求更快的训练速度可以勾选第二个选项,但需注意这会增加内存的使用。
  • 将优化器状态保存为单独的optim文件:勾选第三个选项会在训练文件夹内生成备份文件,使得训练可以在中断后无损恢复,这对长时间的训练尤为重要。
  • 在每次训练开始时将文本倒置和超网络设置保存在文本文件中:第四个选项通常默认勾选,负责自动备份训练过程,可以保持默认。
  • 训练进度保存:“每N步保存一个CSV文件”的选项可以帮助你跟踪训练进度。默认值可能设置为每500步保存一次,根据需要你可以调整为更频繁的保存,比如每50步,这有助于更密切地监控训练过程中的loss变化。

应用设置

设置完成后,别忘了点击“应用设置”,随后点击“重新加载WebUI”以确保所有设置生效。这一步是准备训练的最后环节,确保了训练环境根据你的具体需求进行了优化。

webui setting 3

启动Text Inversion训练

在完成所有基础设置之后,下一步就是实际开始Text Inversion训练。本节将指导你如何进入训练界面,创建embedding,并选择合适的底模进行训练。

webui setting 5

进入训练界面

  1. 在WebUI中,找到并点击“训练”按钮以进入训练界面。
  2. 训练界面是Text Inversion训练的操作中心,在这里你将配置和启动你的训练任务。

创建Embedding

训练的首要步骤是创建一个embedding,这是一个表示你要训练图像特征的向量。正确设置embedding对于训练结果的质量至关重要。

选择合适的底模

底模的选择对训练的成功和最终效果有着重大影响。推荐选择版本为1.5的底模,因为它提供了更好的泛化性,即训练好的模型可以在基于1.5版本的其他模型上表现良好。

base model on hugging face

其他设置

  • 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模型生成我们期望的图像。

训练过程

文本反演
  1. 从噪点到图像:训练开始时,Stable Diffusion将使用的训练图(如Angelina Jolie的照片)转换成一堆像素或噪点。这些噪点通过训练逐步组织成有意义的图像,过程中embedding起到了指导作用。
  2. 图像生成与对比:Diffusion模型会尝试根据当前的embedding去除噪点中的随机性,生成图像的初步版本。然后,模型会将这个版本与原训练图进行对比,评估二者之间的差异。
  3. 损失计算(Loss):通过比较生成图像与训练图之间的差异,模型计算出一个loss值,这个值表示两者之间的差异程度。Loss值越低,意味着生成的图像与训练图越相似。
  4. 迭代优化:根据loss值,Stable Diffusion会不断调整embedding,通过反复的迭代过程,逐步减少生成图像与训练图之间的差异,直到达到一个理想的状态,此时的embedding能够指导模型生成与训练图高度相似的图像。

通过上述讲解,我们可以看到Text Inversion训练实质上是一个不断迭代的过程,旨在优化embedding,以便Diffusion模型能够根据这个优化后的embedding生成与训练图非常接近的图像。这个过程涉及到对训练图的深入理解,以及如何通过不断调整和优化embedding来减少loss值,从而提高生成图像的质量和相似度。

启动Text Inversion训练:深入设置与优化指南

在深入了解Text Inversion的底层逻辑后,是时候将这些理论应用到实践中,启动我们的训练过程了。下面的指南将帮助你进行更精细化的设置,以优化训练效果和效率。

text inversion training setting 1我们点击“训练”,进入训练参数的设置界面。Embedding就选择我们刚才创建好的embedding。如果在下拉列表里找不到的话,可以点击右边的刷新按钮。

“超网络”、“超网络学习率”、“梯度裁剪”都不用设置。这几个都是关于训练”超网络“的。比较重要的是”学习率“。

Text Inversion训练中的学习率策略

在Text Inversion训练过程中,合理设置学习率对于达到最佳训练效果至关重要。学习率决定了AI模型学习的速度,太高或太低都可能影响最终结果。下面详细介绍如何在训练中设置和调整学习率。

学习率的重要性

学习率可以被视为训练过程中的“步伐大小”。一个适当的学习率使得模型能够有效地学习,避免过快学习导致的过拟合或学习不足。

  • 高学习率:在训练初期使用较高的学习率可以快速达到一个较好的起始点,类似于快速雕刻出佛像的轮廓。
  • 低学习率:随着训练的进行,逐渐降低学习率可以帮助模型更细致地调整,精确雕刻出细节,防止过度拟合。
learning rate

学习率策略

一个经验丰富的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’模板的内容是这样的。

subject filewords prompt template

我觉得很多内容是多余的,可能会影响训练的效果。于是把这个模板复制了一份,然后重命名一下。 删掉大部分内容,最后只保留“[name], [filewords]”。这里的“name”代表了embedding的名称,也就是”ajaj”。“filewords”代表了图像的标注。

假如说,我们在某一阶段的训练图是下面这张。它对应的标注是“looking at camera”,看着镜头。

template 2

那么,根据模板,提示词就变成了“ajaj, looking at camera”。

template 3

于是,Diffusion 模型就根据这个提示词开始了训练。这个就是提示词模板的效果。

下面的宽度和高度不用改。

text inversion training setting 2

最大迭代步数

  • 含义:代表训练过程中模型迭代的最大次数。每一次迭代,模型都会尝试减少生成图像与目标图像之间的差异。
  • 设置建议:虽然默认值可能高达10万,但实际上设置为3000步往往就足以获得良好的训练结果。设置过高的迭代步数可能会导致模型过度拟合,例如使特定特征过于夸张。不过,设置的过高也不用担心。因为可以随时终止训练,之前的embedding都会被保存下来。最后选一个效果比较好的embedding就好了。

图像与Embedding的保存设置

  • 每N步保存图像:此参数允许模型每隔N步将生成的图像保存至日志目录,有助于监控训练进度和效果。如果你在训练的过程中,想要频繁的看这个图的效果,可以设置的小一些。
  • 每N步保存Embedding:与图像保存类似,此设置允许定期保存训练过程中的embedding状态,便于后续分析和选择最优模型。如果你追求最佳效果,可以把数值设置的小一些,这样可以多生成一些embedding的版本,从中选择一个最佳的。

训练速度优化选项

  • 使用PNG alpha通道作为损失权重:此选项可以加快训练速度,但可能需要对数据集进行额外的处理,并调整其他相关参数,因此一般不推荐勾选。

额外功能

  • 保存Embedding在PNG图像信息内:启用此功能将在训练过程中生成包含embedding信息的预览图,有助于追踪和管理训练状态。
  • 按逗号随机打乱标签:此选项通过随机打乱提示词中的标签顺序,有助于平衡各个词汇对生成图像的影响,提升模型质量。

采样器选择

  • 随机采样 vs 确定性采样:虽然官方推荐使用随机采样,社区中有提议使用确定性采样(”deterministic”),这可能会对模型训练的稳定性和重现性有所帮助。

开始训练

一旦所有参数都设置好,点击“训练embedding”按钮即可开始训练过程。训练可以在任何时候暂停并重新开始,而且这种中断不会影响到训练的质量,因为训练的状态会被定期保存。这样的设计确保了训练的灵活性和可控性,允许研究者在训练过程中进行必要的调整以获得最佳结果。

开始训练以后,向上滚动。通过右边的预览区域,我们可以监测训练过程和进度。

text inversion training setting 3

刚开始可能跟Angelina不太像。到后面会越来越像。预览图看上去效果可能不太好,有时候还会出现崩坏的手和脚。这是因为它是用底模生成的,而且提示词里面没有提升质量的词,比如“best quality”等等。也没有负面提示词来减弱诸如手脚崩坏的问题。等我们用训练好的embedding和其他模型,比如realistic vision生成Angelina的图片,效果就会好很多。 当我们暂停训练或者训练已完成,就可以检查生成的embedding的效果了。Stable Diffusion 会在’text_inversion’文件夹内按照日期放置训练产生的数据。

日期文件夹里会按embedding的名称来组织文件。训练好的embedding会放在这个’embeddings’文件夹里面。 我之前设置了每N步生成一个embedding,所以这里可以看到已经生成了很多个embedding。这些embedding的名称里的数字就代表步数。我这里用的是服务器,形式上跟本地电脑不太一样,但文件夹的结构是一样的。

embeddings

这么多embedding,我们如何得知哪个效果最好呢?可以把测试的embedding拷贝到WebUI根目录下的embeddings文件夹。接着,就可以在WebUI中生成这些embedding的对比图来对比它们的实际效果了。

其实,之前我已经展示了几张对比图,都是用我将要介绍的方法生成的。

如何评估和选择最佳的Embedding

在Text Inversion的训练过程中,可能会生成多个不同步数的embeddings。为了确定哪个embedding的效果最佳,我们可以通过在WebUI中生成和比较这些embeddings的对比图来进行评估。下面是如何执行这个评估过程的详细指南。

准备Embeddings

  1. 将要测试的embeddings拷贝到WebUI根目录下的embeddings文件夹中。
  2. 在WebUI中,选择一个合适的底模进行测试。你可以选择Realistic Vision或1.5的底模,这取决于你的训练配置和目标。

设置提示词进行测试

  1. 在提示词输入框中,输入要开始测试的embedding名称,例如”ajaj-500″。
  2. 其他提示词可根据需要添加,但负面提示词通常可以留空。
  3. 保持下面的设置为默认,这些通常不需要调整。
webui 1

生成对比图表

  1. 滚动到“脚本”部分,从下拉列表中选择“XYZ图表”脚本。
  2. 对于X轴(横轴),选择“提示词搜索/替换”,并在“X轴值”处输入不同步数下的embedding名称,例如”ajaj-500,ajaj-1000,ajaj-1500″等,用以测试不同步数的embedding效果。
  3. 对于Y轴(纵轴),也选择“提示词搜索/替换”,并输入不同的发型描述词汇,如波浪卷发,直发等,用逗号分隔。
  4. 确保所有输入的值末尾没有逗号,以避免错误。
webui 2

评估和选择

  • 生成的图表将展示不同步数的embedding与不同发型提示词组合的效果,使你能够直观地比较它们生成的Angelina的不同发型效果。
  • 通过对比这些图表,你可以评估哪个步数的embedding最接近你的期望效果。
xyzplot

实用提示

  • 测试过程可能需要一些时间,需要耐心等待图表的生成。
  • 除了发型,还可以测试其他维度,如不同的表情、场景等,以全面评估embedding的效果。
  • Text Inversion虽然是一种较为简单的训练方法,但通过细致的评估和选择,仍然可以获得满意的结果。

通过上述步骤,你可以有效地评估不同训练步数下的embeddings,从而选择出最佳的embedding进行进一步的应用。这种方法提供了一种直观的方式来比较不同embeddings的效果,帮助你做出更加明智的选择。

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注