# Latent Diffusion

Latent Diffusion была предложена в статье [High-Resolution Image Synthesis with Latent Diffusion Models](https://huggingface.co/papers/2112.10752) Робина Ромбаха, Андреаса Блаттмана, Доминика Лоренца, Патрика Эссера и Бьёрна Оммера.

Аннотация из статьи:

*Разлагая процесс формирования изображения на последовательное применение автоэнкодеров шумоподавления, диффузионные модели (DM) достигают наилучших результатов синтеза на данных изображений и не только. Кроме того, их формулировка позволяет использовать механизм управления для контроля процесса генерации изображений без повторного обучения. Однако, поскольку эти модели обычно работают непосредственно в пиксельном пространстве, оптимизация мощных DM часто требует сотен GPU-дней, а инференс обходится дорого из-за последовательных вычислений. Чтобы обеспечить обучение DM на ограниченных вычислительных ресурсах с сохранением их качества и гибкости, мы применяем их в латентном пространстве мощных предобученных автоэнкодеров. В отличие от предыдущих работ, обучение диффузионных моделей на таком представлении впервые позволяет достичь почти оптимальной точки между снижением сложности и сохранением деталей, что значительно повышает визуальную точность. Вводя слои кросс-внимания в архитектуру модели, мы превращаем диффузионные модели в мощные и гибкие генераторы для общих условных входных данных, таких как текст или ограничивающие рамки, и становится возможным синтез высокого разрешения в свёрточном режиме. Наши латентные диффузионные модели (LDM) достигают нового состояния техники для инпейнтинга изображений и демонстрируют высокую конкурентоспособность на различных задачах, включая безусловную генерацию изображений, семантический синтез сцен и супер-разрешение, при этом значительно снижая вычислительные требования по сравнению с пиксельными DM.*

Исходный код можно найти в [CompVis/latent-diffusion](https://github.com/CompVis/latent-diffusion).

> [!TIP]
> Обязательно ознакомьтесь с [руководством по планировщикам](../../using-diffusers/schedulers), чтобы узнать, как исследовать баланс между скоростью и качеством планировщика, а также с разделом [повторное использование компонентов в разных конвейерах](../../using-diffusers/loading#reusing-models-in-multiple-pipelines), чтобы узнать, как эффективно загружать одни и те же компоненты в несколько конвейеров.

## LDMTextToImagePipeline[[diffusers.LDMTextToImagePipeline]]

#### diffusers.LDMTextToImagePipeline[[diffusers.LDMTextToImagePipeline]]

```python
diffusers.LDMTextToImagePipeline(vqvae: diffusers.models.autoencoders.vq_model.VQModel | diffusers.models.autoencoders.autoencoder_kl.AutoencoderKL, bert: PreTrainedModel, tokenizer: PythonBackend, unet: diffusers.models.unets.unet_2d.UNet2DModel | diffusers.models.unets.unet_2d_condition.UNet2DConditionModel, scheduler: diffusers.schedulers.scheduling_ddim.DDIMScheduler | diffusers.schedulers.scheduling_pndm.PNDMScheduler | diffusers.utils.dummy_torch_and_scipy_objects.LMSDiscreteScheduler)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py#L39)

**Параметры:**

vqvae ([VQModel](/docs/diffusers/main/ru/api/models/vq#diffusers.VQModel)) : векторно-квантованная (VQ) модель для кодирования изображений в латентные представления и декодирования из них.

bert (`LDMBertModel`) : Текстовая кодирующая модель на основе `BERT`.

tokenizer ([BertTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/lxmert#transformers.BertTokenizer)) : экземпляр `BertTokenizer` для токенизации текста.

unet ([UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : `UNet2DConditionModel` для удаления шума из закодированных латентов изображения.

scheduler ([SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `unet` для удаления шума из закодированных латентов изображения. Может быть одним из [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) или [PNDMScheduler](/docs/diffusers/main/ru/api/schedulers/pndm#diffusers.PNDMScheduler).

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

Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса.

#### __call__[[diffusers.LDMTextToImagePipeline.__call__]]

```python
__call__(prompt: str | list[str], height: int | None = None, width: int | None = None, num_inference_steps: int | None = 50, guidance_scale: float | None = 1.0, eta: float | None = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py#L74)

**Параметры:**

prompt (`str` или `list[str]`) : Промпт или промпты для управления генерацией изображения.

height (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Высота генерируемого изображения в пикселях.

width (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Ширина генерируемого изображения в пикселях.

num_inference_steps (`int`, *optional*, по умолчанию 50) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к изображению более высокого качества, но за счёт более медленного вывода.

guidance_scale (`float`, *optional*, по умолчанию 1.0) : Более высокое значение guidance scale побуждает модель генерировать изображения, тесно связанные с текстовым `prompt`, за счёт снижения качества изображения. Guidance scale активируется, когда `guidance_scale > 1`.

eta (`float`, *необязательный*, по умолчанию 0.0) : Соответствует параметру eta (η) из статьи [DDIM](https://huggingface.co/papers/2010.02502). Применяется только к [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler) и игнорируется другими планировщиками.

generator (`torch.Generator`, *необязательный*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации.

latents (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации изображений. Позволяет корректировать одну и ту же генерацию с помощью разных промптов. Если не задано, тензор латентов генерируется путём выборки с использованием переданного случайного `generator`.

output_type (`str`, *необязательный*, по умолчанию `"pil"`) : Формат вывода сгенерированного изображения. Выберите один из вариантов: `"pil"` (`PIL.Image`), `"np"` (`np.array`) или `"pt"` (`torch.Tensor`).

return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли [ImagePipelineOutput](/docs/diffusers/main/ru/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) вместо обычного кортежа.

**Возвращает:** [ImagePipelineOutput](/docs/diffusers/main/ru/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) или `tuple`

Если `return_dict` равно `True`, возвращается [ImagePipelineOutput](/docs/diffusers/main/ru/api/pipelines/consistency_models#diffusers.ImagePipelineOutput), иначе возвращается `tuple`, где первый элемент — это список с сгенерированными изображениями.

Функция вызова конвейера для генерации.

Пример:

```py
>>> from diffusers import DiffusionPipeline

>>> # load model and scheduler
>>> ldm = DiffusionPipeline.from_pretrained("CompVis/ldm-text2im-large-256")

>>> # run pipeline in inference (sample random noise and denoise)
>>> prompt = "A painting of a squirrel eating a burger"
>>> images = ldm([prompt], num_inference_steps=50, eta=0.3, guidance_scale=6).images

>>> # save images
>>> for idx, image in enumerate(images):
...     image.save(f"squirrel-{idx}.png")
```

## LDMSuperResolutionPipeline[[diffusers.LDMSuperResolutionPipeline]]

#### diffusers.LDMSuperResolutionPipeline[[diffusers.LDMSuperResolutionPipeline]]

```python
diffusers.LDMSuperResolutionPipeline(vqvae: VQModel, unet: UNet2DModel, scheduler: diffusers.schedulers.scheduling_ddim.DDIMScheduler | diffusers.schedulers.scheduling_pndm.PNDMScheduler | diffusers.utils.dummy_torch_and_scipy_objects.LMSDiscreteScheduler | diffusers.schedulers.scheduling_euler_discrete.EulerDiscreteScheduler | diffusers.schedulers.scheduling_euler_ancestral_discrete.EulerAncestralDiscreteScheduler | diffusers.schedulers.scheduling_dpmsolver_multistep.DPMSolverMultistepScheduler)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion_superresolution.py#L39)

**Параметры:**

vqvae ([VQModel](/docs/diffusers/main/ru/api/models/vq#diffusers.VQModel)) : векторно-квантованная (VQ) модель для кодирования изображений в латентные представления и декодирования из них.

unet ([UNet2DModel](/docs/diffusers/main/ru/api/models/unet2d#diffusers.UNet2DModel)) : модель `UNet2DModel` для удаления шума из закодированного изображения.

scheduler ([SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `unet` для удаления шума из закодированных латентных представлений изображения. Может быть одним из [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler), [EulerDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/euler#diffusers.EulerDiscreteScheduler), [EulerAncestralDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler), [DPMSolverMultistepScheduler](/docs/diffusers/main/ru/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler) или [PNDMScheduler](/docs/diffusers/main/ru/api/schedulers/pndm#diffusers.PNDMScheduler).

Конвейер для супер-разрешения изображений с использованием латентного диффузионного процесса.

Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса.

#### __call__[[diffusers.LDMSuperResolutionPipeline.__call__]]

```python
__call__(image: typing.Union[torch.Tensor, PIL.Image.Image] = None, batch_size: int | None = 1, num_inference_steps: int | None = 100, eta: float | None = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, output_type: str | None = 'pil', return_dict: bool = True)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion_superresolution.py#L71)

**Параметры:**

image (`torch.Tensor` или `PIL.Image.Image`) : `Image` или тензор, представляющий пакет изображений, который будет использоваться как отправная точка для процесса.

batch_size (`int`, *необязательный*, по умолчанию 1) : Количество изображений для генерации.

num_inference_steps (`int`, *optional*, по умолчанию 100) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к изображению более высокого качества, но за счёт более медленного вывода.

eta (`float`, *необязательный*, по умолчанию 0.0) : Соответствует параметру eta (η) из статьи [DDIM](https://huggingface.co/papers/2010.02502). Применяется только к [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler) и игнорируется другими планировщиками.

generator (`torch.Generator` или `list[torch.Generator]`, *необязательно*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации.

output_type (`str`, *необязательный*, по умолчанию `"pil"`) : Формат вывода сгенерированного изображения. Выберите один из вариантов: `"pil"` (`PIL.Image`), `"np"` (`np.array`) или `"pt"` (`torch.Tensor`).

return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли [ImagePipelineOutput](/docs/diffusers/main/ru/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) вместо обычного кортежа.

**Возвращает:** [ImagePipelineOutput](/docs/diffusers/main/ru/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) или `tuple`

Если `return_dict` равно `True`, возвращается [ImagePipelineOutput](/docs/diffusers/main/ru/api/pipelines/consistency_models#diffusers.ImagePipelineOutput), иначе возвращается `tuple`, где первый элемент — это список с сгенерированными изображениями

Функция вызова конвейера для генерации.

Пример:

```py
>>> import requests
>>> from PIL import Image
>>> from io import BytesIO
>>> from diffusers import LDMSuperResolutionPipeline
>>> import torch

>>> # load model and scheduler
>>> pipeline = LDMSuperResolutionPipeline.from_pretrained("CompVis/ldm-super-resolution-4x-openimages")
>>> pipeline = pipeline.to("cuda")

>>> # let's download an  image
>>> url = (
...     "https://user-images.githubusercontent.com/38061659/199705896-b48e17b8-b231-47cd-a270-4ffa5a93fa3e.png"
... )
>>> response = requests.get(url)
>>> low_res_img = Image.open(BytesIO(response.content)).convert("RGB")
>>> low_res_img = low_res_img.resize((128, 128))

>>> # run pipeline in inference (sample random noise and denoise)
>>> upscaled_image = pipeline(low_res_img, num_inference_steps=100, eta=1).images[0]
>>> # save image
>>> upscaled_image.save("ldm_generated_image.png")
```

## ImagePipelineOutput[[diffusers.ImagePipelineOutput]]

#### diffusers.ImagePipelineOutput[[diffusers.ImagePipelineOutput]]

```python
diffusers.ImagePipelineOutput(images: list[PIL.Image.Image] | numpy.ndarray)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/pipeline_utils.py#L135)

**Параметры:**

images (`List[PIL.Image.Image]` или `np.ndarray`) : Список денойзированных изображений PIL длиной `batch_size` или массив NumPy формы `(batch_size, height, width, num_channels)`.

Класс вывода для пайплайнов обработки изображений.

