Diffusers documentation
Latent Diffusion
Latent Diffusion
Latent Diffusion diusulkan dalam High-Resolution Image Synthesis with Latent Diffusion Models oleh Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, Björn Ommer.
Abstrak dari makalah tersebut adalah:
Dengan menguraikan proses pembentukan gambar menjadi penerapan berurutan dari autoencoder denoising, model difusi (DM) mencapai hasil sintesis state-of-the-art pada data gambar dan di luar itu. Selain itu, formulasi mereka memungkinkan mekanisme panduan untuk mengendalikan proses generasi gambar tanpa pelatihan ulang. Namun, karena model-model ini biasanya beroperasi langsung di ruang piksel, optimasi DM yang kuat sering kali mengonsumsi ratusan hari GPU dan inferensi menjadi mahal karena evaluasi berurutan. Untuk memungkinkan pelatihan DM pada sumber daya komputasi yang terbatas sambil mempertahankan kualitas dan fleksibilitas mereka, kami menerapkannya di ruang laten dari autoencoder pretrained yang kuat. Berbeda dengan pekerjaan sebelumnya, pelatihan model difusi pada representasi semacam itu untuk pertama kalinya memungkinkan pencapaian titik yang hampir optimal antara reduksi kompleksitas dan preservasi detail, yang sangat meningkatkan fidelitas visual. Dengan memperkenalkan lapisan cross-attention ke dalam arsitektur model, kami mengubah model difusi menjadi generator yang kuat dan fleksibel untuk input kondisioning umum seperti teks atau bounding box, dan sintesis resolusi tinggi menjadi mungkin secara konvolusional. Model difusi laten (LDM) kami mencapai state of the art baru untuk inpainting gambar dan kinerja yang sangat kompetitif pada berbagai tugas, termasuk generasi gambar tanpa syarat, sintesis adegan semantik, dan super-resolution, sambil secara signifikan mengurangi persyaratan komputasi dibandingkan DM berbasis piksel.
Kodebase asli dapat ditemukan di CompVis/latent-diffusion.
Pastikan untuk melihat panduan Schedulers untuk mempelajari cara mengeksplorasi tradeoff antara kecepatan dan kualitas scheduler, serta lihat bagian reuse components across pipelines untuk mempelajari cara memuat komponen yang sama secara efisien ke dalam beberapa pipeline.
LDMTextToImagePipeline
kelas 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 )
Parameter
- vqvae (VQModel) — Model kuantisasi vektor (VQ) untuk mengodekan dan mendekodekan gambar ke dan dari representasi laten.
- bert (
LDMBertModel) — Model text-encoder yang berbasisBERT. - tokenizer (BertTokenizer) —
BertTokenizeruntuk melakukan tokenisasi teks. - unet (UNet2DConditionModel) —
UNet2DConditionModeluntuk menghilangkan noise pada latens gambar yang telah dienkod. - scheduler (SchedulerMixin) —
Scheduler yang digunakan bersama dengan
unetuntuk menghilangkan noise pada latens gambar yang telah dikodekan. Bisa berupa salah satu dari DDIMScheduler, LMSDiscreteScheduler, atau PNDMScheduler.
Pipeline untuk generasi teks-ke-gambar menggunakan difusi laten.
Model ini mewarisi dari DiffusionPipeline. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.).
__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
Parameter
- prompt (
strataulist[str]) — Prompt atau kumpulan prompt untuk mengarahkan generasi gambar. - height (
int, opsional, defaultnyaself.unet.config.sample_size * self.vae_scale_factor) — Tinggi gambar yang dihasilkan dalam piksel. - width (
int, opsional, defaultself.unet.config.sample_size * self.vae_scale_factor) — Lebar gambar yang dihasilkan dalam piksel. - num_inference_steps (
int, opsional, default 50) — Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat. - guidance_scale (
float, opsional, default 1.0) — Nilai guidance scale yang lebih tinggi mendorong model untuk menghasilkan gambar yang sangat terkait denganpromptteks, dengan mengorbankan kualitas gambar yang lebih rendah. Guidance scale diaktifkan ketikaguidance_scale > 1. - eta (
float, opsional, default 0.0) — Bersesuaian dengan parameter eta (η) dari paper DDIM. Hanya berlaku untuk DDIMScheduler, dan diabaikan pada scheduler lainnya. - generator (
torch.Generator, opsional) —torch.Generatoruntuk membuat generasi menjadi deterministik. - latents (
torch.Tensor, opsional) — Latents berisik yang telah dibuat sebelumnya dan diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi gambar. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor latents akan dibuat dengan pengambilan sampel menggunakangeneratoracak yang diberikan. - output_type (
str, opsional, defaultnya"pil") — Format output dari gambar yang dihasilkan. Pilih antara"pil"(PIL.Image),"np"(np.array) atau"pt"(torch.Tensor). - return_dict (
bool, opsional, defaultnyaTrue) — Apakah akan mengembalikan ImagePipelineOutput alih-alih tuple biasa.
Mengembalikan
ImagePipelineOutput atau tuple
Jika return_dict adalah True, ImagePipelineOutput dikembalikan, selain itu sebuah tuple dikembalikan di mana elemen pertama adalah daftar dengan gambar yang dihasilkan.
Fungsi panggilan untuk pipeline pada generasi.
Contoh:
>>> 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
kelas 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 )
Parameter
- vqvae (VQModel) — Model kuantisasi vektor (VQ) untuk mengodekan dan mendekodekan gambar ke dan dari representasi laten.
- unet (UNet2DModel) —
UNet2DModeluntuk menghilangkan noise dari gambar yang telah di-encode. - scheduler (SchedulerMixin) —
Scheduler yang digunakan bersama dengan
unetuntuk menghilangkan noise pada latens gambar yang telah dienkod. Bisa berupa salah satu dari DDIMScheduler, LMSDiscreteScheduler, EulerDiscreteScheduler, EulerAncestralDiscreteScheduler, DPMSolverMultistepScheduler, atau PNDMScheduler.
Pipeline untuk super-resolusi gambar menggunakan difusi laten.
Model ini mewarisi dari DiffusionPipeline. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.).
__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
Parameter
- image (
torch.TensoratauPIL.Image.Image) —Imageatau tensor yang mewakili batch gambar untuk digunakan sebagai titik awal proses. - batch_size (
int, opsional, default 1) — Jumlah gambar yang akan dihasilkan. - num_inference_steps (
int, opsional, default 100) — Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat. - eta (
float, opsional, default 0.0) — Bersesuaian dengan parameter eta (η) dari paper DDIM. Hanya berlaku untuk DDIMScheduler, dan diabaikan pada scheduler lainnya. - generator (
torch.Generatorataulist[torch.Generator], opsional) —torch.Generatoruntuk membuat generasi menjadi deterministik. - output_type (
str, opsional, defaultnya"pil") — Format output dari gambar yang dihasilkan. Pilih antara"pil"(PIL.Image),"np"(np.array) atau"pt"(torch.Tensor). - return_dict (
bool, opsional, defaultnyaTrue) — Apakah akan mengembalikan ImagePipelineOutput alih-alih tuple biasa.
Mengembalikan
ImagePipelineOutput atau tuple
Jika return_dict adalah True, ImagePipelineOutput dikembalikan, selain itu sebuah tuple dikembalikan di mana elemen pertama adalah daftar dengan gambar yang dihasilkan
Fungsi panggilan untuk pipeline pada generasi.
Contoh:
>>> 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
kelas diffusers.ImagePipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarray )
Kelas output untuk pipeline gambar.