Diffusers 文档

图像到图像

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始

图像到图像

图像到图像类似于 文本到图像,但除了提示之外,您还可以传递初始图像作为扩散过程的起点。初始图像被编码到潜在空间,并添加噪声。然后,潜在扩散模型接受提示和噪声潜在图像,预测添加的噪声,并从初始潜在图像中删除预测的噪声以获得新的潜在图像。最后,解码器将新的潜在图像解码回图像。

使用 🤗 Diffusers,这就像 1-2-3 一样简单

  1. 将检查点加载到 AutoPipelineForImage2Image 类中;此管道会根据检查点自动处理加载正确的管道类。
import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "kandinsky-community/kandinsky-2-2-decoder", torch_dtype=torch.float16, use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

您将在整个指南中注意到,我们使用 enable_model_cpu_offload()enable_xformers_memory_efficient_attention() 来节省内存并提高推理速度。如果您使用的是 PyTorch 2.0,那么您无需在管道上调用 enable_xformers_memory_efficient_attention(),因为它已经使用 PyTorch 2.0 的本机 缩放点积注意力

  1. 加载要传递到管道的图像
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
  1. 将提示和图像传递到管道以生成图像
prompt = "cat wizard, gandalf, lord of the rings, detailed, fantasy, cute, adorable, Pixar, Disney, 8k"
image = pipeline(prompt, image=init_image).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
初始图像
生成的图像

热门模型

最受欢迎的图像到图像模型是 Stable Diffusion v1.5Stable Diffusion XL (SDXL)Kandinsky 2.2。Stable Diffusion 和 Kandinsky 模型的结果因其架构差异和训练过程而异;您通常可以预期 SDXL 比 Stable Diffusion v1.5 生成更高质量的图像。让我们快速了解如何使用每个模型并比较其结果。

Stable Diffusion v1.5

Stable Diffusion v1.5 是一个潜在扩散模型,它从早期检查点初始化,并在 512x512 图像上针对 595K 步进行了进一步微调。要将此管道用于图像到图像,您需要准备一个初始图像以传递到管道。然后,您可以将提示和图像传递到管道以生成新图像。

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import make_image_grid, load_image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png"
init_image = load_image(url)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"

# pass prompt and image to pipeline
image = pipeline(prompt, image=init_image).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
初始图像
生成的图像

Stable Diffusion XL (SDXL)

SDXL 是 Stable Diffusion 模型的更强大版本。它使用更大的基础模型,以及一个额外的细化模型来提高基础模型输出的质量。阅读 SDXL 指南以更详细地了解如何使用此模型,以及它使用的其他技术来生成高质量图像。

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import make_image_grid, load_image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-sdxl-init.png"
init_image = load_image(url)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"

# pass prompt and image to pipeline
image = pipeline(prompt, image=init_image, strength=0.5).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
初始图像
生成的图像

Kandinsky 2.2

Kandinsky 模型与 Stable Diffusion 模型不同,因为它使用图像先验模型来创建图像嵌入。嵌入有助于在文本和图像之间创建更好的对齐,使潜在扩散模型能够生成更好的图像。

使用 Kandinsky 2.2 最简单的方法是

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import make_image_grid, load_image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "kandinsky-community/kandinsky-2-2-decoder", torch_dtype=torch.float16, use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png"
init_image = load_image(url)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"

# pass prompt and image to pipeline
image = pipeline(prompt, image=init_image).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
初始图像
生成的图像

配置管道参数

在管道中您可以配置几个重要参数,这些参数会影响图像生成过程和图像质量。让我们仔细看看这些参数的作用以及更改它们如何影响输出。

强度

强度 是要考虑的最重要参数之一,它将对生成的图像产生巨大影响。它决定了生成的图像与初始图像的相似程度。换句话说

  • 📈 强度 值越高,模型的“创造力”就越大,从而生成与初始图像不同的图像;强度 值为 1.0 表示基本忽略初始图像。
  • 📉 强度 值越低,生成的图像就越类似于初始图像。

强度num_inference_steps 参数是相关的,因为 强度 决定了要添加的噪声步数。例如,如果 num_inference_steps 为 50 且 强度 为 0.8,那么这意味着将 40 (50 * 0.8) 步噪声添加到初始图像,然后进行 40 步降噪以获得新生成的图像。

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import make_image_grid, load_image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png"
init_image = load_image(url)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"

# pass prompt and image to pipeline
image = pipeline(prompt, image=init_image, strength=0.8).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
强度 = 0.4
强度 = 0.6
强度 = 1.0

引导比例

guidance_scale 参数用于控制生成的图像和文本提示之间的对齐程度。较高的 guidance_scale 值意味着生成的图像与提示更一致,而较低的 guidance_scale 值意味着生成的图像有更多空间偏离提示。

可以将 guidance_scalestrength 结合使用,以更精确地控制模型的表现力。例如,将高 strength + guidance_scale 结合使用以获得最大的创造力,或者将低 strength 和低 guidance_scale 结合使用以生成类似于初始图像但不受提示严格约束的图像。

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import make_image_grid, load_image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png"
init_image = load_image(url)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"

# pass prompt and image to pipeline
image = pipeline(prompt, image=init_image, guidance_scale=8.0).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
guidance_scale = 0.1
guidance_scale = 5.0
guidance_scale = 10.0

负面提示

负面提示使模型在图像中包含事物,它可以用来提高图像质量或修改图像。例如,可以通过包含诸如“细节差”或“模糊”之类的负面提示来提高图像质量,从而鼓励模型生成更高质量的图像。或者,可以通过指定要从图像中排除的事物来修改图像。

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import make_image_grid, load_image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png"
init_image = load_image(url)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
negative_prompt = "ugly, deformed, disfigured, poor details, bad anatomy"

# pass prompt and image to pipeline
image = pipeline(prompt, negative_prompt=negative_prompt, image=init_image).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
negative_prompt = "丑陋的,畸形的,毁容的,细节差,解剖学不好"
negative_prompt = "丛林"

链式图像到图像管道

除了生成图像之外(虽然这也很酷),还可以使用图像到图像管道以其他一些有趣的方式。可以更进一步,将其与其他管道链接。

文本到图像到图像

将文本到图像和图像到图像管道链接起来,可以从文本生成图像,并将生成的图像用作图像到图像管道的初始图像。如果要从头开始生成图像,这很有用。例如,让我们链接一个 Stable Diffusion 和一个 Kandinsky 模型。

首先使用文本到图像管道生成图像

from diffusers import AutoPipelineForText2Image, AutoPipelineForImage2Image
import torch
from diffusers.utils import make_image_grid

pipeline = AutoPipelineForText2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

text2image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k").images[0]
text2image

现在可以将此生成的图像传递到图像到图像管道

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "kandinsky-community/kandinsky-2-2-decoder", torch_dtype=torch.float16, use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

image2image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", image=text2image).images[0]
make_image_grid([text2image, image2image], rows=1, cols=2)

图像到图像到图像

也可以将多个图像到图像管道链接在一起以创建更有趣的图像。这对于迭代地对图像执行风格迁移、生成简短的 GIF、恢复图像颜色或恢复图像的缺失区域非常有用。

首先生成图像

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import make_image_grid, load_image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png"
init_image = load_image(url)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"

# pass prompt and image to pipeline
image = pipeline(prompt, image=init_image, output_type="latent").images[0]

在管道中指定 output_type="latent" 非常重要,这样可以将所有输出保持在潜在空间中,以避免不必要的解码-编码步骤。这只有在链接的管道使用相同的 VAE 时才有效。

将此管道的潜在输出传递到下一个管道,以生成 漫画书艺术风格 的图像

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "ogkalu/Comic-Diffusion", torch_dtype=torch.float16
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# need to include the token "charliebo artstyle" in the prompt to use this checkpoint
image = pipeline("Astronaut in a jungle, charliebo artstyle", image=image, output_type="latent").images[0]

重复一次,以生成 像素艺术风格 的最终图像

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "kohbanye/pixel-art-style", torch_dtype=torch.float16
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# need to include the token "pixelartstyle" in the prompt to use this checkpoint
image = pipeline("Astronaut in a jungle, pixelartstyle", image=image).images[0]
make_image_grid([init_image, image], rows=1, cols=2)

图像到上采样到超分辨率

链接图像到图像管道的另一种方法是使用上采样和超分辨率管道,真正提高图像的细节水平。

从图像到图像管道开始

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import make_image_grid, load_image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png"
init_image = load_image(url)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"

# pass prompt and image to pipeline
image_1 = pipeline(prompt, image=init_image, output_type="latent").images[0]

在管道中指定 output_type="latent" 非常重要,这样可以将所有输出保持在潜在空间中,以避免不必要的解码-编码步骤。这只有在链接的管道使用相同的 VAE 时才有效。

将其链接到上采样管道以提高图像分辨率

from diffusers import StableDiffusionLatentUpscalePipeline

upscaler = StableDiffusionLatentUpscalePipeline.from_pretrained(
    "stabilityai/sd-x2-latent-upscaler", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
upscaler.enable_model_cpu_offload()
upscaler.enable_xformers_memory_efficient_attention()

image_2 = upscaler(prompt, image=image_1, output_type="latent").images[0]

最后,将其链接到超分辨率管道以进一步增强分辨率

from diffusers import StableDiffusionUpscalePipeline

super_res = StableDiffusionUpscalePipeline.from_pretrained(
    "stabilityai/stable-diffusion-x4-upscaler", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
super_res.enable_model_cpu_offload()
super_res.enable_xformers_memory_efficient_attention()

image_3 = super_res(prompt, image=image_2).images[0]
make_image_grid([init_image, image_3.resize((512, 512))], rows=1, cols=2)

控制图像生成

尝试生成完全符合预期的图像可能很困难,这就是控制生成技术和模型如此有用的原因。虽然可以使用 negative_prompt 部分控制图像生成,但还有更强大的方法,例如提示加权和 ControlNets。

提示加权

提示加权允许对提示中每个概念的表示进行缩放。例如,在诸如“丛林中的宇航员,冷色调,柔和的颜色,细节丰富,8k”之类的提示中,可以选择增加或减少“宇航员”和“丛林”的嵌入。 Compel 库提供了一个简单的语法来调整提示权重并生成嵌入。可以在 提示加权 指南中了解如何创建嵌入。

AutoPipelineForImage2Image 有一个 prompt_embeds(以及如果你使用负面提示的 negative_prompt_embeds)参数,可以在其中传递嵌入,这将替换 prompt 参数。

from diffusers import AutoPipelineForImage2Image
import torch

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

image = pipeline(prompt_embeds=prompt_embeds, # generated from Compel
    negative_prompt_embeds=negative_prompt_embeds, # generated from Compel
    image=init_image,
).images[0]

ControlNet

ControlNets 提供了一种更灵活、更准确的控制图像生成的方法,因为可以使用额外的条件图像。条件图像可以是 Canny 图像、深度图、图像分割,甚至涂鸦!无论选择哪种条件图像,ControlNet 都会生成一个保留其中信息的图像。

例如,让我们使用深度图对图像进行条件化,以保留图像中的空间信息。

from diffusers.utils import load_image, make_image_grid

# prepare image
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png"
init_image = load_image(url)
init_image = init_image.resize((958, 960)) # resize to depth image dimensions
depth_image = load_image("https://huggingface.co/lllyasviel/control_v11f1p_sd15_depth/resolve/main/images/control.png")
make_image_grid([init_image, depth_image], rows=1, cols=2)

加载一个对深度图进行条件化的 ControlNet 模型和 AutoPipelineForImage2Image

from diffusers import ControlNetModel, AutoPipelineForImage2Image
import torch

controlnet = ControlNetModel.from_pretrained("lllyasviel/control_v11f1p_sd15_depth", torch_dtype=torch.float16, variant="fp16", use_safetensors=True)
pipeline = AutoPipelineForImage2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

现在生成一个对深度图、初始图像和提示进行条件化的新图像

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
image_control_net = pipeline(prompt, image=init_image, control_image=depth_image).images[0]
make_image_grid([init_image, depth_image, image_control_net], rows=1, cols=3)
初始图像
深度图像
ControlNet 图像

让我们将一个新的风格应用到通过将ControlNet与图像到图像管道链接生成的图像上。

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "nitrosocke/elden-ring-diffusion", torch_dtype=torch.float16,
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

prompt = "elden ring style astronaut in a jungle" # include the token "elden ring style" in the prompt
negative_prompt = "ugly, deformed, disfigured, poor details, bad anatomy"

image_elden_ring = pipeline(prompt, negative_prompt=negative_prompt, image=image_control_net, strength=0.45, guidance_scale=10.5).images[0]
make_image_grid([init_image, depth_image, image_control_net, image_elden_ring], rows=2, cols=2)

优化

运行扩散模型在计算上很昂贵且密集,但通过一些优化技巧,完全可以在消费级和免费层的GPU上运行它们。例如,您可以使用更节省内存的注意力形式,例如PyTorch 2.0的缩放点积注意力xFormers(您可以使用其中一个,但不需要同时使用)。您还可以将模型卸载到GPU上,而其他管道组件在CPU上等待。

+ pipeline.enable_model_cpu_offload()
+ pipeline.enable_xformers_memory_efficient_attention()

使用torch.compile,您可以通过将UNet用它包装来进一步提升您的推理速度。

pipeline.unet = torch.compile(pipeline.unet, mode="reduce-overhead", fullgraph=True)

要了解更多信息,请查看减少内存使用Torch 2.0指南。

< > 在GitHub上更新