Diffusers documentation

Stable unCLIP

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Stable unCLIP

LoRA

Các checkpoint Stable unCLIP được tinh chỉnh từ các checkpoint Stable Diffusion 2.1 để điều kiện hóa dựa trên các embedding ảnh CLIP. Stable unCLIP vẫn điều kiện hóa dựa trên các embedding văn bản. Với hai điều kiện hóa riêng biệt, stable unCLIP có thể được sử dụng cho việc biến đổi ảnh có hướng dẫn bằng văn bản. Khi kết hợp với một prior unCLIP, nó cũng có thể được sử dụng cho việc tạo ảnh từ văn bản hoàn chỉnh.

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

Các mô hình tương phản như CLIP đã được chứng minh là có khả năng học các biểu diễn hình ảnh mạnh mẽ, nắm bắt được cả ngữ nghĩa lẫn phong cách. Để tận dụng các biểu diễn này cho việc tạo hình ảnh, chúng tôi đề xuất một mô hình hai giai đoạn: một mô hình tiên nghiệm (prior) tạo ra vector nhúng (embedding) hình ảnh CLIP dựa trên mô tả văn bản, và một bộ giải mã (decoder) tạo ra hình ảnh có điều kiện dựa trên vector nhúng hình ảnh đó. Chúng tôi cho thấy việc tạo ra các biểu diễn hình ảnh một cách tường minh giúp cải thiện tính đa dạng của hình ảnh với mức giảm thiểu về độ chân thực và độ tương đồng với mô tả. Các bộ giải mã của chúng tôi, có điều kiện dựa trên các biểu diễn hình ảnh, cũng có thể tạo ra các biến thể của một hình ảnh, giữ nguyên cả ngữ nghĩa lẫn phong cách của nó, trong khi thay đổi các chi tiết không thiết yếu không có trong biểu diễn hình ảnh. Hơn nữa, không gian nhúng chung của CLIP cho phép thao tác hình ảnh theo hướng dẫn ngôn ngữ theo cách zero-shot. Chúng tôi sử dụng mô hình khuếch tán (diffusion model) cho bộ giải mã và thử nghiệm cả mô hình tự hồi quy (autoregressive) lẫn mô hình khuếch tán cho mô hình tiên nghiệm, và nhận thấy rằng nhóm mô hình khuếch tán hiệu quả hơn về mặt tính toán và tạo ra các mẫu có chất lượng cao hơn.

Mẹo

Stable unCLIP nhận noise_level làm đầu vào trong quá trình suy luận, quyết định lượng nhiễu được thêm vào các embedding ảnh. noise_level cao hơn sẽ làm tăng sự biến đổi trong các ảnh cuối cùng sau khi khử nhiễu. Mặc định, chúng tôi không thêm bất kỳ nhiễu bổ sung nào vào các embedding ảnh (noise_level = 0).

Tạo hình ảnh từ văn bản

Stable unCLIP có thể được tận dụng cho việc tạo ảnh từ văn bản bằng cách kết hợp nó với mô hình prior của bản sao mã nguồn mở DALL-E 2 của KakaoBrain Karlo:

import torch
from diffusers import UnCLIPScheduler, DDPMScheduler, StableUnCLIPPipeline
from diffusers.models import PriorTransformer
from transformers import CLIPTokenizer, CLIPTextModelWithProjection

prior_model_id = "kakaobrain/karlo-v1-alpha"
data_type = torch.float16
prior = PriorTransformer.from_pretrained(prior_model_id, subfolder="prior", dtype=data_type)

prior_text_model_id = "openai/clip-vit-large-patch14"
prior_tokenizer = CLIPTokenizer.from_pretrained(prior_text_model_id)
prior_text_model = CLIPTextModelWithProjection.from_pretrained(prior_text_model_id, dtype=data_type)
prior_scheduler = UnCLIPScheduler.from_pretrained(prior_model_id, subfolder="prior_scheduler")
prior_scheduler = DDPMScheduler.from_config(prior_scheduler.config)

stable_unclip_model_id = "stabilityai/stable-diffusion-2-1-unclip-small"

pipe = StableUnCLIPPipeline.from_pretrained(
    stable_unclip_model_id,
    dtype=data_type,
    variant="fp16",
    prior_tokenizer=prior_tokenizer,
    prior_text_encoder=prior_text_model,
    prior=prior,
    prior_scheduler=prior_scheduler,
)

pipe = pipe.to("cuda")  # or "mps", "xpu", "cpu"
wave_prompt = "dramatic wave, the Oceans roar, Strong wave spiral across the oceans as the waves unfurl into roaring crests; perfect wave form; perfect wave shape; dramatic wave shape; wave shape unbelievable; wave; wave shape spectacular"

image = pipe(prompt=wave_prompt).images[0]
image

Đối với text-to-image, chúng tôi sử dụng stabilityai/stable-diffusion-2-1-unclip-small vì nó được huấn luyện trên embedding CLIP ViT-L/14, giống với prior của mô hình Karlo. stabilityai/stable-diffusion-2-1-unclip được huấn luyện trên OpenCLIP ViT-H, vì vậy chúng tôi không khuyến nghị sử dụng nó.

Biến thể Image-to-Image có hướng dẫn bằng văn bản

from diffusers import StableUnCLIPImg2ImgPipeline
from diffusers.utils import load_image
import torch

pipe = StableUnCLIPImg2ImgPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-1-unclip", dtype=torch.float16, variation="fp16"
)
pipe = pipe.to("cuda")  # or "mps", "xpu", "cpu"

url = "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/tarsila_do_amaral.png"
init_image = load_image(url)

images = pipe(init_image).images
images[0].save("variation_image.png")

Tùy chọn, bạn cũng có thể truyền một prompt vào pipe như sau:

prompt = "A fantasy landscape, trending on artstation"

image = pipe(init_image, prompt=prompt).images[0]
image

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ả.

StableUnCLIPPipeline

lớp diffusers.StableUnCLIPPipeline

< >

( prior_tokenizer: CLIPTokenizerprior_text_encoder: CLIPTextModelWithProjectionprior: PriorTransformerprior_scheduler: KarrasDiffusionSchedulersimage_normalizer: StableUnCLIPImageNormalizerimage_noising_scheduler: KarrasDiffusionSchedulerstokenizer: CLIPTokenizertext_encoder: CLIPTextModelunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersvae: AutoencoderKL )

Tham số

  • prior_tokenizer (CLIPTokenizer) — A CLIPTokenizer.
  • prior_text_encoder (CLIPTextModelWithProjection) — Bộ mã hóa văn bản CLIPTextModelWithProjection được đóng băng.
  • prior (PriorTransformer) — Prior chuẩn của unCLIP để xấp xỉ embedding ảnh từ embedding văn bản.
  • prior_scheduler (KarrasDiffusionSchedulers) — Trình lập lịch được sử dụng trong quá trình khử nhiễu trước đó.
  • image_normalizer (StableUnCLIPImageNormalizer) — Được dùng để chuẩn hóa các embedding ảnh dự đoán trước khi áp dụng nhiễu và khử chuẩn hóa các embedding ảnh sau khi nhiễu đã được áp dụng.
  • image_noising_scheduler (KarrasDiffusionSchedulers) — Lịch trình nhiễu để thêm nhiễu vào các embedding ảnh dự đoán. Lượng nhiễu cần thêm được xác định bởi noise_level.
  • tokenizer (CLIPTokenizer) — A CLIPTokenizer.
  • text_encoder (CLIPTextModel) — Bộ mã hóa văn bản CLIPTextModel được đóng băng.
  • unet (UNet2DConditionModel) — Một UNet2DConditionModel để khử nhiễu các latents ảnh đã mã hóa.
  • scheduler (KarrasDiffusionSchedulers) — 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.
  • vae (AutoencoderKL) — Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã hình ảnh từ và sang các biểu diễn ẩn.

Pipeline để tạo ảnh từ văn bản sử dụng stable unCLIP.

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

Pipeline cũng kế thừa các phương thức nạp sau:

__call__

< >

( prompt: str | list[str] | None = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 20guidance_scale: float = 10.0negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1eta: float = 0.0generator: typing.Optional[torch.Generator] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = Nonecallback_steps: int = 1cross_attention_kwargs: dict[str, typing.Any] | None = Nonenoise_level: int = 0prior_num_inference_steps: int = 25prior_guidance_scale: float = 4.0prior_latents: typing.Optional[torch.Tensor] = Noneclip_skip: int | None = None ) → ImagePipelineOutput or tuple

Tham số

  • prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt để định hướng việc tạo ảnh. Nếu không được định nghĩa, bạn cần truyền prompt_embeds.
  • 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à 20) — 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à 10.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.
  • negative_prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt để hướng dẫn những gì không nên bao gồm trong quá trình tạo ảnh. Nếu không được định nghĩa, bạn cần truyền negative_prompt_embeds thay thế. Bỏ qua khi không sử dụng guidance (guidance_scale < 1).
  • num_images_per_prompt (int, tùy chọn, mặc định là 1) — Số lượng hình ảnh cần tạo cho mỗi prompt.
  • 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 hoặc list[torch.Generator], tùy chọn) — Một torch.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ụng generator ngẫu nhiên được cung cấp.
  • prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản (trọng số prompt). Nếu không được cung cấp, các embedding văn bản sẽ được tạo từ đối số đầu vào prompt.
  • negative_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản (trọng số prompt). Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • 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.Image hoặc np.array.
  • 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.
  • callback (Callable, tùy chọn) — Một hàm được gọi mỗi callback_steps bước trong quá trình suy luận. Hàm này được gọi với các đối số sau: callback(step: int, timestep: int, latents: torch.Tensor).
  • callback_steps (int, tùy chọn, mặc định là 1) — Tần suất gọi hàm callback. Nếu không được chỉ định, callback sẽ được gọi ở mỗi bước.
  • cross_attention_kwargs (dict, tùy chọn) — Một từ điển kwargs, nếu được chỉ định, sẽ được truyền đến AttentionProcessor như đã định nghĩa trong self.processor.
  • noise_level (int, tùy chọn, mặc định là 0) — Mức độ nhiễu cần thêm vào các embedding của ảnh. Giá trị noise_level cao hơn sẽ làm tăng phương sai của các ảnh cuối cùng sau khi khử nhiễu. Xem StableUnCLIPPipeline.noise_image_embeddings() để biết thêm chi tiết.
  • prior_num_inference_steps (int, tùy chọn, mặc định là 25) — Số bước khử nhiễu trong quá trình khử nhiễu của prior. Nhiều bước khử 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.
  • prior_guidance_scale (float, tùy chọn, mặc định là 4.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.
  • prior_latents (torch.Tensor, optional) — 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úng ảnh trong quá trình khử nhiễu của prior. Có thể dùng để điều 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.
  • clip_skip (int, tùy chọn) — Số lượng lớp được bỏ qua từ CLIP khi tính toán các embedding của prompt. Giá trị 1 có nghĩa là đầu ra của lớp trước lớp cuối sẽ được sử dụng để tính toán các embedding của prompt.

Trả về

ImagePipelineOutput hoặc tuple

~ pipeline_utils.ImagePipelineOutput nếu return_dict là True, ngược lại là một tuple. Khi trả về một tuple, 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 torch
>>> from diffusers import StableUnCLIPPipeline

>>> pipe = StableUnCLIPPipeline.from_pretrained(
...     "fusing/stable-unclip-2-1-l", torch_dtype=torch.float16
... )  # TODO update model path
>>> pipe = pipe.to("cuda")

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> images = pipe(prompt).images
>>> images[0].save("astronaut_horse.png")

enable_attention_slicing

< >

( slice_size: str | int = 'auto' )

Tham số

  • slice_size (str hoặc int, tùy chọn, mặc định là "auto") — Khi là "auto", đầu vào cho các attention heads sẽ được chia đôi, do đó attention sẽ được tính trong hai bước. Nếu là "max", lượng bộ nhớ được tiết kiệm tối đa bằng cách chỉ chạy một slice tại một thời điểm. Nếu cung cấp một số, số lượng slice sẽ bằng attention_head_dim // slice_size. Trong trường hợp này, attention_head_dim phải là bội số của slice_size.

Bật tính toán chú ý dạng lát cắt. Khi tùy chọn này được bật, module chú ý sẽ chia tensor đầu vào thành các lát cắt để tính toán chú ý qua nhiều bước. Với nhiều hơn một đầu chú ý, phép tính được thực hiện tuần tự trên từng đầu. Điều này hữu ích để tiết kiệm một phần bộ nhớ, đổi lại là sự giảm tốc độ nhỏ.

> ⚠️ Không bật attention slicing nếu bạn đã đang sử dụng scaled_dot_product_attention (SDPA) từ PyTorch > 2.0 hoặc xFormers. Các phép tính attention này đã rất hiệu quả về bộ nhớ nên bạn sẽ không cần bật > chức năng này. Nếu bật attention slicing cùng với SDPA hoặc xFormers, nó có thể gây ra sự giảm tốc độ nghiêm trọng!

Ví dụ:

>>> import torch
>>> from diffusers import StableDiffusionPipeline

>>> pipe = StableDiffusionPipeline.from_pretrained(
...     "stable-diffusion-v1-5/stable-diffusion-v1-5",
...     dtype=torch.float16,
...     use_safetensors=True,
... )

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]

disable_attention_slicing

< >

( )

Tắt tính toán chú ý dạng lát cắt. Nếu enable_attention_slicing đã được gọi trước đó, chú ý sẽ được tính toán trong một bước duy nhất.

enable_xformers_memory_efficient_attention

< >

( attention_op: typing.Optional[typing.Callable] = None )

Tham số

  • attention_op (Callable, tùy chọn) — Ghi đè toán tử mặc định None để sử dụng làm đối số op cho hàm memory_efficient_attention() của xFormers.

Bật chú ý tiết kiệm bộ nhớ từ xFormers. Khi tùy chọn này được bật, bạn nên quan sát thấy mức sử dụng bộ nhớ GPU thấp hơn và có thể tăng tốc trong quá trình suy luận. Việc tăng tốc trong quá trình huấn luyện không được đảm bảo.

> ⚠️ Khi cả memory efficient attention và sliced attention đều được bật, memory efficient attention sẽ có > ưu tiên.

Ví dụ:

>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)

disable_xformers_memory_efficient_attention

< >

( )

Tắt chú ý tiết kiệm bộ nhớ từ xFormers.

encode_prompt

< >

( promptdevicenum_images_per_promptdo_classifier_free_guidancenegative_prompt = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonelora_scale: float | None = Noneclip_skip: int | None = None )

Tham số

  • prompt (str hoặc list[str], tùy chọn) — prompt cần được mã hóa
  • device — (torch.device): thiết bị torch
  • num_images_per_prompt (int) — số lượng hình ảnh cần được tạo cho mỗi prompt
  • do_classifier_free_guidance (bool) — có sử dụng classifier free guidance hay không
  • negative_prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt không dùng để định hướng việc tạo ảnh. Nếu không được định nghĩa, cần truyền negative_prompt_embeds thay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu guidance_scale nhỏ hơn 1).
  • prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản sẽ được tạo từ đối số đầu vào prompt.
  • negative_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • lora_scale (float, tùy chọn) — Thang LoRA sẽ được áp dụng cho tất cả các lớp LoRA của text encoder nếu các lớp LoRA được nạp.
  • clip_skip (int, tùy chọn) — Số lượng lớp được bỏ qua từ CLIP khi tính toán các embedding của prompt. Giá trị 1 có nghĩa là đầu ra của lớp trước lớp cuối sẽ được sử dụng để tính toán các embedding của prompt.

Mã hóa prompt thành các trạng thái ẩn của text encoder.

noise_image_embeddings

< >

( image_embeds: Tensornoise_level: intnoise: typing.Optional[torch.Tensor] = Nonegenerator: typing.Optional[torch.Generator] = None )

Thêm nhiễu vào các embedding của ảnh. Lượng nhiễu được điều khiển bởi đầu vào noise_level. noise_level cao hơn sẽ làm tăng phương sai của các ảnh cuối cùng sau khi khử nhiễu.

Tiếng ồn được áp dụng theo hai cách:

  1. Một lịch nhiễu được áp dụng trực tiếp lên các vector nhúng.
  2. Một vector các nhúng thời gian hình sin được nối thêm vào đầu ra.

Trong cả hai trường hợp, lượng nhiễu được kiểm soát bởi cùng một noise_level.

Các embedding được chuẩn hóa trước khi nhiễu được áp dụng và được khử chuẩn hóa sau khi nhiễu được áp dụng.

StableUnCLIPImg2ImgPipeline

lớp diffusers.StableUnCLIPImg2ImgPipeline

< >

( feature_extractor: CLIPImageProcessorPilimage_encoder: CLIPVisionModelWithProjectionimage_normalizer: StableUnCLIPImageNormalizerimage_noising_scheduler: KarrasDiffusionSchedulerstokenizer: CLIPTokenizertext_encoder: CLIPTextModelunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersvae: AutoencoderKL )

Tham số

  • feature_extractor (CLIPImageProcessor) — Bộ trích xuất đặc trưng để tiền xử lý ảnh trước khi được mã hóa.
  • image_encoder (CLIPVisionModelWithProjection) — Mô hình thị giác CLIP để mã hóa hình ảnh.
  • image_normalizer (StableUnCLIPImageNormalizer) — Được dùng để chuẩn hóa các embedding ảnh dự đoán trước khi áp dụng nhiễu và khử chuẩn hóa các embedding ảnh sau khi nhiễu đã được áp dụng.
  • image_noising_scheduler (KarrasDiffusionSchedulers) — Lịch trình nhiễu để thêm nhiễu vào các embedding ảnh dự đoán. Lượng nhiễu cần thêm được xác định bởi noise_level.
  • tokenizer (~transformers.CLIPTokenizer) — A [~transformers.CLIPTokenizer)].
  • text_encoder (CLIPTextModel) — Bộ mã hóa văn bản CLIPTextModel được đóng băng.
  • unet (UNet2DConditionModel) — Một UNet2DConditionModel để khử nhiễu các latents ảnh đã mã hóa.
  • scheduler (KarrasDiffusionSchedulers) — 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.
  • vae (AutoencoderKL) — Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã hình ảnh từ và sang các biểu diễn ẩn.

Pipeline cho việc tạo ảnh từ ảnh có hướng dẫn bằng văn bản sử dụng stable unCLIP.

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

Pipeline cũng kế thừa các phương thức nạp sau:

__call__

< >

( image: typing.Union[torch.Tensor, PIL.Image.Image] = Noneprompt: str | list[str] = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 20guidance_scale: float = 10negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1eta: float = 0.0generator: typing.Optional[torch.Generator] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = Nonecallback_steps: int = 1cross_attention_kwargs: dict[str, typing.Any] | None = Nonenoise_level: int = 0image_embeds: typing.Optional[torch.Tensor] = Noneclip_skip: int | None = None ) → ImagePipelineOutput or tuple

Tham số

  • prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt để định hướng việc tạo ảnh. Nếu không được định nghĩa, prompt_embeds sẽ được sử dụng hoặc prompt được khởi tạo thành "".
  • image (torch.Tensor hoặc PIL.Image.Image) — Image hoặc tensor đại diện cho một lô ảnh. Ảnh sẽ được mã hóa thành embedding CLIP để điều kiện cho unet. Ảnh không được mã hóa bởi vae rồi dùng làm latents trong quá trình khử nhiễu như trong quy trình biến đổi ảnh có hướng dẫn bằng văn bản của Stable Diffusion tiêu chuẩn.
  • 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à 20) — 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à 10.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.
  • negative_prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt để hướng dẫn những gì không nên bao gồm trong quá trình tạo ảnh. Nếu không được định nghĩa, bạn cần truyền negative_prompt_embeds thay thế. Bỏ qua khi không sử dụng guidance (guidance_scale < 1).
  • num_images_per_prompt (int, tùy chọn, mặc định là 1) — Số lượng hình ảnh cần tạo cho mỗi prompt.
  • 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 hoặc list[torch.Generator], tùy chọn) — Một torch.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ụng generator ngẫu nhiên được cung cấp.
  • prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản (trọng số prompt). Nếu không được cung cấp, các embedding văn bản sẽ được tạo từ đối số đầu vào prompt.
  • negative_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản (trọng số prompt). Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • 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.Image hoặc np.array.
  • 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.
  • callback (Callable, tùy chọn) — Một hàm được gọi mỗi callback_steps bước trong quá trình suy luận. Hàm này được gọi với các đối số sau: callback(step: int, timestep: int, latents: torch.Tensor).
  • callback_steps (int, tùy chọn, mặc định là 1) — Tần suất gọi hàm callback. Nếu không được chỉ định, callback sẽ được gọi ở mỗi bước.
  • cross_attention_kwargs (dict, tùy chọn) — Một từ điển kwargs, nếu được chỉ định, sẽ được truyền đến AttentionProcessor như đã định nghĩa trong self.processor.
  • noise_level (int, tùy chọn, mặc định là 0) — Mức độ nhiễu cần thêm vào các embedding của ảnh. Giá trị noise_level cao hơn sẽ làm tăng phương sai của các ảnh cuối cùng sau khi khử nhiễu. Xem StableUnCLIPPipeline.noise_image_embeddings() để biết thêm chi tiết.
  • image_embeds (torch.Tensor, tùy chọn) — Các embedding CLIP được tạo trước để điều kiện hóa unet. Các latent này không được sử dụng trong quá trình khử nhiễu. Nếu bạn muốn cung cấp các latent được tạo trước, hãy truyền chúng vào __call__ dưới dạng latents.
  • clip_skip (int, tùy chọn) — Số lượng lớp được bỏ qua từ CLIP khi tính toán các embedding của prompt. Giá trị 1 có nghĩa là đầu ra của lớp trước lớp cuối sẽ được sử dụng để tính toán các embedding của prompt.

Trả về

ImagePipelineOutput hoặc tuple

~ pipeline_utils.ImagePipelineOutput nếu return_dict là True, ngược lại là một tuple. Khi trả về một tuple, 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
>>> import torch
>>> from PIL import Image
>>> from io import BytesIO

>>> from diffusers import StableUnCLIPImg2ImgPipeline

>>> pipe = StableUnCLIPImg2ImgPipeline.from_pretrained(
...     "stabilityai/stable-diffusion-2-1-unclip-small", torch_dtype=torch.float16
... )
>>> pipe = pipe.to("cuda")

>>> url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg"

>>> response = requests.get(url)
>>> init_image = Image.open(BytesIO(response.content)).convert("RGB")
>>> init_image = init_image.resize((768, 512))

>>> prompt = "A fantasy landscape, trending on artstation"

>>> images = pipe(init_image, prompt).images
>>> images[0].save("fantasy_landscape.png")

enable_attention_slicing

< >

( slice_size: str | int = 'auto' )

Tham số

  • slice_size (str hoặc int, tùy chọn, mặc định là "auto") — Khi là "auto", đầu vào cho các attention heads sẽ được chia đôi, do đó attention sẽ được tính trong hai bước. Nếu là "max", lượng bộ nhớ được tiết kiệm tối đa bằng cách chỉ chạy một slice tại một thời điểm. Nếu cung cấp một số, số lượng slice sẽ bằng attention_head_dim // slice_size. Trong trường hợp này, attention_head_dim phải là bội số của slice_size.

Bật tính toán chú ý dạng lát cắt. Khi tùy chọn này được bật, module chú ý sẽ chia tensor đầu vào thành các lát cắt để tính toán chú ý qua nhiều bước. Với nhiều hơn một đầu chú ý, phép tính được thực hiện tuần tự trên từng đầu. Điều này hữu ích để tiết kiệm một phần bộ nhớ, đổi lại là sự giảm tốc độ nhỏ.

> ⚠️ Không bật attention slicing nếu bạn đã đang sử dụng scaled_dot_product_attention (SDPA) từ PyTorch > 2.0 hoặc xFormers. Các phép tính attention này đã rất hiệu quả về bộ nhớ nên bạn sẽ không cần bật > chức năng này. Nếu bật attention slicing cùng với SDPA hoặc xFormers, nó có thể gây ra sự giảm tốc độ nghiêm trọng!

Ví dụ:

>>> import torch
>>> from diffusers import StableDiffusionPipeline

>>> pipe = StableDiffusionPipeline.from_pretrained(
...     "stable-diffusion-v1-5/stable-diffusion-v1-5",
...     dtype=torch.float16,
...     use_safetensors=True,
... )

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]

disable_attention_slicing

< >

( )

Tắt tính toán chú ý dạng lát cắt. Nếu enable_attention_slicing đã được gọi trước đó, chú ý sẽ được tính toán trong một bước duy nhất.

enable_xformers_memory_efficient_attention

< >

( attention_op: typing.Optional[typing.Callable] = None )

Tham số

  • attention_op (Callable, tùy chọn) — Ghi đè toán tử mặc định None để sử dụng làm đối số op cho hàm memory_efficient_attention() của xFormers.

Bật chú ý tiết kiệm bộ nhớ từ xFormers. Khi tùy chọn này được bật, bạn nên quan sát thấy mức sử dụng bộ nhớ GPU thấp hơn và có thể tăng tốc trong quá trình suy luận. Việc tăng tốc trong quá trình huấn luyện không được đảm bảo.

> ⚠️ Khi cả memory efficient attention và sliced attention đều được bật, memory efficient attention sẽ có > ưu tiên.

Ví dụ:

>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)

disable_xformers_memory_efficient_attention

< >

( )

Tắt chú ý tiết kiệm bộ nhớ từ xFormers.

encode_prompt

< >

( promptdevicenum_images_per_promptdo_classifier_free_guidancenegative_prompt = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonelora_scale: float | None = Noneclip_skip: int | None = None )

Tham số

  • prompt (str hoặc list[str], tùy chọn) — prompt cần được mã hóa
  • device — (torch.device): thiết bị torch
  • num_images_per_prompt (int) — số lượng hình ảnh cần được tạo cho mỗi prompt
  • do_classifier_free_guidance (bool) — có sử dụng classifier free guidance hay không
  • negative_prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt không dùng để định hướng việc tạo ảnh. Nếu không được định nghĩa, cần truyền negative_prompt_embeds thay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu guidance_scale nhỏ hơn 1).
  • prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản sẽ được tạo từ đối số đầu vào prompt.
  • negative_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • lora_scale (float, tùy chọn) — Thang LoRA sẽ được áp dụng cho tất cả các lớp LoRA của text encoder nếu các lớp LoRA được nạp.
  • clip_skip (int, tùy chọn) — Số lượng lớp được bỏ qua từ CLIP khi tính toán các embedding của prompt. Giá trị 1 có nghĩa là đầu ra của lớp trước lớp cuối sẽ được sử dụng để tính toán các embedding của prompt.

Mã hóa prompt thành các trạng thái ẩn của text encoder.

noise_image_embeddings

< >

( image_embeds: Tensornoise_level: intnoise: typing.Optional[torch.Tensor] = Nonegenerator: typing.Optional[torch.Generator] = None )

Thêm nhiễu vào các embedding của ảnh. Lượng nhiễu được điều khiển bởi đầu vào noise_level. noise_level cao hơn sẽ làm tăng phương sai của các ảnh cuối cùng sau khi khử nhiễu.

Tiếng ồn được áp dụng theo hai cách:

  1. Một lịch nhiễu được áp dụng trực tiếp lên các vector nhúng.
  2. Một vector các nhúng thời gian hình sin được nối thêm vào đầu ra.

Trong cả hai trường hợp, lượng nhiễu được kiểm soát bởi cùng một noise_level.

Các embedding được chuẩn hóa trước khi nhiễu được áp dụng và được khử chuẩn hóa sau khi nhiễu được áp dụng.

ImagePipelineOutput

lớp diffusers.ImagePipelineOutput

< >

( images: list[PIL.Image.Image] | numpy.ndarray )

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.

Update on GitHub