
大家在使用Huggingface的Diffusers时,会看到提供了一些Fine-Tune的方法,比如Textual Inversion、LORA、DreamBooth等等,它们均是为了实现"personalization" of text-to-image diffusion models这一任务。简单来说,就是实现了一种个性化文生图模型,给定某个物体的几张图片作为输入,通过微调预训练的文生图模型(如Imagen),将一个独特的标识符和该物体进行绑定,这样就可以通过含有该标识符的prompt在不同场景下生成包含该物体的新颖图片。如下图所示,输入图片中包含一个闹钟,我们希望在不同场景下生成的图片里闹钟的样子尽可能与输入图片保持一致。

现有基于扩散模型的文生图模型已经可以根据给定的prompt生成高质量的图片。但是这些模型并不能模仿给定参考图片中物体的样子在不同场景中来生成新的图片。

DreamBooth 并不是一个独立的图像生成模型,它是一种微调技术,通过对现有的预训练好的图像生成模型进行微调, 进而实现能通过文本 Prompt 控制生成同一个主体的不同场景的图像。与 ControlNet 不同的是, DreamBooth 要简单很多,它并没有修改 Unet 的网络结构,也没有增加额外的网络。 DreamBooth 仅仅是在文本 Prompt 动了手脚,不需要对扩散模型做任何改动。
解决的方法是,首先在文本模型的在词汇表(vocabulary)中寻找出罕见的 tokens , 把这些稀有 tokens 作为候选集合,从这些稀有的 tokens 中选出k = {1,... ,3}个出来组成文本作为主体的唯一描述符。论文中介绍,对于 Imagen ,使用 T5-XXL 的 tokenizer 生成的编号为{5000,... ,10000}范围内的 tokens 作为候选集, 从中随机抽取3个罕见 tokens 或者更少一点的 Unicode字符(不含空格),效果很不错。

根据论文作者的经验,通过对模型的所有层进行微调, 可以获得最大的主体保真度的最佳结果。这包括对文本编码器进行微调,但是这就产生了 语言漂移 的问题。语言漂移是语言模型中观察到的一个问题, 即一个在大型文本语料库中预训练的模型,后来为一个特定的任务进行了微调, 逐渐失去了语言的句法和语义知识。这会影响扩散模型,模型慢慢地忘记了如何生成与目标主体 相同类别 的主体。
另一个问题是可能会减少图像生成的多样性。 文本到图像的扩散模型自然拥有大量的输出多样性, 在对一小部分图像进行微调时,我们希望能够以新的视角、姿势和衔接方式生成主体。 然而,有一种风险是主体的姿势和视角可能会变得单一。 这种情况经常发生,特别是当模型训练时间过长时。
论文提出的方法是想用少量图片(如3到5张)去微调文生图模型,微调过程中这些图片中都包含有相同的物体,且图片对应的prompt基本相同,都为a[identifier] [class noun]的形式,如果只用普通的微调方式,会出现两个问题:
(1)过拟合
(2)语言漂移:在大量文本语料上预训练的语言模型,在特定任务上微调时,它会逐渐忘记通用的语言知识,而仅仅适配特定的任务
作者因此用了一个简单的方法来解决这个问题,也就是上图中提到的Class-Specific Prior Preservation Loss,对原有Diffusion模型的Loss Function进行了修改,保证模型能够在保证类别先验的前提下,学到我们新提供的subject知识。具体的Loss Function如下:

我们可以发现,这个Loss分为两个部分:第一部分就是用新提供的subject images训练的Reconstruction Loss,与一般的Diffusion模型损失形式一样,对Diffusion的所有层进行微调;第二部分就是新引入的Class-Specific Prior Preservation Loss,用一个现有的Diffusion生成图像来监督模型,λ控制该项的相对权重。第一部分让模型学习特定物品的表示,后半通过生成图片的监督防止模型忘记先验知识,其中
代表扩散模型,即输入图片 ,通过扩散模型加噪去噪后生成的图片尽量要和原始输入图片
尽量保持一致,后半部分对模型生成的训练数据也一样。
以下是总结的具体使用DreamBooth的方法:
准备3~5张,特定的主题的照片,并设定好图片的描述文本:”一个[标识符][类名词]”,作为微调训练样本 A.
用预训练的扩散模型以 “一个[类名词]” 作为提示语生成一批相同类别的图片样本,作为微调训练样本 B.
合并练样本 A 和 B,对扩散模型进行微调训练。

在论文中,研究人员也提出了DreamBooth目前存在的缺陷:
第一个是无法准确生成提示的上下文。可能的原因是这些上下文的先验较弱,或者由于训练集中共现概率较低,难以同时生成主题和指定概念。
第二个是上下文外观纠缠,由于提示的上下文,主题的外观会发生变化,如上图所示,背包的颜色变化。
第三,我们还观察到对提示与看到主题的原始设置相似的真实图像的过度拟合。比如上图森林里一个包的图片,生成的基本和原先投入训练的没有任何区别。
其他限制是某些主题比其他主题更容易学习(例如狗和猫)。有时,对于更罕见的主题,模型无法支持尽可能多的主题变化。最后,根据模型先验的强度和语义修改的复杂性,主题保真度和一些生成的图像也可能包含幻觉的主题特征。
DreamBooth 方法可以为同一个主体生成不同的图像,这是非常常见的场景,所以 DreamBooth 技术其实非常有价值。而且它和 ControlNet 并不冲突,可以和 ControlNet 一同使用,生成更加随心所欲的图片。 DreamBooth 的训练方法并不复杂,简单实用。huggingface 提供了详细的训练教程和例子,地址在: https://huggingface.co/docs/diffusers/training/dreambooth
之后应该会更新一篇具体如何使用DreamBooth的教程~
参考文献:
Nataniel Ruiz, Yuanzhen Li, Varun Jampani, Yael Pritch, Michael Rubinstein, and Kfir Aberman. Dreambooth: fine tuning text-to-image diffusion models for subject-driven generation. 2023. arXiv:2208.12242.
https://zzh-blog.readthedocs.io/zh-cn/latest/aigc/dreamBooth.html
https://zhuanlan.zhihu.com/p/659774932#/
code/s?__biz=MzkzOTY0NDU1Mw==&mid=2247483728&idx=1&sn=78157e112ff16f79bd915d8a208c308c&chksm=c2ec82b6f59b0ba03c479ac77ff9143dd86ae8cd22e1627c976e8981a5188922123a20f95efb#rd