Diffusers documentation

Устаревшие адаптеры

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Устаревшие адаптеры

Эти методы по-прежнему поддерживаются, особенно для чекпоинтов семейства Stable Diffusion. Для новых работ рекомендуется использовать LoRA, IP-Adapter и ControlNet.

T2I-Adapter

T2I-Adapter — это адаптер для управляемой генерации. Он обучает отображение управляющего сигнала (например, карты глубины или канни-контуров) во внутренние признаки предобученной модели и добавляет это руководство в процессе генерации. По своей роли он похож на ControlNet, но представляет собой более лёгкий подключаемый адаптер.

Загрузите адаптер с управлением по условию, затем загрузите конвейер с помощью from_pretrained() и передайте его с параметром adapter=.

import torch
from diffusers import T2IAdapter, StableDiffusionXLAdapterPipeline, AutoencoderKL

t2i_adapter = T2IAdapter.from_pretrained(
    "TencentARC/t2i-adapter-canny-sdxl-1.0",
    dtype=torch.float16,
)

Сгенерируйте изображение с эффектом canny с помощью opencv-python.

import cv2
import numpy as np
from PIL import Image
from diffusers.utils import load_image

original_image = load_image(
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/non-enhanced-prompt.png"
)

image = np.array(original_image)

low_threshold = 100
high_threshold = 200

image = cv2.Canny(image, low_threshold, high_threshold)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
canny_image = Image.fromarray(image)

Передайте изображение canny в конвейер для генерации изображения.

vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", dtype=torch.float16)
pipeline = StableDiffusionXLAdapterPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    adapter=t2i_adapter,
    vae=vae,
    dtype=torch.float16,
).to("cuda")  # or "mps", "xpu", "cpu"

prompt = """
A photorealistic overhead image of a cat reclining sideways in a flamingo pool floatie holding a margarita. 
The cat is floating leisurely in the pool and completely relaxed and happy.
"""

pipeline(
    prompt, 
    image=canny_image,
    num_inference_steps=100, 
    guidance_scale=10,
).images[0]
Original image
original image
Control image (Canny edges)
canny image
Generated image (T2I-Adapter + prompt)
сгенерированное изображение

См. также обучение T2I-Adapter.

MultiAdapter

Составляйте несколько контролей (например, canny и depth) с помощью MultiAdapter. Передайте список адаптеров в MultiAdapter, затем передайте соответствующие контрольные изображения в виде списка в пайплайн.

import torch
from diffusers.utils import load_image
from diffusers import StableDiffusionXLAdapterPipeline, AutoencoderKL, MultiAdapter, T2IAdapter

canny_image = load_image(
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/canny-cat.png"
)
depth_image = load_image(
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl_depth_image.png"
)
controls = [canny_image, depth_image]
prompt = ["""
a relaxed rabbit sitting on a striped towel next to a pool with a tropical drink nearby, 
bright sunny day, vacation scene, 35mm photograph, film, professional, 4k, highly detailed
"""]

adapters = MultiAdapter(
    [
        T2IAdapter.from_pretrained("TencentARC/t2i-adapter-canny-sdxl-1.0", dtype=torch.float16),
        T2IAdapter.from_pretrained("TencentARC/t2i-adapter-depth-midas-sdxl-1.0", dtype=torch.float16),
    ]
)

Передайте адаптеры, промпт и управляющие изображения в StableDiffusionXLAdapterPipeline. Используйте параметр adapter_conditioning_scale, чтобы определить вес, который следует назначить каждому управлению.

vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", dtype=torch.float16)
pipeline = StableDiffusionXLAdapterPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16,
    vae=vae,
    adapter=adapters,
).to("cuda")  # or "mps", "xpu", "cpu"

pipeline(
    prompt,
    image=controls,
    height=1024,
    width=1024,
    adapter_conditioning_scale=[0.7, 0.7]
).images[0]
Control image (Canny edges)
canny image
Control image (depth map)
карта глубины
Generated image (MultiAdapter + prompt)
сгенерированное изображение

Textual Inversion

Textual Inversion персонализирует модель под концепцию по 3–5 изображениям, обучая эмбеддинги слов, связанные с уникальным токеном (<sks>). Затем вы можете использовать этот токен в промпте, чтобы генерировать концепцию (например, пиксель-арт).

Веса Textual Inversion обычно занимают всего несколько КБ, поскольку представляют собой лишь эмбеддинги слов. Загружайте их после from_pretrained() с помощью load_textual_inversion() и включайте уникальный токен в промпт для запуска генерации.

import torch
from diffusers import AutoPipelineForText2Image

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-v1-5",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_textual_inversion("sd-concepts-library/gta5-artwork")
prompt = "A cute brown bear eating a slice of pizza, stunning color scheme, masterpiece, illustration, <gta5-artwork> style"
pipeline(prompt).images[0]

Чтобы обучить эмбеддинги, см. Обучение текстовой инверсии.

Textual Inversion также можно обучать для получения отрицательных эмбеддингов, чтобы направлять генерацию в сторону, противоположную нежелательным характеристикам, таким как «размытость» или «некрасивость», что делает его полезным для улучшения качества изображений.

EasyNegative — это широко используемое отрицательное вложение, содержащее несколько выученных отрицательных концепций. Загрузите отрицательные вложения и укажите имя файла и токен, связанные с отрицательными вложениями. Передайте токен в negative_prompt в вашем конвейере, чтобы активировать его.

import torch
from diffusers import AutoPipelineForText2Image

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-v1-5",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_textual_inversion(
    "EvilEngine/easynegative",
    weight_name="easynegative.safetensors",
    token="easynegative"
)
prompt = "A cute brown bear eating a slice of pizza, stunning color scheme, masterpiece, illustration"
negative_prompt = "easynegative"
pipeline(prompt, negative_prompt=negative_prompt).images[0]
Update on GitHub