Buckets:

hf-doc-build/doc / diffusers /v0.43.0 /ru /using-diffusers /conditional_image_generation.md
mishig's picture
|
download
raw
22.3 kB
# Текст в изображение
Когда вы думаете о диффузионных моделях, одним из первых ассоциаций обычно является генерация изображений по тексту. Text-to-image создаёт изображение на основе текстового описания (например, "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"), которое также называют *prompt*.
На высоком уровне диффузионная модель принимает промпт и некоторый случайный начальный шум, а затем итеративно удаляет шум, чтобы построить изображение. Процесс *денуазинга* направляется промптом, и когда процесс денуазинга завершается после заранее определенного количества временных шагов, представление изображения декодируется в изображение.
> [!TIP]
> Ознакомьтесь с публикацией [How does Stable Diffusion work?](https://huggingface.co/blog/stable_diffusion#how-does-stable-diffusion-work), чтобы узнать больше о том, как работает модель латентного диффузионного процесса.
Вы можете генерировать изображения по промпту в 🤗 Diffusers в два шага:
1. Загрузите контрольную точку в класс [AutoPipelineForText2Image](/docs/diffusers/v0.43.0/ru/api/pipelines/auto_pipeline#diffusers.AutoPipelineForText2Image), который автоматически определяет подходящий класс пайплайна на основе контрольной точки:
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda") # or "mps", "xpu", "cpu"
```
2. Передайте промпт в конвейер, чтобы сгенерировать изображение:
```py
image = pipeline(
"stained glass of darth vader, backlight, centered composition, masterpiece, photorealistic, 8k"
).images[0]
image
```
## Популярные модели
Самыми распространёнными моделями для генерации изображений по тексту являются [Stable Diffusion v1.5](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5), [Stable Diffusion XL (SDXL)](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0) и [Kandinsky 2.2](https://huggingface.co/kandinsky-community/kandinsky-2-2-decoder). Также существуют модели ControlNet или адаптеры, которые можно использовать вместе с текстово-изображенческими моделями для более прямого управления процессом генерации изображений. Результаты, получаемые каждой моделью, немного различаются из-за особенностей их архитектуры и процесса обучения, но независимо от выбранной модели, принцип их использования в целом одинаков. Давайте используем один и тот же промпт для каждой модели и сравним их результаты.
### Stable Diffusion v1.5
[Stable Diffusion v1.5](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5) — это латентная диффузионная модель, инициализированная из [Stable Diffusion v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4) и дообученная в течение 595K шагов на изображениях 512x512 из набора данных LAION-Aesthetics V2. Вы можете использовать эту модель следующим образом:
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda") # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image
```
### Stable Diffusion XL
SDXL — это значительно более крупная версия предыдущих моделей Stable Diffusion, использующая двухэтапный процесс моделирования, который добавляет изображению ещё больше деталей. Она также включает дополнительные *микроусловия* для генерации изображений высокого качества с центрированными объектами. Более подробное руководство по [SDXL](../api/pipelines/stable_diffusion/stable_diffusion_xl) поможет узнать, как её использовать. В целом, SDXL можно применять следующим образом:
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16, variant="fp16"
).to("cuda") # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image
```
### Kandinsky 2.2
Модель Kandinsky немного отличается от моделей Stable Diffusion, поскольку она также использует модель-приор изображения для создания эмбеддингов, которые применяются для более точного согласования текста и изображений в диффузионной модели.
Самый простой способ использования Kandinsky 2.2:
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"kandinsky-community/kandinsky-2-2-decoder", dtype=torch.float16
).to("cuda") # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image
```
### ControlNet
Модели ControlNet — это вспомогательные модели или адаптеры, которые дообучаются поверх текстово-изображательных моделей, таких как [Stable Diffusion v1.5](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5). Использование моделей ControlNet в сочетании с текстово-изображательными моделями предоставляет разнообразные варианты для более явного управления процессом генерации изображения. С помощью ControlNet вы добавляете в модель дополнительное условное входное изображение. Например, если вы предоставите изображение позы человека (обычно представленное в виде нескольких ключевых точек, соединённых в скелет) в качестве условного входа, модель сгенерирует изображение, повторяющее позу с исходного изображения. Ознакомьтесь с более подробным руководством по [ControlNet](controlnet), чтобы узнать больше о других условных входах и способах их использования.
В этом примере мы будем использовать ControlNet с изображением, полученным в результате оценки позы человека. Загрузите модель ControlNet, предварительно обученную на оценках поз человека:
```py
from diffusers import ControlNetModel, AutoPipelineForText2Image
from diffusers.utils import load_image
import torch
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/control_v11p_sd15_openpose", dtype=torch.float16, variant="fp16"
).to("cuda") # or "mps", "xpu", "cpu"
pose_image = load_image("https://huggingface.co/lllyasviel/control_v11p_sd15_openpose/resolve/main/images/control.png")
```
Передайте `controlnet` в [AutoPipelineForText2Image](/docs/diffusers/v0.43.0/ru/api/pipelines/auto_pipeline#diffusers.AutoPipelineForText2Image) и укажите промпт и изображение с оценкой позы:
```py
pipeline = AutoPipelineForText2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", controlnet=controlnet, dtype=torch.float16, variant="fp16"
).to("cuda") # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", image=pose_image, generator=generator).images[0]
image
```
Stable Diffusion v1.5
Stable Diffusion XL
Kandinsky 2.2
ControlNet (условие по позе)
## Настройка параметров конвейера
Существует ряд параметров, которые можно настроить в конвейере и которые влияют на процесс генерации изображения. Вы можете изменить размер выходного изображения, указать отрицательный промпт для улучшения качества изображения и многое другое. В этом разделе подробно рассматривается, как использовать эти параметры.
### Высота и ширина
Параметры `height` и `width` управляют высотой и шириной (в пикселях) генерируемого изображения. По умолчанию модель Stable Diffusion v1.5 выводит изображения размером 512x512, но вы можете изменить этот размер на любой, кратный 8. Например, чтобы создать прямоугольное изображение:
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda") # or "mps", "xpu", "cpu"
image = pipeline(
"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", height=768, width=512
).images[0]
image
```
> [!WARNING]
> Другие модели могут иметь другие значения по умолчанию для размера изображения в зависимости от размеров изображений в обучающем наборе данных. Например, размер изображения по умолчанию для SDXL составляет 1024x1024, и использование меньших значений `height` и `width` может привести к получению изображений более низкого качества. Обязательно сначала проверьте справочник API модели!
### Масштаб направляющего сигнала
Параметр `guidance_scale` определяет степень влияния промпта на генерацию изображения. Более низкое значение даёт модели «свободу творчества» для создания изображений, лишь отдалённо связанных с промптом. Более высокие значения `guidance_scale` заставляют модель точнее следовать промпту, а если это значение слишком велико, в сгенерированном изображении могут появиться артефакты.
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda") # or "mps", "xpu", "cpu"
image = pipeline(
"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", guidance_scale=3.5
).images[0]
image
```
guidance_scale = 2.5
guidance_scale = 7.5
guidance_scale = 10.5
### Негативный промпт
Так же, как промпт направляет генерацию, *негативный промпт* отводит модель от тех элементов, которые вы не хотите видеть в результате. Этот подход часто используют для повышения общего качества изображения, исключая нежелательные черты, такие как «низкое разрешение» или «плохие детали». Негативный промпт также позволяет удалять или изменять содержание и стиль изображения.
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda") # or "mps", "xpu", "cpu"
image = pipeline(
prompt="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
negative_prompt="ugly, deformed, disfigured, poor details, bad anatomy",
).images[0]
image
```
negative_prompt = "ugly, deformed, disfigured, poor details, bad anatomy"
negative_prompt = "astronaut"
### Генератор
Объект [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html#generator) обеспечивает воспроизводимость в конвейере за счёт установки ручного seed. С помощью `Generator` можно генерировать батчи изображений и итеративно улучшать изображение, созданное из seed, как описано в руководстве [Улучшение качества изображения с помощью детерминированной генерации](reusing_seeds).
Вы можете задать seed и `Generator`, как показано ниже. Создание изображения с `Generator` должно возвращать одинаковый результат каждый раз, а не генерировать новое изображение случайно.
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda") # or "mps", "xpu", "cpu"
generator = torch.Generator(device="cuda").manual_seed(30)
image = pipeline(
"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
generator=generator,
).images[0]
image
```
## Управление генерацией изображений
Существует несколько способов получить более точный контроль над процессом генерации изображения, помимо настройки параметров конвейера, например, взвешивание промпта и модели ControlNet.
### Взвешивание промптов
Взвешивание промпта — это техника, позволяющая повышать или понижать значимость концепций в промпте, чтобы подчеркнуть или минимизировать определённые особенности изображения. Мы рекомендуем использовать библиотеку [Compel](https://github.com/damian0815/compel), чтобы помочь вам сгенерировать взвешенные эмбеддинги промпта.
> [!TIP]
> Узнайте, как создать эмбеддинги промпта в руководстве [Взвешивание промпта](weighted_prompts). В этом примере показано, как использовать эмбеддинги промпта в конвейере.
После создания эмбеддингов вы можете передать их в параметр `prompt_embeds` (а также в `negative_prompt_embeds`, если вы используете негативный промпт) в пайплайне.
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda") # or "mps", "xpu", "cpu"
image = pipeline(
prompt_embeds=prompt_embeds, # generated from Compel
negative_prompt_embeds=negative_prompt_embeds, # generated from Compel
).images[0]
```
### ControlNet
Как вы видели в разделе [ControlNet](#controlnet), эти модели предлагают более гибкий и точный способ генерации изображений за счёт использования дополнительного входного изображения для условного управления. Каждая модель ControlNet предварительно обучена на определённом типе условного изображения, чтобы генерировать новые изображения, похожие на него. Например, если вы возьмёте модель ControlNet, предварительно обученную на картах глубины, вы можете передать модели карту глубины в качестве условного входа, и она сгенерирует изображение, сохраняющее пространственную информацию из неё. Это быстрее и проще, чем указывать информацию о глубине в промпте. Вы даже можете объединять несколько условных входов с помощью [Multi-ControlNet](controlnet#multi-controlnet)!
Существует множество типов условных входных данных, которые можно использовать, и 🤗 Diffusers поддерживает ControlNet для моделей Stable Diffusion и SDXL. Ознакомьтесь с более подробным руководством по [ControlNet](controlnet), чтобы узнать, как использовать эти модели.
## Оптимизация
Модели диффузии имеют большой размер, а итеративный процесс удаления шума из изображения требует значительных вычислительных ресурсов. Однако это не означает, что для их использования вам нужны мощные или даже многочисленные GPU. Существует множество методов оптимизации для запуска моделей диффузии на потребительском и бесплатном оборудовании. Например, вы можете загрузить веса модели в формате с половинной точностью, чтобы сэкономить память GPU и увеличить скорость, или выгрузить всю модель на GPU, чтобы сэкономить ещё больше памяти.
PyTorch 2.0 также поддерживает более эффективный по памяти механизм внимания, называемый [*scaled dot product attention*](../optimization/fp16#scaled-dot-product-attention), который автоматически включается при использовании PyTorch 2.0. Вы можете сочетать его с [`torch.compile`](https://pytorch.org/tutorials/intermediate/torch_compile_tutorial.html), чтобы еще больше ускорить выполнение кода:
```py
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16").to("cuda") # or "mps", "xpu", "cpu"
pipeline.unet = torch.compile(pipeline.unet, mode="reduce-overhead", fullgraph=True)
```
Для получения дополнительных советов по оптимизации кода для экономии памяти и ускорения инференса ознакомьтесь с руководствами [Accelerate inference](../optimization/fp16) и [Reduce memory usage](../optimization/memory).

Xet Storage Details

Size:
22.3 kB
·
Xet hash:
1d97be0f7816542d8c98eaa312b9cd15423a82d36e62cbaca27dfbf750c1ab63

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.