UniDiffuser
UniDiffuser 模型由 Fan Bao、Shen Nie、Kaiwen Xue、Chongxuan Li、Shi Pu、Yaole Wang、Gang Yue、Yue Cao、Hang Su 和 Jun Zhu 在 One Transformer Fits All Distributions in Multi-Modal Diffusion at Scale 中提出。
论文摘要如下:
本文提出了一种统一的扩散框架(称为 UniDiffuser),在一个模型中拟合与一组多模态数据相关的所有分布。我们的关键见解是——学习边缘、条件和联合分布的扩散模型可以统一为预测扰动数据中的噪声,其中不同模态的扰动水平(即时间步长)可以不同。受统一视角的启发,UniDiffuser 通过对原始扩散模型进行最小修改来同时学习所有分布——扰动所有模态的数据而不是单个模态,输入不同模态的单独时间步长,并预测所有模态的噪声而不是单个模态。UniDiffuser 由一个用于扩散模型的 Transformer 参数化,以处理不同模态的输入类型。在大型配对图像-文本数据上实现,UniDiffuser 能够通过设置适当的时间步长执行图像、文本、文本到图像、图像到文本和图像-文本对生成,而无需额外开销。特别是,UniDiffuser 能够在所有任务中生成感知上逼真的样本,其定量结果(例如,FID 和 CLIP 分数)不仅优于现有的通用模型,而且在代表性任务(例如,文本到图像生成)中与定制模型(例如,Stable Diffusion 和 DALL-E 2)相当。
您可以在 thu-ml/unidiffuser 找到原始代码库,并在 thu-ml 找到其他检查点。
目前在 PyTorch 1.X 上存在一个问题,即输出图像全部为黑色或像素值变为 NaNs
。可以通过切换到 PyTorch 2.X 来缓解此问题。
此管道由 dg845 贡献。 ❤️
使用示例
由于 UniDiffuser 模型经过训练以对 (图像,文本) 对的联合分布进行建模,因此它能够执行各种生成任务。
无条件图像和文本生成
来自 UniDiffuserPipeline 的无条件生成(我们从标准高斯先验中采样的仅潜变量开始)将生成一个 (图像,文本) 对。
import torch
from diffusers import UniDiffuserPipeline
device = "cuda"
model_id_or_path = "thu-ml/unidiffuser-v1"
pipe = UniDiffuserPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16)
pipe.to(device)
# Unconditional image and text generation. The generation task is automatically inferred.
sample = pipe(num_inference_steps=20, guidance_scale=8.0)
image = sample.images[0]
text = sample.text[0]
image.save("unidiffuser_joint_sample_image.png")
print(text)
这在 UniDiffuser 论文中也称为“联合”生成,因为我们是从图像-文本联合分布中采样。
请注意,生成任务是从调用管道时使用的输入推断出来的。也可以使用 UniDiffuserPipeline.set_joint_mode() 手动指定无条件生成任务 (“模式”)。
# Equivalent to the above.
pipe.set_joint_mode()
sample = pipe(num_inference_steps=20, guidance_scale=8.0)
当手动设置模式时,管道后续的调用将使用设置的模式,而不会尝试推断模式。您可以使用 UniDiffuserPipeline.reset_mode() 重置模式,之后管道将再次推断模式。
您还可以仅生成图像或仅生成文本(UniDiffuser 论文将其称为“边缘”生成,因为我们分别从图像和文本的边缘分布中采样)。
# Unlike other generation tasks, image-only and text-only generation don't use classifier-free guidance
# Image-only generation
pipe.set_image_mode()
sample_image = pipe(num_inference_steps=20).images[0]
# Text-only generation
pipe.set_text_mode()
sample_text = pipe(num_inference_steps=20).text[0]
文本到图像生成
UniDiffuser 也能够从条件分布中采样;也就是说,以文本提示为条件的图像分布或以图像为条件的文本分布。以下是以从条件图像分布(文本到图像生成或文本条件图像生成)中采样的示例。
import torch
from diffusers import UniDiffuserPipeline
device = "cuda"
model_id_or_path = "thu-ml/unidiffuser-v1"
pipe = UniDiffuserPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16)
pipe.to(device)
# Text-to-image generation
prompt = "an elephant under the sea"
sample = pipe(prompt=prompt, num_inference_steps=20, guidance_scale=8.0)
t2i_image = sample.images[0]
t2i_image
text2img
模式要求提供输入 prompt
或 prompt_embeds
。您可以使用 UniDiffuserPipeline.set_text_to_image_mode() 手动设置 text2img
模式。
图像到文本生成
类似地,UniDiffuser 还可以根据给定的图像生成文本样本(图像到文本或图像条件文本生成)。
import torch
from diffusers import UniDiffuserPipeline
from diffusers.utils import load_image
device = "cuda"
model_id_or_path = "thu-ml/unidiffuser-v1"
pipe = UniDiffuserPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16)
pipe.to(device)
# Image-to-text generation
image_url = "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/unidiffuser/unidiffuser_example_image.jpg"
init_image = load_image(image_url).resize((512, 512))
sample = pipe(image=init_image, num_inference_steps=20, guidance_scale=8.0)
i2t_text = sample.text[0]
print(i2t_text)
img2text
模式要求提供输入 image
。您可以使用 UniDiffuserPipeline.set_image_to_text_mode() 手动设置 img2text
模式。
图像变化
UniDiffuser 作者建议通过“往返”生成方法执行图像变化,其中给定一个输入图像,我们首先执行图像到文本生成,然后对第一个生成的输出执行文本到图像生成。这会生成一个在语义上与输入图像相似的新的图像。
import torch
from diffusers import UniDiffuserPipeline
from diffusers.utils import load_image
device = "cuda"
model_id_or_path = "thu-ml/unidiffuser-v1"
pipe = UniDiffuserPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16)
pipe.to(device)
# Image variation can be performed with an image-to-text generation followed by a text-to-image generation:
# 1. Image-to-text generation
image_url = "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/unidiffuser/unidiffuser_example_image.jpg"
init_image = load_image(image_url).resize((512, 512))
sample = pipe(image=init_image, num_inference_steps=20, guidance_scale=8.0)
i2t_text = sample.text[0]
print(i2t_text)
# 2. Text-to-image generation
sample = pipe(prompt=i2t_text, num_inference_steps=20, guidance_scale=8.0)
final_image = sample.images[0]
final_image.save("unidiffuser_image_variation_sample.png")
文本变化
类似地,可以使用文本到图像生成后跟图像到文本生成对输入提示执行文本变化。
import torch
from diffusers import UniDiffuserPipeline
device = "cuda"
model_id_or_path = "thu-ml/unidiffuser-v1"
pipe = UniDiffuserPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16)
pipe.to(device)
# Text variation can be performed with a text-to-image generation followed by a image-to-text generation:
# 1. Text-to-image generation
prompt = "an elephant under the sea"
sample = pipe(prompt=prompt, num_inference_steps=20, guidance_scale=8.0)
t2i_image = sample.images[0]
t2i_image.save("unidiffuser_text2img_sample_image.png")
# 2. Image-to-text generation
sample = pipe(image=t2i_image, num_inference_steps=20, guidance_scale=8.0)
final_prompt = sample.text[0]
print(final_prompt)
UniDiffuserPipeline
class diffusers.UniDiffuserPipeline
< source >( vae: AutoencoderKL text_encoder: CLIPTextModel image_encoder: CLIPVisionModelWithProjection clip_image_processor: CLIPImageProcessor clip_tokenizer: CLIPTokenizer text_decoder: UniDiffuserTextDecoder text_tokenizer: GPT2Tokenizer unet: UniDiffuserModel scheduler: KarrasDiffusionSchedulers )
参数
- vae (AutoencoderKL) — 变分自动编码器 (VAE) 模型,用于将图像编码和解码为潜在表示,并从潜在表示解码为图像。这是 UniDiffuser 图像表示的一部分,以及 CLIP 视觉编码。
- text_encoder (
CLIPTextModel
) — 冻结的文本编码器 (clip-vit-large-patch14)。 - image_encoder (
CLIPVisionModel
) — 一个 CLIPVisionModel,用于将图像编码为其图像表示的一部分,以及 VAE 潜在表示。 - image_processor (
CLIPImageProcessor
) — CLIPImageProcessor,在使用image_encoder
进行 CLIP 编码之前预处理图像。 - clip_tokenizer (
CLIPTokenizer
) — 一个 CLIPTokenizer,用于在使用text_encoder
编码之前对提示进行标记化。 - text_decoder (
UniDiffuserTextDecoder
) — 冻结的文本解码器。这是一个 GPT 风格的模型,用于根据 UniDiffuser 嵌入生成文本。 - text_tokenizer (
GPT2Tokenizer
) — 一个 GPT2Tokenizer,用于解码文本生成文本;与text_decoder
一起使用。 - unet (
UniDiffuserModel
) — 一个带有 UNNet 风格跳跃连接的 U-ViT 模型,用于对编码的图像潜在变量进行去噪。 - scheduler (SchedulerMixin) — 与
unet
结合使用以对编码的图像和/或文本潜在变量进行去噪的调度器。原始的 UniDiffuser 论文使用了 DPMSolverMultistepScheduler 调度器。
用于双模态图像-文本模型的管道,支持无条件文本和图像生成、文本条件图像生成、图像条件文本生成以及联合图像-文本生成。
此模型继承自 DiffusionPipeline。查看超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
__call__
< 源代码 >( prompt: Union = None image: Union = None height: Optional = None width: Optional = None data_type: Optional = 1 num_inference_steps: int = 50 guidance_scale: float = 8.0 negative_prompt: Union = None num_images_per_prompt: Optional = 1 num_prompts_per_image: Optional = 1 eta: float = 0.0 generator: Union = None latents: Optional = None prompt_latents: Optional = None vae_latents: Optional = None clip_latents: Optional = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None output_type: Optional = 'pil' return_dict: bool = True callback: Optional = None callback_steps: int = 1 ) → ImageTextPipelineOutput 或 tuple
参数
- prompt (
str
或List[str]
, 可选) — 指导图像生成的提示或提示列表。如果未定义,则需要传递prompt_embeds
。文本条件图像生成 (text2img
) 模式所需。 - image (
torch.Tensor
或PIL.Image.Image
, 可选) — 表示图像批次的Image
或张量。图像条件文本生成 (img2text
) 模式所需。 - height (
int
, 可选,默认为self.unet.config.sample_size * self.vae_scale_factor
) — 生成的图像的高度(以像素为单位)。 - width (
int
, 可选,默认为self.unet.config.sample_size * self.vae_scale_factor
) — 生成的图像的宽度(以像素为单位)。 - data_type (
int
, 可选,默认为 1) — 数据类型(0 或 1)。仅当您加载支持数据类型嵌入的检查点时使用;这是为了与 UniDiffuser-v1 检查点兼容而添加的。 - num_inference_steps (
int
, 可选,默认为 50) — 降噪步骤的数量。更多的降噪步骤通常会导致更高的图像质量,但推理速度会变慢。 - guidance_scale (
float
, 可选,默认为 8.0) — 更高的引导尺度值鼓励模型生成与文本prompt
密切相关的图像,但会以降低图像质量为代价。当guidance_scale > 1
时启用引导尺度。 - negative_prompt (
str
或List[str]
, 可选) — 用于指导图像生成中不包含什么的提示或提示列表。如果未定义,则需要改为传递negative_prompt_embeds
。在不使用引导(guidance_scale < 1
)时忽略。用于文本条件图像生成(text2img
)模式。 - num_images_per_prompt (
int
, 可选,默认为 1) — 每个提示生成图像的数量。用于text2img
(文本条件图像生成)和img
模式。如果模式为联合模式,并且同时提供了num_images_per_prompt
和num_prompts_per_image
,则生成min(num_images_per_prompt, num_prompts_per_image)
个样本。 - num_prompts_per_image (
int
, 可选,默认为 1) — 每个图像生成的提示数量。用于img2text
(图像条件文本生成)和text
模式。如果模式为联合模式,并且同时提供了num_images_per_prompt
和num_prompts_per_image
,则生成min(num_images_per_prompt, num_prompts_per_image)
个样本。 - eta (
float
, 可选,默认为 0.0) — 对应于来自 DDIM 论文的参数 eta (η)。仅适用于 DDIMScheduler,并在其他调度器中被忽略。 - generator (
torch.Generator
或List[torch.Generator]
, 可选) — 用于使生成确定性的torch.Generator
。 - latents (
torch.Tensor
, 可选) — 从高斯分布中采样的预生成噪声潜在变量,用作联合图像文本生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则通过使用提供的随机generator
采样生成潜在变量张量。这假设了一组完整的 VAE、CLIP 和文本潜在变量,如果提供,则覆盖prompt_latents
、vae_latents
和clip_latents
的值。 - prompt_latents (
torch.Tensor
, 可选) — 从高斯分布中采样的预生成噪声潜在变量,用作文本生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则通过使用提供的随机generator
采样生成潜在变量张量。 - vae_latents (
torch.Tensor
, 可选) — 从高斯分布中采样的预生成噪声潜在变量,用作图像生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则通过使用提供的随机generator
采样生成潜在变量张量。 - clip_latents (
torch.Tensor
, 可选) — 从高斯分布中采样的预生成噪声潜在变量,用作图像生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则通过使用提供的随机generator
采样生成潜在变量张量。 - prompt_embeds (
torch.Tensor
, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从prompt
输入参数生成文本嵌入。用于文本条件图像生成(text2img
)模式。 - negative_prompt_embeds (
torch.Tensor
, 可选) — 预生成的负面文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则negative_prompt_embeds
将从negative_prompt
输入参数生成。用于文本条件图像生成(text2img
)模式。 - output_type (
str
, 可选, 默认为"pil"
) — 生成的图像的输出格式。在PIL.Image
或np.array
之间选择。 - return_dict (
bool
, 可选, 默认为True
) — 是否返回 ImageTextPipelineOutput 而不是普通元组。 - callback (
Callable
, 可选) — 在推理过程中每隔callback_steps
步调用一次的函数。该函数使用以下参数调用:callback(step: int, timestep: int, latents: torch.Tensor)
。 - callback_steps (
int
, 可选, 默认为 1) — 调用callback
函数的频率。如果未指定,则在每个步骤都调用回调。
返回
ImageTextPipelineOutput 或 tuple
如果 return_dict
为 True
,则返回 ImageTextPipelineOutput,否则返回一个 tuple
,其中第一个元素是生成的图像列表,第二个元素是生成的文本列表。
管道生成调用函数。
禁用切片 VAE 解码。如果之前启用了 enable_vae_slicing
,则此方法将返回一步计算解码。
禁用平铺 VAE 解码。如果之前启用了 enable_vae_tiling
,则此方法将返回一步计算解码。
启用切片 VAE 解码。启用此选项后,VAE 将输入张量拆分为切片,以便分多个步骤计算解码。这有助于节省一些内存并允许更大的批次大小。
启用平铺 VAE 解码。启用此选项后,VAE 将输入张量拆分为平铺,以便分多个步骤计算解码和编码。这有助于节省大量内存并允许处理更大的图像。
移除手动设置的模式;调用此方法后,管道将根据输入推断模式。
手动将生成模式设置为图像条件文本生成。
手动将生成模式设置为无条件联合图像-文本生成。
手动将生成模式设置为无条件(“边缘”)文本生成。
手动将生成模式设置为文本条件图像生成。
ImageTextPipelineOutput
类 diffusers.ImageTextPipelineOutput
< 源代码 >( images: Union text: Union )
联合图像-文本管道的输出类。