图像到图像
图像到图像类似于 文本到图像,但除了提示之外,您还可以传递初始图像作为扩散过程的起点。初始图像被编码到潜在空间,并添加噪声。然后,潜在扩散模型接受提示和噪声潜在图像,预测添加的噪声,并从初始潜在图像中删除预测的噪声以获得新的潜在图像。最后,解码器将新的潜在图像解码回图像。
使用 🤗 Diffusers,这就像 1-2-3 一样简单
- 将检查点加载到 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 的本机 缩放点积注意力。
- 加载要传递到管道的图像
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
- 将提示和图像传递到管道以生成图像
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.5、Stable 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)
引导比例
guidance_scale
参数用于控制生成的图像和文本提示之间的对齐程度。较高的 guidance_scale
值意味着生成的图像与提示更一致,而较低的 guidance_scale
值意味着生成的图像有更多空间偏离提示。
可以将 guidance_scale
与 strength
结合使用,以更精确地控制模型的表现力。例如,将高 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)
负面提示
负面提示使模型不在图像中包含事物,它可以用来提高图像质量或修改图像。例如,可以通过包含诸如“细节差”或“模糊”之类的负面提示来提高图像质量,从而鼓励模型生成更高质量的图像。或者,可以通过指定要从图像中排除的事物来修改图像。
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)
链式图像到图像管道
除了生成图像之外(虽然这也很酷),还可以使用图像到图像管道以其他一些有趣的方式。可以更进一步,将其与其他管道链接。
文本到图像到图像
将文本到图像和图像到图像管道链接起来,可以从文本生成图像,并将生成的图像用作图像到图像管道的初始图像。如果要从头开始生成图像,这很有用。例如,让我们链接一个 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与图像到图像管道链接生成的图像上。
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上更新