Community 计算机视觉课程文档

基于扩散模型的合成数据生成

Hugging Face's logo
加入 Hugging Face 社区

并获取增强的文档体验

开始使用

基于扩散模型的合成数据生成

想象一下,尝试训练一个肿瘤分割模型。由于很难收集医学影像数据,模型将很难收敛。理想情况下,我们希望至少有足够的数据来构建一个简单的基线,但是如果你只有几个样本怎么办?合成数据生成方法试图解决这个难题,现在随着生成模型的蓬勃发展,我们有了更多的选择!

正如你在之前的章节中看到的,可以使用生成模型(如 DCGAN)来生成合成图像。在本节中,我们将重点介绍使用 diffusers 的扩散模型!

扩散模型回顾

扩散模型是近年来广受欢迎的生成模型,这归功于它们生成高质量图像的能力。如今,它们被广泛应用于图像、视频和文本合成。

扩散模型的工作原理是学习逐步去噪随机高斯噪声。训练过程需要向输入样本添加高斯噪声,并让模型学习去噪。

扩散模型通常会根据数据分布之外的某种输入进行调节,例如文本提示、图像甚至音频。此外,也可以构建无条件生成器

模型内部工作原理背后有很多基本概念,但简化版本类似于这样:

首先,模型将噪声添加到输入并对其进行处理。

noising

然后,模型学习对给定的数据分布进行去噪。

denoising

我们不会深入探讨理论,但是当我们需要选择一种技术来为我们的用例生成合成数据时,了解扩散模型的工作原理将非常有用。

文本到图像扩散模型:Stable Diffusion

本质上,Stable Diffusion (SD) 的工作方式与我们上面提到的相同。它使用三个主要组件来帮助它生成高质量的图像。

  1. 扩散过程: 输入被多次处理以生成关于图像的有用信息。“有用性”是在训练模型时学习到的。

  2. 图像编码器和解码器模型: 让模型将图像从像素空间压缩到更小的维度空间,抽象出无意义的信息,同时提高性能。

  3. 可选的条件编码器: 此组件用于根据输入调节生成过程。这种额外的输入可以是文本提示、图像、音频和其他表示形式。最初,它是一个文本编码器。

因此,虽然一般工作流程看起来像这样: general stable diffusion workflow

最初我们使用文本编码器根据我们的提示调节模型: original stable diffusion workflow

这个简短的概述只是冰山一角!如果你想深入了解 stable diffusion(或扩散模型)背后的理论,你可以查看延伸阅读部分

diffusers 为我们提供了用于不同任务的即用型 pipelines,例如:

任务 描述 Pipeline
无条件图像生成 从高斯噪声生成图像 unconditional_image_generation
文本引导图像生成 根据文本提示生成图像 conditional_image_generation
文本引导图像到图像的转换 根据文本提示调整图像 img2img
文本引导图像修复 根据图像、蒙版和文本提示填充图像的蒙版部分 inpaint
文本引导深度到图像的转换 根据文本提示调整图像的各个部分,同时通过深度估计保留结构 depth2img

还有一个完整的支持任务列表,你可以从Diffusers Summary 表中找到。

这意味着我们有很多工具可以用来生成合成数据!

合成数据生成方法

通常有三种需要合成数据的情况:

扩展现有数据集

  • 样本数量不足: 一个很好的例子是医学影像数据集,例如 DDSM(用于乳腺X线摄影筛查的数字数据库,约 2500 个样本),少量样本使得构建模型进行进一步分析变得更加困难。构建此类医学影像数据集的成本也很高。

从头开始创建数据集:

  • 根本没有任何样本: 假设你想在闭路电视视频流之上构建一个武器检测系统。但是没有你想检测的特定武器的样本,你可以使用不同设置中的类似观察结果来应用风格迁移,使它们看起来像闭路电视视频流!

保护隐私:

  • 医院收集大量关于患者的数据,监控摄像头捕获关于个人面孔和活动的原始信息,所有这些都可能侵犯隐私。我们可以使用扩散模型生成保护隐私的数据集来开发我们的解决方案,而不会放弃任何人的隐私权。

我们有不同的方法来利用文本到图像扩散模型来生成定制输出。例如,通过简单地利用预训练的扩散模型(例如 Stable Diffusion XL),你可以尝试构建一个好的提示来生成图像。但是,生成的图像质量可能不一致,并且为你特定的用例构建这样的提示可能非常困难。

你通常需要更改模型的某些部分才能生成你想要的个性化输出,以下是一些你可以使用的技术:

使用 Textual Inversion 进行训练

textual-inversion

Textual inversion 是一种通过干扰模型架构中的文本嵌入来工作的技术。你可以向词汇表添加一个新 token,然后使用一些示例微调嵌入。

通过提供与新 token 相对应的样本,我们尝试优化嵌入以捕获对象的特征。

训练 LoRA (Low-Rank Adaptation) 模型

LoRA 针对了微调 LLM 的问题。它通过低秩分解用两个较小的更新矩阵表示权重更新,这大大减少了参数量。然后可以训练这些矩阵以适应新数据!

基础模型的权重在整个过程中保持冻结,因此我们只训练新的更新矩阵。然后最后,将调整后的权重与原始权重结合起来。

这意味着训练 LoRA 本质上比完全模型微调快得多!作为一个重要的提示,也可以将 LoRA 与其他技术结合使用,因为它可以在模型本身之上添加。

使用 DreamBooth 进行训练

dreambooth

DreamBooth 是一种微调模型以个性化输出的技术。给定一些主题图像,它可以让你微调预训练的文本到图像模型。主要思想是将唯一标识符与该特定主题关联起来。

对于训练,我们使用词汇表中的 token,并最好使用稀有 token 标识符构建数据集。因为如果你选择一个相当常见的标识符,模型也必须学会从其原始含义中解脱出来。

在原始论文中,作者在词汇表中找到稀有 token,然后从中选择标识符。这降低了标识符具有强烈先验的风险。还指出,通过微调模型的所有层可以获得最佳结果。

使用 Custom Diffusion 进行训练

custom diffusion

Custom Diffusion 是一种非常强大的个性化模型技术。它只需要像之前提到的方法那样的一些样本,但它的强大之处在于能够同时学习多个概念!

它的工作原理是仅训练扩散过程的一部分和我们上面提到的文本编码器,这意味着需要优化的参数更少。因此,这种方法也实现了快速微调!

使用扩散模型生成数据集的真实世界示例

在许多独特的案例中,扩散模型被用于生成合成数据集!

在下面找到它们。

关于 Stable Diffusion 的延伸阅读

< > 在 GitHub 上更新