前言
🤗 扩散器能够完成许多不同的任务,并且您通常可以将相同的预训练权重用于多个任务,例如文本到图像、图像到图像和修复。但是,如果您不熟悉库和扩散模型,可能很难知道将哪个管道用于任务。例如,如果您将 runwayml/stable-diffusion-v1-5 模型用于文本到图像,您可能不知道也可以通过分别使用 StableDiffusionImg2ImgPipeline 和 StableDiffusionInpaintPipeline 类加载模型来将其用于图像到图像和修复。
该 AutoPipeline
类旨在简化扩散器中🤗管道的多样性。它是一个通用的、任务优先的管道,可让你专注于任务。它 AutoPipeline
会自动检测要使用的正确管道类,这样可以更轻松地加载任务的检查点,而无需知道特定的管道类名称。
AutoPipeline支持以下任务
- Stable Diffusion
- ControlNet
- Stable Diffusion XL (SDXL)
- DeepFloyd IF DeepFloyd 中频
- Kandinsky 2.1
- Kandinsky 2.2
AutoPipelineForText2Image
首先选择一个模型。例如,如果您对使用 runwayml/stable-diffusion-v1-5 模型的文本到图像感兴趣,请使用 AutoPipelineForText2Image:
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True
).to("cuda")
prompt = "peasant and dragon combat, wood cutting style, viking era, bevel with rune"
image = pipeline(prompt, num_inference_steps=25).images[0]
image
在后台,AutoPipelineForText2Image:
自动从 model_index.json
文件中检测 "stable-diffusion"
类
根据 "stable-diffusion"
类名加载相应的文本到图像 StableDiffusionPipeline
AutoPipelineForImage2Image
同样,对于图生图,AutoPipelineForImage2Image 会从 model_index.json
文件中检测到检查 "stable-diffusion"
点,并在后台加载相应的 StableDiffusionImg2ImgPipeline。还可以传递特定于管道类的任何其他参数,例如 strength
,它确定添加到输入图像的噪声或变化量:
from diffusers import AutoPipelineForImage2Image
import torch
import requests
from PIL import Image
from io import BytesIO
pipeline = AutoPipelineForImage2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16,
use_safetensors=True,
).to("cuda")
prompt = "a portrait of a dog wearing a pearl earring"
url = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/1665_Girl_with_a_Pearl_Earring.jpg/800px-1665_Girl_with_a_Pearl_Earring.jpg"
response = requests.get(url)
image = Image.open(BytesIO(response.content)).convert("RGB")
image.thumbnail((768, 768))
image = pipeline(prompt, image, num_inference_steps=200, strength=0.75, guidance_scale=10.5).images[0]
image
AutoPipelineForInpainting
如果要进行修复,则 AutoPipelineForInpainting 会以相同的方式加载基础 StableDiffusionInpaintPipeline 类:
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image
import torch
pipeline = AutoPipelineForInpainting.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, use_safetensors=True
).to("cuda")
img_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png"
mask_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png"
init_image = load_image(img_url).convert("RGB")
mask_image = load_image(mask_url).convert("RGB")
prompt = "A majestic tiger sitting on a bench"
image = pipeline(prompt, image=init_image, mask_image=mask_image, num_inference_steps=50, strength=0.80).images[0]
image
如果您尝试加载不受支持的检查点,它将引发错误:
from diffusers import AutoPipelineForImage2Image
import torch
pipeline = AutoPipelineForImage2Image.from_pretrained(
"openai/shap-e-img2img", torch_dtype=torch.float16, use_safetensors=True
)
"ValueError: AutoPipeline can't find a pipeline linked to ShapEImg2ImgPipeline for None"
重复利用模型于多个管道
对于某些工作流,或者如果要加载多个管道,则从检查点重用相同的组件比重新加载它们会不必要地消耗额外内存更节省内存。例如,如果您正在将检查点用于文本到图像,并且想要再次将其用于图像到图像,请使用 from_pipe() 方法。此方法从以前加载的管道的组件创建新管道,无需额外的内存成本。
from_pipe() 方法检测原始管道类,并将其映射到与要执行的任务相对应的新管道类。例如,如果加载文本到图像的 "stable-diffusion"
类管道:
from diffusers import AutoPipelineForText2Image, AutoPipelineForImage2Image
import torch
pipeline_text2img = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True
)
print(type(pipeline_text2img))
"<class 'diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline'>"
然后 from_pipe() 将原始 "stable-diffusion"
管道类映射到StableDiffusionImg2ImgPipeline:
pipeline_img2img = AutoPipelineForImage2Image.from_pipe(pipeline_text2img)
print(type(pipeline_img2img))
"<class 'diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_img2img.StableDiffusionImg2ImgPipeline'>"
如果将可选参数(如禁用安全检查器)传递到原始管道,则此参数也会传递到新管道:
from diffusers import AutoPipelineForText2Image, AutoPipelineForImage2Image
import torch
pipeline_text2img = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16,
use_safetensors=True,
requires_safety_checker=False,
).to("cuda")
pipeline_img2img = AutoPipelineForImage2Image.from_pipe(pipeline_text2img)
print(pipeline_img2img.config.requires_safety_checker)
"False"
如果要更改新管道的行为,可以覆盖原始管道中的任何参数,甚至可以覆盖配置。例如,要重新打开安全检查器并添加 strength
参数,请执行以下操作:
pipeline_img2img = AutoPipelineForImage2Image.from_pipe(pipeline_text2img, requires_safety_checker=True, strength=0.3)
print(pipeline_img2img.config.requires_safety_checker)
"True"