社区计算机视觉课程文档

使用扩散模型生成合成数据

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

使用扩散模型生成合成数据

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

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

扩散模型回顾

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

扩散模型通过学习逐步去除随机高斯噪声来工作。训练过程需要将高斯噪声添加到输入样本中,并让模型学习去噪。

除了数据分布之外,扩散模型通常还会以某种输入为条件,例如文本提示、图像甚至音频。此外,还可以 构建无条件生成器

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

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

noising

然后模型学习去除给定数据分布中的噪声。

denoising

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

文本到图像扩散模型:稳定扩散

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

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

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

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

因此,虽然总体工作流程如下所示: 通用稳定扩散工作流程

最初,我们使用文本编码器根据我们的提示对模型进行条件化: 原始稳定扩散工作流程

这个简短的概述仅仅是冰山一角!如果您希望深入了解稳定扩散(或扩散模型)背后的理论,可以查看 进一步阅读部分

diffusers 为我们提供了可用于不同任务的现成管道,例如

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

您还可以从 Diffusers 摘要 表中找到支持任务的完整列表。

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

合成数据生成的途径

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

扩展现有数据集

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

从头创建数据集:

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

保护隐私:

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

我们可以利用文本到图像扩散模型生成自定义输出,方法有很多。例如,只需使用预训练的扩散模型(例如 Stable Diffusion XL),就可以尝试构建一个好的提示来生成图像。但是,生成的图像质量可能不一致,并且为您的特定用例构建这样的提示可能非常困难。

通常,您需要更改模型的某些部分才能生成所需的个性化输出,以下是一些可用于此目的的技术

使用 文本反转(Textual Inversion) 进行训练

textual-inversion

文本反转是一种通过干预模型架构中的文本嵌入来工作的技术。您可以向词汇表中添加一个新的标记,然后使用少量示例微调嵌入。

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

训练 LoRA(低秩自适应) 模型

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

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

这意味着训练 LoRA 本质上比完整模型微调快得多!需要注意的是,由于 LoRA 可以添加到模型本身之上,因此也可以将其与其他技术结合使用。

使用 DreamBooth 进行训练

dreambooth

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

对于训练,我们使用词汇表中的标记并使用优选的稀有标记标识符构建数据集。因为如果您选择一个相当常见的标识符,模型还必须学习将其与原始含义区分开来。

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

使用 自定义扩散(Custom Diffusion) 进行训练

custom diffusion

自定义扩散是一种非常强大的个性化模型的技术。它只需要像前面提到的方法一样少量样本,但它的强大之处在于能够同时学习多个概念!

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

扩散模型在数据集生成中的实际应用案例

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

请查看以下案例。

关于 Stable Diffusion 的进一步阅读

< > GitHub 更新