Diffusers documentation
Diffusión Latente
Diffusión Latente
Latent Diffusion fue propuesto en High-Resolution Image Synthesis with Latent Diffusion Models por Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, Björn Ommer.
El resumen del artículo es:
Al descomponer el proceso de formación de la imagen en una aplicación secuencial de autoencoders de desruido, los modelos de difusión (DM) logran resultados de síntesis de última generación en datos de imagen y más allá. Además, su formulación permite un mecanismo de guía para controlar el proceso de generación de imágenes sin necesidad de volver a entrenar. Sin embargo, dado que estos modelos suelen operar directamente en el espacio de píxeles, la optimización de DM potentes a menudo consume cientos de días de GPU y la inferencia es costosa debido a las evaluaciones secuenciales. Para permitir el entrenamiento de DM con recursos computacionales limitados manteniendo su calidad y flexibilidad, los aplicamos en el espacio latente de autoencoders preentrenados potentes. A diferencia del trabajo anterior, el entrenamiento de modelos de difusión en dicha representación permite, por primera vez, alcanzar un punto casi óptimo entre la reducción de la complejidad y la preservación del detalle, mejorando enormemente la fidelidad visual. Al introducir capas de atención cruzada en la arquitectura del modelo, convertimos los modelos de difusión en generadores potentes y flexibles para entradas de condicionamiento general, como texto o cajas delimitadoras, y la síntesis de alta resolución se vuelve posible de manera convolucional. Nuestros modelos de difusión latente (LDM) logran un nuevo estado del arte para el relleno de imágenes (inpainting) y un rendimiento altamente competitivo en diversas tareas, incluida la generación de imágenes incondicional, la síntesis de escenas semánticas y la superresolución, reduciendo significativamente los requisitos computacionales en comparación con los DM basados en píxeles.
El código original se puede encontrar en CompVis/latent-diffusion.
Asegúrate de consultar la guía de Schedulers para aprender a explorar el equilibrio entre la velocidad y la calidad del scheduler, y consulta la sección reutilizar componentes entre pipelines para aprender a cargar eficientemente los mismos componentes en múltiples pipelines.
LDMTextToImagePipeline
clase 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 )
Parámetros
- vqvae (VQModel) — Modelo de cuantización vectorial (VQ) para codificar y decodificar imágenes a partir de representaciones latentes.
- bert (
LDMBertModel) — Modelo de codificación de texto basado enBERT. - tokenizer (BertTokenizer) —
Un
BertTokenizerpara tokenizar el texto. - unet (UNet2DConditionModel) —
Un
UNet2DConditionModelpara desruidar los latentes de la imagen codificada. - scheduler (SchedulerMixin) —
Un scheduler para usar en combinación con
unetpara desruidar los latentes de la imagen codificada. Puede ser uno de DDIMScheduler, LMSDiscreteScheduler o PNDMScheduler.
Pipeline para la generación de imágenes a partir de texto mediante difusión latente.
Este modelo hereda de DiffusionPipeline. Consulta la documentación de la clase superior para los métodos genéricos implementados en todas las tuberías (descarga, guardado, ejecución en un dispositivo específico, etc.).
__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
Parámetros
- prompt (
strolist[str]) — El prompt o los prompts para guiar la generación de la imagen. - height (
int, opcional, valor predeterminadoself.unet.config.sample_size * self.vae_scale_factor) — La altura en píxeles de la imagen generada. - width (
int, opcional, valor predeterminadoself.unet.config.sample_size * self.vae_scale_factor) — El ancho en píxeles de la imagen generada. - num_inference_steps (
int, opcional, valor predeterminado 50) — El número de pasos de desruido. Más pasos de desruido suelen conducir a una imagen de mayor calidad a costa de una inferencia más lenta. - guidance_scale (
float, opcional, valor predeterminado 1.0) — Un valor de escala de guía más alto anima al modelo a generar imágenes estrechamente vinculadas al textoprompta costa de una menor calidad de imagen. La escala de guía se habilita cuandoguidance_scale > 1. - eta (
float, opcional, valor predeterminado 0.0) — Corresponde al parámetro eta (η) del artículo DDIM. Solo se aplica al DDIMScheduler y se ignora en otros programadores. - generator (
torch.Generator, opcional) — Untorch.Generatorpara hacer que la generación sea determinista. - latents (
torch.Tensor, opcional) — Latentes ruidosos pregenerados muestreados de una distribución gaussiana, que se utilizarán como entradas para la generación de imágenes. Se pueden usar para ajustar la misma generación con diferentes prompts. Si no se proporciona, se genera un tensor de latentes mediante muestreo usando elgeneratoraleatorio suministrado. - output_type (
str, opcional, valor predeterminado"pil") — El formato de salida de la imagen generada. Elija entre"pil"(PIL.Image),"np"(np.array) o"pt"(torch.Tensor). - return_dict (
bool, opcional, valor predeterminadoTrue) — Indica si se debe devolver un ImagePipelineOutput en lugar de una tupla simple.
Devuelve
ImagePipelineOutput o tuple
Si return_dict es True, se devuelve ImagePipelineOutput; en caso contrario, se devuelve una tuple cuyo primer elemento es una lista con las imágenes generadas.
La función de llamada para el pipeline de generación.
Ejemplo:
>>> 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
clase 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 )
Parámetros
- vqvae (VQModel) — Modelo de cuantización vectorial (VQ) para codificar y decodificar imágenes a partir de representaciones latentes.
- unet (UNet2DModel) —
Un
UNet2DModelpara desruidar la imagen codificada. - scheduler (SchedulerMixin) —
Un scheduler para usar en combinación con
unetpara desruidar los latentes de la imagen codificada. Puede ser uno de DDIMScheduler, LMSDiscreteScheduler, EulerDiscreteScheduler, EulerAncestralDiscreteScheduler, DPMSolverMultistepScheduler o PNDMScheduler.
Un pipeline para super-resolución de imágenes usando difusión latente.
Este modelo hereda de DiffusionPipeline. Consulta la documentación de la clase superior para los métodos genéricos implementados en todas las tuberías (descarga, guardado, ejecución en un dispositivo específico, etc.).
__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
Parámetros
- image (
torch.TensororPIL.Image.Image) —Imageor tensor representing an image batch to be used as the starting point for the process. - batch_size (
int, opcional, valor predeterminado 1) — Número de imágenes a generar. - num_inference_steps (
int, opcional, valor predeterminado 100) — El número de pasos de desruido. Más pasos de desruido suelen conducir a una imagen de mayor calidad a costa de una inferencia más lenta. - eta (
float, opcional, valor predeterminado 0.0) — Corresponde al parámetro eta (η) del artículo DDIM. Solo se aplica al DDIMScheduler y se ignora en otros programadores. - generator (
torch.Generatorolist[torch.Generator], opcional) — Untorch.Generatorpara hacer que la generación sea determinista. - output_type (
str, opcional, valor predeterminado"pil") — El formato de salida de la imagen generada. Elija entre"pil"(PIL.Image),"np"(np.array) o"pt"(torch.Tensor). - return_dict (
bool, opcional, valor predeterminadoTrue) — Indica si se debe devolver un ImagePipelineOutput en lugar de una tupla simple.
Devuelve
ImagePipelineOutput o tuple
Si return_dict es True, se devuelve ImagePipelineOutput; en caso contrario, se devuelve una tuple cuyo primer elemento es una lista con las imágenes generadas
La función de llamada para el pipeline de generación.
Ejemplo:
>>> 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
clase diffusers.ImagePipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarray )
Clase de salida para pipelines de imágenes.