# Latent Diffusion

Latent Diffusion được đề xuất trong [High-Resolution Image Synthesis with Latent Diffusion Models](https://huggingface.co/papers/2112.10752) bởi Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, Björn Ommer.

Tóm tắt từ bài báo là:

*Bằng cách phân rã quá trình hình thành ảnh thành việc áp dụng tuần tự các autoencoder khử nhiễu, các mô hình khuếch tán (DM) đạt được kết quả tổng hợp tiên tiến nhất trên dữ liệu ảnh và cả các lĩnh vực khác. Ngoài ra, cách thức xây dựng của chúng cho phép một cơ chế dẫn hướng để kiểm soát quá trình tạo ảnh mà không cần huấn luyện lại. Tuy nhiên, vì các mô hình này thường hoạt động trực tiếp trong không gian pixel, việc tối ưu hóa các DM mạnh mẽ thường tiêu tốn hàng trăm ngày GPU và suy luận có chi phí cao do các đánh giá tuần tự. Để cho phép huấn luyện DM trên các tài nguyên tính toán hạn chế trong khi vẫn giữ được chất lượng và tính linh hoạt của chúng, chúng tôi áp dụng chúng trong không gian ẩn của các autoencoder được huấn luyện trước mạnh mẽ. Khác với các công trình trước đây, việc huấn luyện mô hình khuếch tán trên một biểu diễn như vậy cho phép lần đầu tiên đạt được một điểm gần tối ưu giữa việc giảm độ phức tạp và bảo toàn chi tiết, từ đó nâng cao đáng kể độ trung thực thị giác. Bằng cách đưa các lớp cross-attention vào kiến trúc mô hình, chúng tôi biến các mô hình khuếch tán thành những bộ tạo ảnh mạnh mẽ và linh hoạt cho các đầu vào điều kiện chung như văn bản hoặc hộp bao (bounding box), và việc tổng hợp độ phân giải cao trở nên khả thi theo cách tích chập. Các mô hình khuếch tán ẩn (LDM) của chúng tôi đạt được trạng thái tiên tiến mới cho việc inpainting ảnh và hiệu suất cạnh tranh cao trên nhiều tác vụ, bao gồm tạo ảnh không điều kiện, tổng hợp cảnh ngữ nghĩa và siêu phân giải, trong khi giảm đáng kể yêu cầu tính toán so với các DM dựa trên pixel.*

Mã nguồn gốc có thể được tìm thấy tại [CompVis/latent-diffusion](https://github.com/CompVis/latent-diffusion).

> [!TIP]
> Hãy chắc chắn xem qua [hướng dẫn](../../using-diffusers/schedulers) về Schedulers để tìm hiểu cách khám phá sự đánh đổi giữa tốc độ và chất lượng của scheduler, và xem phần [tái sử dụng các thành phần giữa các pipeline](../../using-diffusers/loading#reusing-models-in-multiple-pipelines) để tìm hiểu cách nạp các thành phần giống nhau vào nhiều pipeline một cách hiệu quả.

## 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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py#L39)

**Tham số:**

vqvae ([VQModel](/docs/diffusers/main/vi/api/models/vq#diffusers.VQModel)) : Mô hình vector-quantized (VQ) để mã hóa và giải mã hình ảnh từ và sang các biểu diễn ẩn.

bert (`LDMBertModel`) : Mô hình mã hóa văn bản dựa trên `BERT`.

tokenizer ([BertTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/lxmert#transformers.BertTokenizer)) : Một `BertTokenizer` để phân tách văn bản.

unet ([UNet2DConditionModel](/docs/diffusers/main/vi/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : Một `UNet2DConditionModel` để khử nhiễu các latents ảnh đã mã hóa.

scheduler ([SchedulerMixin](/docs/diffusers/main/vi/api/schedulers/overview#diffusers.SchedulerMixin)) : Một scheduler được sử dụng kết hợp với `unet` để khử nhiễu các latents của ảnh đã mã hóa. Có thể là một trong [DDIMScheduler](/docs/diffusers/main/vi/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler), hoặc [PNDMScheduler](/docs/diffusers/main/vi/api/schedulers/pndm#diffusers.PNDMScheduler).

Pipeline để tạo ảnh từ văn bản sử dụng khuếch tán tiềm ẩn.

Mô hình này kế thừa từ [DiffusionPipeline](/docs/diffusers/main/vi/api/pipelines/overview#diffusers.DiffusionPipeline). Xem tài liệu của lớp cha để biết các phương thức chung được triển khai cho tất cả các pipeline (tải xuống, lưu, chạy trên một thiết bị cụ thể, v.v.).

#### __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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py#L74)

**Tham số:**

prompt (`str` hoặc `list[str]`) : Prompt hoặc các prompt để hướng dẫn việc tạo ảnh.

height (`int`, *tùy chọn*, mặc định là `self.unet.config.sample_size * self.vae_scale_factor`) : Chiều cao của hình ảnh được tạo ra, tính bằng pixel.

width (`int`, *tùy chọn*, mặc định là `self.unet.config.sample_size * self.vae_scale_factor`) : Độ rộng tính bằng pixel của hình ảnh được tạo ra.

num_inference_steps (`int`, *optional*, mặc định là 50) : Số bước khử nhiễu. Số bước khử nhiễu nhiều hơn thường dẫn đến hình ảnh có chất lượng cao hơn, với cái giá là suy luận chậm hơn.

guidance_scale (`float`, *optional*, mặc định là 1.0) : Giá trị guidance scale cao hơn khuyến khích mô hình tạo ra các hình ảnh gắn kết chặt chẽ với `prompt` văn bản, với cái giá là chất lượng hình ảnh thấp hơn. Guidance scale được kích hoạt khi `guidance_scale > 1`.

eta (`float`, *tuỳ chọn*, mặc định là 0.0) : Tương ứng với tham số eta (η) trong bài báo [DDIM](https://huggingface.co/papers/2010.02502). Chỉ áp dụng cho [DDIMScheduler](/docs/diffusers/main/vi/api/schedulers/ddim#diffusers.DDIMScheduler) và bị bỏ qua ở các trình lập lịch khác.

generator (`torch.Generator`, *tùy chọn*) : Một [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) để đảm bảo quá trình sinh là tất định.

latents (`torch.Tensor`, *tùy chọn*) : Các latents nhiễu được tạo trước, lấy mẫu từ phân phối Gaussian, dùng làm đầu vào cho việc tạo ảnh. Có thể dùng để tinh chỉnh cùng một quá trình tạo với các prompt khác nhau. Nếu không được cung cấp, một tensor latents sẽ được tạo bằng cách lấy mẫu sử dụng `generator` ngẫu nhiên được cung cấp.

output_type (`str`, *tùy chọn*, mặc định là `"pil"`) : Định dạng đầu ra của hình ảnh được tạo ra. Chọn giữa `"pil"` (`PIL.Image`), `"np"` (`np.array`) hoặc `"pt"` (`torch.Tensor`).

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) thay vì một tuple thông thường hay không.

**Trả về:** [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) hoặc `tuple`

Nếu `return_dict` là `True`, [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) sẽ được trả về, ngược lại một `tuple` sẽ được trả về trong đó phần tử đầu tiên là một danh sách chứa các hình ảnh đã tạo.

Hàm gọi call của pipeline để tạo nội dung.

Ví dụ:

```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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion_superresolution.py#L39)

**Tham số:**

vqvae ([VQModel](/docs/diffusers/main/vi/api/models/vq#diffusers.VQModel)) : Mô hình vector-quantized (VQ) để mã hóa và giải mã hình ảnh từ và sang các biểu diễn ẩn.

unet ([UNet2DModel](/docs/diffusers/main/vi/api/models/unet2d#diffusers.UNet2DModel)) : Một `UNet2DModel` để khử nhiễu ảnh đã mã hóa.

scheduler ([SchedulerMixin](/docs/diffusers/main/vi/api/schedulers/overview#diffusers.SchedulerMixin)) : Một trình lập lịch được sử dụng kết hợp với `unet` để khử nhiễu các latens của ảnh đã mã hóa. Có thể là một trong [DDIMScheduler](/docs/diffusers/main/vi/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler), [EulerDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/euler#diffusers.EulerDiscreteScheduler), [EulerAncestralDiscreteScheduler](/docs/diffusers/main/vi/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler), [DPMSolverMultistepScheduler](/docs/diffusers/main/vi/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler), hoặc [PNDMScheduler](/docs/diffusers/main/vi/api/schedulers/pndm#diffusers.PNDMScheduler).

Một pipeline cho siêu phân giải hình ảnh sử dụng khuếch tán tiềm ẩn.

Mô hình này kế thừa từ [DiffusionPipeline](/docs/diffusers/main/vi/api/pipelines/overview#diffusers.DiffusionPipeline). Xem tài liệu của lớp cha để biết các phương thức chung được triển khai cho tất cả các pipeline (tải xuống, lưu, chạy trên một thiết bị cụ thể, v.v.).

#### __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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion_superresolution.py#L71)

**Tham số:**

image (`torch.Tensor` hoặc `PIL.Image.Image`) : `Image` hoặc tensor đại diện cho một lô ảnh sẽ được sử dụng làm điểm bắt đầu cho quy trình.

batch_size (`int`, *tuỳ chọn*, mặc định là 1) : Số lượng hình ảnh cần tạo.

num_inference_steps (`int`, *optional*, mặc định là 100) : Số bước khử nhiễu. Số bước khử nhiễu nhiều hơn thường dẫn đến hình ảnh có chất lượng cao hơn, với cái giá là suy luận chậm hơn.

eta (`float`, *tuỳ chọn*, mặc định là 0.0) : Tương ứng với tham số eta (η) trong bài báo [DDIM](https://huggingface.co/papers/2010.02502). Chỉ áp dụng cho [DDIMScheduler](/docs/diffusers/main/vi/api/schedulers/ddim#diffusers.DDIMScheduler) và bị bỏ qua ở các trình lập lịch khác.

generator (`torch.Generator` hoặc `list[torch.Generator]`, *tùy chọn*) : Một [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) để đảm bảo quá trình sinh là tất định.

output_type (`str`, *tùy chọn*, mặc định là `"pil"`) : Định dạng đầu ra của hình ảnh được tạo ra. Chọn giữa `"pil"` (`PIL.Image`), `"np"` (`np.array`) hoặc `"pt"` (`torch.Tensor`).

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) thay vì một tuple thông thường hay không.

**Trả về:** [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) hoặc `tuple`

Nếu `return_dict` là `True`, [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) sẽ được trả về, ngược lại một `tuple` sẽ được trả về trong đó phần tử đầu tiên là một danh sách chứa các hình ảnh đã được tạo

Hàm gọi call của pipeline để tạo nội dung.

Ví dụ:

```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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/pipeline_utils.py#L135)

**Tham số:**

images (`List[PIL.Image.Image]` hoặc `np.ndarray`) : Danh sách các hình ảnh PIL đã khử nhiễu có độ dài `batch_size` hoặc mảng NumPy có hình dạng `(batch_size, height, width, num_channels)`.

Lớp đầu ra cho các pipeline hình ảnh.

