Эффективная управляемая генерация для SDXL с T2I-адаптерами

Управляемая генерация для SDXL с T2I-адаптерами

T2I-Адаптер – это эффективная модель “подключи и используй”, которая обеспечивает дополнительное руководство моделям текст-изображение, замораживая оригинальные большие модели текст-изображение. T2I-Адаптер выравнивает внутренние знания в моделях T2I с внешними управляющими сигналами. Мы можем обучать различные адаптеры в соответствии с различными условиями и достигать богатого управления и редактирования.

Как современная работа, ControlNet имеет аналогичную функцию и широко используется. Однако его выполнение может быть вычислительно затратным. Это связано с тем, что во время каждого шага очистки процесса обратной диффузии необходимо выполнять и ControlNet, и UNet. Кроме того, ControlNet подчеркивает важность копирования кодировщика UNet в качестве управляющей модели, что приводит к увеличению числа параметров. Таким образом, генерация замедляется размером ControlNet (чем больше, тем медленнее процесс).

В этом вопросе T2I-Адаптеры предоставляют конкурентное преимущество перед ControlNet. T2I-Адаптеры имеют меньший размер и, в отличие от ControlNet, T2I-Адаптеры выполняются только один раз на протяжении всего процесса очистки.

За последние несколько недель команда Diffusers и авторы T2I-Адаптера сотрудничали для поддержки T2I-Адаптеров для Stable Diffusion XL (SDXL) в diffusers. В этой статье мы поделимся нашими результатами обучения T2I-Адаптеров на SDXL с нуля, некоторыми привлекательными результатами и, конечно же, контрольными точками T2I-Адаптеров при различных условиях (эскиз, canny, lineart, depth и openpose)!

По сравнению с предыдущими версиями T2I-Адаптера (SD-1.4/1.5), T2I-Адаптер-SDXL по-прежнему использует исходный рецепт, приводящий 2,6B SDXL с 79M Адаптером! T2I-Адаптер-SDXL сохраняет мощные возможности управления, одновременно наследуя высококачественную генерацию SDXL!

Обучение T2I-Адаптера-SDXL с помощью diffusers

Мы создали наш скрипт обучения на этом официальном примере, предоставленном diffusers.

Большинство моделей T2I-Адаптеров, о которых мы упоминаем в этой статье, были обучены на 3M пар изображений и текста высокого разрешения из LAION-Aesthetics V2 с использованием следующих настроек:

  • Шаги обучения: 20000-35000
  • Размер пакета: Data parallel с размером пакета одного GPU равным 16 для общего размера пакета 128.
  • Скорость обучения: Постоянная скорость обучения 1e-5.
  • Смешанная точность: fp16

Мы призываем сообщество использовать наши скрипты для обучения пользовательских и мощных T2I-Адаптеров, достигая конкурентного баланса между скоростью, памятью и качеством.

Использование T2I-Адаптера-SDXL в diffusers

Здесь мы возьмем условие “lineart” в качестве примера, чтобы продемонстрировать использование T2I-Адаптера-SDXL. Чтобы начать, сначала установите необходимые зависимости:

pip install -U git+https://github.com/huggingface/diffusers.git
pip install -U controlnet_aux==0.0.7 # для моделей условий и детекторов
pip install transformers accelerate 

Процесс генерации T2I-Адаптера-SDXL в основном состоит из следующих двух шагов:

  1. Изображения условий сначала подготавливаются в соответствующий формат управляющего изображения.
  2. Управляющее изображение и подсказка передаются в StableDiffusionXLAdapterPipeline.

Давайте рассмотрим простой пример с использованием Адаптера Lineart. Мы начинаем с инициализации конвейера T2I-Адаптера для SDXL и детектора lineart.

import torch
from controlnet_aux.lineart import LineartDetector
from diffusers import (AutoencoderKL, EulerAncestralDiscreteScheduler,
                       StableDiffusionXLAdapterPipeline, T2IAdapter)
from diffusers.utils import load_image, make_image_grid

# загрузка адаптера
adapter = T2IAdapter.from_pretrained(
    "TencentARC/t2i-adapter-lineart-sdxl-1.0", torch_dtype=torch.float16, varient="fp16"
).to("cuda")

# загрузка конвейера
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
euler_a = EulerAncestralDiscreteScheduler.from_pretrained(
    model_id, subfolder="scheduler"
)
vae = AutoencoderKL.from_pretrained(
    "madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16
)
pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
    model_id,
    vae=vae,
    adapter=adapter,
    scheduler=euler_a,
    torch_dtype=torch.float16,
    variant="fp16",
).to("cuda")

# загрузка детектора lineart
line_detector = LineartDetector.from_pretrained("lllyasviel/Annotators").to("cuda")

Затем загрузите изображение для обнаружения линейного рисунка:

url = "https://huggingface.co/Adapter/t2iadapter/resolve/main/figs_SDXLV1.0/org_lin.jpg"
image = load_image(url)
image = line_detector(image, detect_resolution=384, image_resolution=1024)

Затем мы генерируем:

prompt = "Рев ледяного дракона, фото 4k"
negative_prompt = "аниме, мультфильм, графика, текст, живопись, карандаш, графит, абстракция, глюк, деформированный, мутировавший, уродливый, искалеченный"
gen_images = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    image=image,
    num_inference_steps=30,
    adapter_conditioning_scale=0.8,
    guidance_scale=7.5,
).images[0]
gen_images.save("out_lin.png")

Есть два важных аргумента, которые помогают контролировать количество условий.

  1. adapter_conditioning_scale

    Этот аргумент контролирует, насколько условие должно влиять на ввод. Высокие значения означают больший эффект условия, и наоборот.

  2. adapter_conditioning_factor

    Этот аргумент контролирует, сколько начальных шагов генерации должно использовать условие. Значение должно быть установлено между 0 и 1 (по умолчанию 1). Значение adapter_conditioning_factor=1 означает, что адаптер должен применяться ко всем временным шагам, в то время как adapter_conditioning_factor=0.5 означает, что он будет применяться только для первых 50% шагов.

Для получения более подробной информации мы приглашаем вас ознакомиться с официальной документацией.

Попробуйте демо-версию

Вы можете легко опробовать T2I-Adapter-SDXL в этом пространстве или во встроенной площадке:

Больше результатов

Ниже представлены результаты, полученные при использовании разных видов условий. Мы также дополнили результаты ссылками на соответствующие предварительно обученные контрольные точки. В их модельных картах содержится более подробная информация о том, как они были обучены, а также пример использования.

С управляемым линейным рисунком

Модель от TencentARC/t2i-adapter-lineart-sdxl-1.0

С управляемым наброском

Модель от TencentARC/t2i-adapter-sketch-sdxl-1.0

С управляемым Canny-фильтром

Модель от TencentARC/t2i-adapter-canny-sdxl-1.0

С управляемым глубинным эффектом

Модели с управляемым глубинным эффектом от TencentARC/t2i-adapter-depth-midas-sdxl-1.0 и TencentARC/t2i-adapter-depth-zoe-sdxl-1.0 соответственно

С управляемым OpenPose

Модель от TencentARC/t2i-adapter-openpose-sdxl-1.0


Благодарности: Огромное спасибо Вильяму Берману за помощь в обучении моделей и за дележку своих идей.