Diffusers documentation
Latent Diffusion
Latent Diffusion
Latent Diffusion được đề xuất trong High-Resolution Image Synthesis with Latent Diffusion Models 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.
Hãy chắc chắn xem qua hướng dẫn 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 để 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
lớp diffusers.LDMTextToImagePipeline
< source >( vqvae: diffusers.models.autoencoders.vq_model.VQModel | diffusers.models.autoencoders.autoencoder_kl.AutoencoderKLbert: PreTrainedModeltokenizer: PythonBackendunet: diffusers.models.unets.unet_2d.UNet2DModel | diffusers.models.unets.unet_2d_condition.UNet2DConditionModelscheduler: diffusers.schedulers.scheduling_ddim.DDIMScheduler | diffusers.schedulers.scheduling_pndm.PNDMScheduler | diffusers.utils.dummy_torch_and_scipy_objects.LMSDiscreteScheduler )
Tham số
- vqvae (VQModel) — Mô hình vector-quantized (VQ) để mã hóa và giải mã ả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ênBERT. - tokenizer (BertTokenizer) —
Một
BertTokenizerđể phân tách văn bản. - unet (UNet2DConditionModel) —
Một
UNet2DConditionModelđể khử nhiễu các latents ảnh đã mã hóa. - scheduler (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, LMSDiscreteScheduler, hoặc 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. 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__
< source >( prompt: str | list[str]height: int | None = Nonewidth: int | None = Nonenum_inference_steps: int | None = 50guidance_scale: float | None = 1.0eta: float | None = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = True**kwargs ) → ImagePipelineOutput or tuple
Tham số
- prompt (
strhoặclist[str]) — Prompt hoặc các prompt để định hướng 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) — Chiều rộng của hình ảnh được tạo ra, tính bằng pixel. - num_inference_steps (
int, tùy chọn, 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 chi phí là suy luận chậm hơn. - guidance_scale (
float, tùy chọn, 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ớipromptvă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 khiguidance_scale > 1. - eta (
float, tùy chọn, mặc định là 0.0) — Tương ứng với tham số eta (η) trong bài báo DDIM. Chỉ áp dụng cho DDIMScheduler và bị bỏ qua ở các scheduler khác. - generator (
torch.Generator, tùy chọn) — Mộttorch.Generatorđể làm cho quá trình sinh ra kết quả xác đị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ụnggeneratorngẫ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 thay vì một tuple thông thường hay không.
Trả về
ImagePipelineOutput hoặc tuple
Nếu return_dict là True, 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ụ:
>>> 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
lớp diffusers.LDMSuperResolutionPipeline
< source >( vqvae: VQModelunet: UNet2DModelscheduler: 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 )
Tham số
- vqvae (VQModel) — Mô hình vector-quantized (VQ) để mã hóa và giải mã ảnh từ và sang các biểu diễn ẩn.
- unet (UNet2DModel) —
Một
UNet2DModelđể khử nhiễu ảnh đã mã hóa. - scheduler (SchedulerMixin) —
Một scheduler đượ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, LMSDiscreteScheduler, EulerDiscreteScheduler, EulerAncestralDiscreteScheduler, DPMSolverMultistepScheduler, hoặc 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. 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__
< source >( image: typing.Union[torch.Tensor, PIL.Image.Image] = Nonebatch_size: int | None = 1num_inference_steps: int | None = 100eta: float | None = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Noneoutput_type: str | None = 'pil'return_dict: bool = True ) → ImagePipelineOutput or tuple
Tham số
- image (
torch.TensorhoặcPIL.Image.Image) —Imagehoặc tensor đại diện cho một lô ảnh sẽ được sử dụng làm điểm khởi đầu cho quy trình. - batch_size (
int, tùy chọn, mặc định là 1) — Số lượng hình ảnh cần tạo. - num_inference_steps (
int, tùy chọn, 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 chi phí là suy luận chậm hơn. - eta (
float, tùy chọn, mặc định là 0.0) — Tương ứng với tham số eta (η) trong bài báo DDIM. Chỉ áp dụng cho DDIMScheduler và bị bỏ qua ở các scheduler khác. - generator (
torch.Generatorhoặclist[torch.Generator], tùy chọn) — Mộttorch.Generatorđể làm cho quá trình sinh ra kết quả xác đị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 thay vì một tuple thông thường hay không.
Trả về
ImagePipelineOutput hoặc tuple
Nếu return_dict là True, 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ụ:
>>> 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
lớp diffusers.ImagePipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarray )
Lớp đầu ra cho các pipeline hình ảnh.