stable diffusion(二)——Textual Inversion原理与实践


这个系列会分享下stable diffusion中比较常用的几种训练方式,分别是Dreambooth、textual inversion、LORA和Hypernetworks。在https://civitai.com/选择模型时也能看到它们的身影。本文该系列的第二篇

Textual Inversion

论文地址:https://arxiv.org/abs/2208.01618

代码地址:https://github.com/rinongal/textual_inversion

embedding是textual inversion的结果,因此textual inversion也可以称为embedding。该方法只需要3-5张图像,通过定义新的关键词,就能生成和训练图像相似的风格。

扩散模型中有很多可以定义模型的方法,例如像LoRA,Dreambooth,Hypernetworks。但textual inversion方法很不一样的地方在于它不用改变模型
接下来看看这种方法是怎么做的。

How does textual inversion work?

首先需要定义一个在现有模型中没有的关键词,新的关键词会和其他的关键词一样,生成Tokenizer(用不同的数字表示);然后将其转换为embedding;text transformer会映射出对于新给的关键词最好的embedding向量。不用改变模型,可以看作在模型中寻找新的表征来表示新的关键字

textual inversion可以用来训练新的object,下面的示例是在模型中注入玩具猫的例子

textual inversion也可以用来训练画风,下面的示例是学习模版图的画风,迁移到其他图片中

训练

人物/目标

该部分和之前介绍的Dreambooth中一样,不再赘述。
选用的依然是Halley的图片
在webui上点击”Train”->”Create embedding”

“Name”处为需要学习的目标设置一个新的名字;”Initialization text”无需更改;”Number of vectors per token”表示新建立的”Name”占几个prompt,理论上越大越好,但stable diffusion只支持75个prompt, 会导致可以设置的其他prompt变小,一般设置2-8即可。接着点击创建,则会生成模型文件

接下来是训练的设置,下图箭头处的几个地方需要根据自己的实际情况设置下:

“Prompt template”需要注意下, 提供了几种可选的训练模式:

  • style_filewords.txt: 表示训练画风
  • subject_filewords.txt: 表示训练人物或物体

由于我在这里训练的是Halley的图片,所以选择了object_filewords.txt。
“Max Steps”代表迭代次数,要设置合适的次数,少了会欠拟合,多了会过拟合。一般来说”画风”需要的迭代次数比”人物”要少。是否过拟合/欠拟合,可以通过生成的日志观察。

设置完成后就可以”Train Embedding”了
下面的图片是训练过程中可视化生成的一些图片(有点像tensorboard的功能,webui的交互做的还是挺好的)

训练完成后,可以在txt2img的界面,查看和添加自己训练好的prompt

接下来验证下训练好的模型的效果
先来看看原始模型的输出:

prompt: blue_sky, cloud, building, dog, fence, no_humans, outdoors, road, scenery, shiba_inu, sky, tree

将prompt中的dog替换为训练的关键词Halley即可

prompt: blue_sky, cloud, building, Halley, fence, no_humans, outdoors, road, scenery, shiba_inu, sky, tree

风格

风格的训练和人物的方式基本一样,可以找些比较有特点的画风数据。
周末逛一家拼图店看到了一些很有趣的画风,在网上爬了些数据,首先还是将数据缩放成512*512

后续的步骤: 图像预处理(Use deepbooru for caption, 生成一些图片的关键词)->训练配置开始训练

下面图片是训练过程中产生的一些图片,感觉画风的迭代次数可以少一点,相比人物更容易过拟合些。新建的prompt: style_zhu

prompt可以自己随便设计些,主要用于检验模型是否能学习到画风, 例如我想生成一些有书、时钟、植物的图片

先来看看不添加训练画风的prompt生成的图片, 看起来是比较符合日常生活中这几样常见物品的组合

prompt: beamed_eighth_notes, book, clock, eighth_note, musical_note,plant,potted_plant

添加训练的prompt, 效果还是非常惊艳的

prompt: beamed_eighth_notes, book, clock, eighth_note, musical_note,plant,potted_plant, style_zhu

解析来我想画一张有画、草地,游乐园的照片,不添加训练画风prompt生成的图片

prompt: flower, grass, outdoors, playground
接下来是添加画风生成的图片

prompt: flower, grass, outdoors, playground, style_zhu

站在一个绘画小白的角度,我觉得每一张图片甚至都可以当作可以接近成品的画, 这里贴一下生成的一批图的缩略图

总结

Halley的训练和生成结果来看,textual inversion效果比不上Dreambooth, 主观感受Dreambooth的生成结果感觉和实际的Halley相似度差不多80%以上,textual inversion的感觉是有点像,但一眼能看出是两只不同的狗。
textual的特点是不改变模型,在原有模型的基础上学习一个新的映射关系,虽然效果比不上Dreambooth,但优势是训练更快速些,而且生成的模型非常小。例如我训练生成的textual inversion文件只有4kb, 而Dreambooth有4GB。 在如此小的模型文件下,textual inversion生成的画风效果还是非常不错的。

-------------本文结束感谢您的阅读-------------