InstructPix2Pix: Learning to Follow Image Editing Instructions
TL; DR:核心是使用 GPT3 + SD + P2P 来机造指令编辑训练数据。
数据
本文要做的事情是教会模型根据指令来进行图像编辑。样例如下图所示,给定一张向日葵的图片和指令 “将向日葵换为玫瑰”,编辑结果是将图中的向日葵换为了玫瑰,并保持图像整体布局构图不变。
如何做到这种指令编辑呢?首先要构建对应的监督数据,即 <原图,编辑指令,目标图> 的三元组。数据的构建也是本文的关键。作者选用了机造数据的方式,使用微调的 GPT-3,根据原始图像描述,生成编辑指令和编辑之后的图像描述。然后使用 Stable Diffusion + Prompt2Prompt 来使用编辑前后的两个图像描述生成两张图像。以下将具体介绍这两步:GPT3 机造编辑前后的文本描述、SD+P2P 根据两个文本描述生成编辑前后的图像。
GPT3 机造编辑前后的文本描述
作者选择了大规模、高质量的 LAION-Aesthetic 图文对数据集,取其图像文本描述。注意,本文完全没有用到现成的图片。首先,作者根据图像的文本描述手写了 700+ 条编辑指令,以及编辑之后的图像描述。然后拿着 700+ 条数据对 GPT3 进行微调,使其具备根据输入文本描述自行设计编辑指令,并生成对应的编辑后文本描述的能力。然后,使用这个微调后的 GPT3,输入文本描述,机造了 450000+ 条数据。这个过程中的数据如下图所示,其中绿色底色的部分是由 GPT3 生成的。
SD+P2P 根据两个文本描述生成编辑前后的图像
第二步,我们要根据第一步 GPT3 生成的编辑前后的文本描述,生成训练数据图像。众所周知,即使文本描述由细微的变化,图像生成模型的生图结果也很可能完全不同(即使固定 seed),这样的样本不是我们想要的。我们想要的是两张编辑前后图片整体布局构图大致相同,只是根据指令进行了细微的编辑。因此,这一步的关键是,如何保持编辑前后两张图片的布局结构大致相同。
幸运的是,最近刚好有 Google 的工作 Prompt2Prompt 做到了这一点。Promp2Prompt 通过在第二次生成时(在某些时间步)复用第一次生图的注意力图,从而使得第二次生成的布局结构与第一次生图相同,两次生图的 prompt 可以有词替换、词增加等不同的变动。
下图展示了使用或不适用 Promp2Prompt 生成的编辑前后的结果,可以看到,加了 Prompt2Prompt 之后,只有想要编辑的元素(horse -> dragon)发生了变化,图像其余部分以及整体布局结构都基本保持不变,这才是图像编辑想要的效果。
模型
有了<原图,编辑指令,目标图> 的三元组数据之后,整个任务就是一个监督学习。模型方面我们不需要做太大的变动,只是 InstructPix2Pix 是需要输入图片和文本两个条件,只需在 SD 文生图模型的基础上适配图片条件输入即可。
具体来说,作者在 UNet 的第一个卷积层添加了一个通道(零初始化),接收原图与起始噪声的拼接结果作为输入。
另外,有了两个条件,CFG 的训练设置也有所调整,两个条件都有一定概率被置空。
总结
InstructPix2Pix 是扩散模型指令编辑方向比较经典的工作。核心还是在监督数据的构建,灵活地运用了大语言模型强大的泛化能力和 Prompt2Prompt 保持两次生图布局构图一直的能力。