Diffusers documentation
Inpainting
Inpainting
Mô hình Stable Diffusion cũng có thể được áp dụng cho inpainting, cho phép bạn chỉnh sửa các phần cụ thể của một hình ảnh bằng cách cung cấp một mask và một text prompt sử dụng Stable Diffusion.
Mẹo
Khuyến nghị sử dụng pipeline này với các checkpoint đã được fine-tune riêng cho inpainting, chẳng hạn như stable-diffusion-v1-5/stable-diffusion-inpainting. Các checkpoint Stable Diffusion text-to-image mặc định, chẳng hạn như stable-diffusion-v1-5/stable-diffusion-v1-5, cũng tương thích nhưng có thể kém hiệu quả hơn.
Hãy chắc chắn xem qua phần Mẹo của Stable Diffusion để tìm hiểu cách khám phá sự đánh đổi giữa tốc độ và chất lượng của scheduler, cũng như cách tái sử dụng các thành phần pipeline một cách hiệu quả!
Nếu bạn quan tâm đến việc sử dụng một trong các checkpoint chính thức cho một tác vụ, hãy khám phá các tổ chức CompVis và Stability AI trên Hub!
StableDiffusionInpaintPipeline
lớp diffusers.StableDiffusionInpaintPipeline
< source >( vae: diffusers.models.autoencoders.autoencoder_kl.AutoencoderKL | diffusers.models.autoencoders.autoencoder_asym_kl.AsymmetricAutoencoderKLtext_encoder: CLIPTextModeltokenizer: CLIPTokenizerunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulerssafety_checker: StableDiffusionSafetyCheckerfeature_extractor: CLIPImageProcessorPilimage_encoder: CLIPVisionModelWithProjection = Nonerequires_safety_checker: bool = True )
Tham số
- vae ([
AutoencoderKL,AsymmetricAutoencoderKL]) — 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 (latent representations). - text_encoder (
CLIPTextModel) — Bộ mã hóa văn bản đóng băng (clip-vit-large-patch14). - tokenizer (CLIPTokenizer) —
Một
CLIPTokenizerđể tách token cho 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. - safety_checker (
StableDiffusionSafetyChecker) — Module phân loại ước lượng xem hình ảnh được tạo ra có thể bị coi là khiêu dâm hoặc gây hại hay không. Vui lòng tham khảo model card để biết thêm chi tiết về các tác hại tiềm ẩn của model. - feature_extractor (CLIPImageProcessor) —
Một
CLIPImageProcessorđể trích xuất đặc trưng từ các hình ảnh được tạo ra; được dùng làm đầu vào chosafety_checker.
Pipeline cho việc inpainting hình ảnh có hướng dẫn bằng văn bản sử dụng Stable Diffusion.
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:
- load_textual_inversion() để nạp các embedding textual inversion
- load_lora_weights() để nạp trọng số LoRA
- save_lora_weights() để lưu trọng số LoRA
- load_ip_adapter() để nạp IP Adapters
- from_single_file() để tải các tệp
.ckpt
__call__
< source >( prompt: str | list[str] = Noneimage: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonemask_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonemasked_image_latents: Tensor = Noneheight: int | None = Nonewidth: int | None = Nonepadding_mask_crop: int | None = Nonestrength: float = 1.0num_inference_steps: int = 50timesteps: list[int] = Nonesigmas: list[float] = Noneguidance_scale: float = 7.5negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1eta: float = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = Noneip_adapter_image_embeds: list[torch.Tensor] | None = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecross_attention_kwargs: dict[str, typing.Any] | None = Noneclip_skip: int = Nonecallback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list[str] = ['latents']**kwargs ) → StableDiffusionPipelineOutput or tuple
Tham số
- prompt (
strhoặclist[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ềnprompt_embeds. - image (
torch.Tensor,PIL.Image.Image,np.ndarray,list[torch.Tensor],list[PIL.Image.Image]hoặclist[np.ndarray]) —Image, mảng numpy hoặc tensor đại diện cho một lô ảnh cần được inpaint (các phần của ảnh sẽ bị che bằngmask_imagevà được vẽ lại theoprompt). Đối với cả mảng numpy và tensor pytorch, phạm vi giá trị mong đợi là trong khoảng[0, 1]Nếu là tensor hoặc danh sách các tensor, hình dạng mong đợi phải là(B, C, H, W)hoặc(C, H, W). Nếu là mảng numpy hoặc danh sách các mảng, hình dạng mong đợi phải là(B, H, W, C)hoặc(H, W, C)Nó cũng có thể nhận image latents dưới dạngimage, nhưng nếu truyền latents trực tiếp thì chúng sẽ không được mã hóa lại. - mask_image (
torch.Tensor,PIL.Image.Image,np.ndarray,list[torch.Tensor],list[PIL.Image.Image], hoặclist[np.ndarray]) —Image, mảng numpy hoặc tensor đại diện cho một lô ảnh cần cheimage. Các pixel trắng trong mask sẽ được tô lại trong khi các pixel đen được giữ nguyên. Nếumask_imagelà một ảnh PIL, nó sẽ được chuyển đổi sang một kênh duy nhất (độ sáng) trước khi sử dụng. Nếu là mảng numpy hoặc tensor pytorch, nó phải chứa một kênh màu (L) thay vì 3, do đó hình dạng mong đợi cho tensor pytorch sẽ là(B, 1, H, W),(B, H, W),(1, H, W),(H, W). Và cho mảng numpy sẽ là(B, H, W, 1),(B, H, W),(H, W, 1), hoặc(H, W). - masked_image_latents (
torch.Tensor, tùy chọn) — Latent đã mã hóa trước của hình ảnh bị che (cho inpainting). - 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. - padding_mask_crop (
int, tùy chọn, mặc định làNone) — Kích thước của phần lề trong vùng crop sẽ được áp dụng cho ảnh và mask. NếuNone, không có crop nào được áp dụng cho image và mask_image. Nếupadding_mask_cropkhông phảiNone, trước tiên sẽ tìm một vùng hình chữ nhật có cùng tỷ lệ khung hình với ảnh và chứa toàn bộ vùng bị mask, sau đó mở rộng vùng đó dựa trênpadding_mask_crop. Ảnh và mask_image sau đó sẽ được crop dựa trên vùng đã mở rộng trước khi resize về kích thước ảnh gốc để inpainting. Điều này hữu ích khi vùng bị mask nhỏ trong khi ảnh lớn và chứa thông tin không liên quan đến inpainting, chẳng hạn như nền. - strength (
float, tùy chọn, mặc định là 1.0) — Chỉ ra mức độ biến đổi ảnh tham chiếuimage. Giá trị phải nằm trong khoảng từ 0 đến 1.imageđược dùng làm điểm khởi đầu và càng có nhiều nhiễu được thêm vào khistrengthcàng cao. Số bước khử nhiễu phụ thuộc vào lượng nhiễu ban đầu được thêm vào. Khistrengthlà 1, nhiễu được thêm vào là tối đa và quá trình khử nhiễu chạy đủ số lần lặp được chỉ định trongnum_inference_steps. Giá trị 1 về cơ bản sẽ bỏ quaimage. - 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. Tham số này được điều chỉnh bởistrength. - timesteps (
list[int], tùy chọn) — Các bước thời gian tùy chỉnh để sử dụng cho quá trình khử nhiễu với các trình lập lịch hỗ trợ đối sốtimestepstrong phương thứcset_timestepscủa chúng. Nếu không được định nghĩa, hành vi mặc định khinum_inference_stepsđược truyền vào sẽ được sử dụng. Phải được sắp xếp theo thứ tự giảm dần. - sigmas (
list[float], tùy chọn) — Các sigma tùy chỉnh để sử dụng cho quá trình khử nhiễu với các trình lập lịch hỗ trợ đối sốsigmastrong phương thứcset_timestepscủa chúng. Nếu không được định nghĩa, hành vi mặc định khinum_inference_stepsđược truyền sẽ được sử dụng. - guidance_scale (
float, tùy chọn, mặc định là 7.5) — 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. - negative_prompt (
strhoặclist[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ềnnegative_prompt_embedsthay 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.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. - 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. - 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àoprompt. - 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_embedssẽ được tạo từ đối số đầu vàonegative_prompt. - ip_adapter_image — (
PipelineImageInput, tùy chọn): Đầu vào hình ảnh tùy chọn để làm việc với IP Adapters. - ip_adapter_image_embeds (
list[torch.Tensor], tùy chọn) — Các embedding hình ảnh được tạo trước cho IP-Adapter. Nó phải là một danh sách có độ dài bằng với số lượng IP-adapter. Mỗi phần tử phải là một tensor có hình dạng(batch_size, num_images, emb_dim). Nó phải chứa embedding hình ảnh âm nếudo_classifier_free_guidanceđược đặt thànhTrue. Nếu không được cung cấp, các embedding sẽ được tính toán từ đối số đầu vàoip_adapter_image. - 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ữaPIL.Imagehoặcnp.array. - return_dict (
bool, tùy chọn, mặc định làTrue) — Có nên trả về một StableDiffusionPipelineOutput thay vì một tuple thông thường hay không. - cross_attention_kwargs (
dict, tùy chọn) — Một từ điển kwargs, nếu được chỉ định, sẽ được truyền đếnAttentionProcessornhư đã định nghĩa trongself.processor. - 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. - callback_on_step_end (
Callable,PipelineCallback,MultiPipelineCallbacks, tùy chọn) — Một hàm hoặc một lớp con củaPipelineCallbackhoặcMultiPipelineCallbacksđược gọi vào cuối mỗi bước khử nhiễu trong quá trình suy luận, với các đối số sau:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargssẽ bao gồm một danh sách tất cả các tensor như được chỉ định bởicallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
list, optional) — Danh sách các tensor đầu vào cho hàmcallback_on_step_end. Các tensor được chỉ định trong danh sách sẽ được truyền dưới dạng tham sốcallback_kwargs. Bạn chỉ có thể bao gồm các biến được liệt kê trong thuộc tính._callback_tensor_inputscủa lớp pipeline của bạn.
Trả về
StableDiffusionPipelineOutput hoặc tuple
Nếu return_dict là True, StableDiffusionPipelineOutput sẽ được trả về,
ngoài ra 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 và phần tử
thứ hai là một danh sách các bool cho biết hình ảnh được tạo tương ứng có chứa nội dung
“không an toàn” (nsfw) hay không.
Hàm gọi call của pipeline để tạo nội dung.
Ví dụ:
>>> import PIL
>>> import requests
>>> import torch
>>> from io import BytesIO
>>> from diffusers import StableDiffusionInpaintPipeline
>>> def download_image(url):
... response = requests.get(url)
... return PIL.Image.open(BytesIO(response.content)).convert("RGB")
>>> img_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png"
>>> mask_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png"
>>> init_image = download_image(img_url).resize((512, 512))
>>> mask_image = download_image(mask_url).resize((512, 512))
>>> pipe = StableDiffusionInpaintPipeline.from_pretrained(
... "stable-diffusion-v1-5/stable-diffusion-inpainting", torch_dtype=torch.float16
... )
>>> pipe = pipe.to("cuda")
>>> prompt = "Face of a yellow cat, high resolution, sitting on a park bench"
>>> image = pipe(prompt=prompt, image=init_image, mask_image=mask_image).images[0]enable_attention_slicing
< source >( slice_size: str | int = 'auto' )
Tham số
- slice_size (
strhoặcint, 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ằngattention_head_dim // slice_size. Trong trường hợp này,attention_head_dimphải là bội số củaslice_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]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
< source >( attention_op: typing.Optional[typing.Callable] = None )
Tham số
- attention_op (
Callable, tùy chọn) — Ghi đè toán tử mặc địnhNoneđể sử dụng làm đối sốopcho hàmmemory_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)Tắt chú ý tiết kiệm bộ nhớ từ xFormers.
load_textual_inversion
< source >( pretrained_model_name_or_path: str | list[str] | dict[str, torch.Tensor] | list[dict[str, torch.Tensor]]token: str | list[str] | None = Nonetokenizer: 'PreTrainedTokenizer' | None = Nonetext_encoder: 'PreTrainedModel' | None = None**kwargs )
Tham số
- pretrained_model_name_or_path (
strhoặcos.PathLikehoặclist[str or os.PathLike]hoặcDicthoặclist[Dict]) — Có thể là một trong các loại sau hoặc một danh sách chứa chúng:- Một chuỗi, model id (ví dụ
sd-concepts-library/low-poly-hd-logos-icons) của một mô hình được huấn luyện trước có sẵn trên Hub. - Đường dẫn đến một thư mục (ví dụ
./my_text_inversion_directory/) chứa trọng số textual inversion. - Đường dẫn đến một tệp (ví dụ
./my_text_inversions.pt) chứa trọng số textual inversion. - Một torch state dict.
- Một chuỗi, model id (ví dụ
- token (
strhoặclist[str], tùy chọn) — Ghi đè token được sử dụng cho trọng số textual inversion. Nếupretrained_model_name_or_pathlà một danh sách, thìtokencũng phải là một danh sách có cùng độ dài. - text_encoder (CLIPTextModel, tùy chọn) — Bộ mã hóa văn bản đóng băng (clip-vit-large-patch14). Nếu không được chỉ định, hàm sẽ lấy self.tokenizer.
- tokenizer (CLIPTokenizer, tùy chọn) —
Một
CLIPTokenizerđể tách token cho văn bản. Nếu không được chỉ định, hàm sẽ lấy self.tokenizer. - weight_name (
str, tuỳ chọn) — Tên của tệp trọng số tùy chỉnh. Nên sử dụng tham số này khi:- Tệp textual inversion đã lưu ở định dạng 🤗 Diffusers, nhưng được lưu dưới một tên trọng số cụ thể như
text_inv.bin. - Tệp textual inversion đã lưu ở định dạng Automatic1111.
- Tệp textual inversion đã lưu ở định dạng 🤗 Diffusers, nhưng được lưu dưới một tên trọng số cụ thể như
- cache_dir (
str | os.PathLike, tùy chọn) — Đường dẫn đến thư mục nơi cấu hình mô hình được huấn luyện trước đã tải xuống được lưu đệm nếu không sử dụng bộ lưu đệm tiêu chuẩn. - force_download (
bool, tùy chọn, mặc định làFalse) — Có nên buộc tải lại (re-download) trọng số mô hình và các tệp cấu hình, ghi đè lên các phiên bản đã được lưu trong bộ nhớ đệm nếu chúng tồn tại hay không. - proxies (
dict[str, str], tuỳ chọn) — Một từ điển các máy chủ proxy để sử dụng theo giao thức hoặc điểm cuối, ví dụ,{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}. Các proxy này được sử dụng cho mỗi yêu cầu. - local_files_only (
bool, tùy chọn, mặc định làFalse) — Xác định có chỉ tải trọng số và tệp cấu hình của mô hình từ cục bộ hay không. Nếu đặt thànhTrue, mô hình sẽ không được tải xuống từ Hub. - hf_token (
strhoặc bool, tùy chọn) — Token được sử dụng làm HTTP bearer authorization cho các tệp từ xa. NếuTrue, token được tạo từdiffusers-cli login(được lưu trong~/.huggingface) sẽ được sử dụng. - revision (
str, tùy chọn, mặc định là"main") — Phiên bản mô hình cụ thể cần sử dụng. Nó có thể là tên nhánh, tên thẻ, id commit, hoặc bất kỳ định danh nào được Git cho phép. - subfolder (
str, tùy chọn, mặc định là"") — Vị trí thư mục con của tệp mô hình bên trong một kho lưu trữ mô hình lớn hơn trên Hub hoặc cục bộ. - mirror (
str, optional) — Nguồn mirror để giải quyết các vấn đề về khả năng truy cập nếu bạn đang tải xuống một model tại Trung Quốc. Chúng tôi không đảm bảo tính kịp thời hay an toàn của nguồn, và bạn nên tham khảo trang web mirror để biết thêm thông tin.
Nạp các embedding Textual Inversion vào text encoder của StableDiffusionPipeline (hỗ trợ cả định dạng 🤗 Diffusers và Automatic1111).
Ví dụ:
Để nạp vector nhúng Textual Inversion ở định dạng 🤗 Diffusers:
from diffusers import StableDiffusionPipeline
import torch
model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")
pipe.load_textual_inversion("sd-concepts-library/cat-toy")
prompt = "A <cat-toy> backpack"
image = pipe(prompt, num_inference_steps=50).images[0]
image.save("cat-backpack.png")Để nạp vector nhúng Textual Inversion ở định dạng Automatic1111, hãy đảm bảo tải vector trước (ví dụ từ civitAI) rồi sau đó nạp vector
trên máy cục bộ:
from diffusers import StableDiffusionPipeline
import torch
model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")
pipe.load_textual_inversion("./charturnerv2.pt", token="charturnerv2")
prompt = "charturnerv2, multiple views of the same character in the same outfit, a character turnaround of a woman wearing a black jacket and red shirt, best quality, intricate details."
image = pipe(prompt, num_inference_steps=50).images[0]
image.save("character.png")load_lora_weights
< source >( pretrained_model_name_or_path_or_dict: str | dict[str, torch.Tensor]adapter_name: str | None = Nonehotswap: bool = False**kwargs )
Tham số
- pretrained_model_name_or_path_or_dict (
strhoặcos.PathLikehoặcdict) — Xem lora_state_dict(). - adapter_name (
str, tuỳ chọn) — Tên adapter được dùng để tham chiếu mô hình adapter đã tải. Nếu không được chỉ định, hệ thống sẽ sử dụngdefault_{i}trong đó i là tổng số adapter đang được tải. - low_cpu_mem_usage (
bool, tùy chọn) — Tăng tốc độ tải mô hình bằng cách chỉ tải trọng số LoRA được huấn luyện trước và không khởi tạo các trọng số ngẫu nhiên. - hotswap (
bool, tuỳ chọn) — Mặc định làFalse. Liệu có thay thế adapter (LoRA) hiện có bằng adapter mới được nạp vào tại chỗ hay không. Điều này có nghĩa là, thay vì nạp thêm một adapter, phương thức này sẽ lấy trọng số của adapter hiện có và thay thế chúng bằng trọng số của adapter mới. Cách này có thể nhanh hơn và tiết kiệm bộ nhớ hơn. Tuy nhiên, lợi ích chính của hotswap là khi mô hình được biên dịch bằng torch.compile, việc nạp adapter mới không yêu cầu biên dịch lại mô hình. Khi sử dụng hotswap,adapter_namephải là tên của một adapter đã được nạp trước đó.Nếu adapter mới và adapter cũ có rank và/hoặc alpha LoRA (tức là hệ số scale) khác nhau, bạn cần gọi thêm một phương thức trước khi nạp adapter:
pipeline = ... # load diffusers pipeline max_rank = ... # the highest rank among all LoRAs that you want to load # call *before* compiling and loading the LoRA adapter pipeline.enable_lora_hotswap(target_rank=max_rank) pipeline.load_lora_weights(file_name) # optionally compile the model nowLưu ý rằng việc hotswap các adapter của text encoder hiện chưa được hỗ trợ. Kỹ thuật này có một số hạn chế khác, được tài liệu hóa tại đây: https://huggingface.co/docs/peft/main/en/package_reference/hotswap
- kwargs (
dict, tùy chọn) — Xem lora_state_dict().
Tải trọng số LoRA được chỉ định trong pretrained_model_name_or_path_or_dict vào self.unet và self.text_encoder.
Tất cả các kwargs được chuyển tiếp đến self.lora_state_dict.
Xem lora_state_dict() để biết thêm chi tiết về cách nạp state dict.
Xem load_lora_into_unet() để biết thêm chi tiết về cách state dict được nạp vào self.unet.
Xem load_lora_into_text_encoder() để biết thêm chi tiết về cách state dict được nạp vào self.text_encoder.
save_lora_weights
< source >( save_directory: str | os.PathLikeunet_lora_layers: dict[str, typing.Union[torch.nn.Module, torch.Tensor]] = Nonetext_encoder_lora_layers: dict[str, torch.nn.Module] = Noneis_main_process: bool = Trueweight_name: str = Nonesave_function: typing.Callable = Nonesafe_serialization: bool = Trueunet_lora_adapter_metadata = Nonetext_encoder_lora_adapter_metadata = None )
Tham số
- save_directory (
strhoặcos.PathLike) — Thư mục để lưu các tham số LoRA. Sẽ được tạo nếu chưa tồn tại. - unet_lora_layers (
dict[str, torch.nn.Module]hoặcdict[str, torch.Tensor]) — State dict của các lớp LoRA tương ứng vớiunet. - text_encoder_lora_layers (
dict[str, torch.nn.Module]hoặcdict[str, torch.Tensor]) — State dict của các lớp LoRA tương ứng vớitext_encoder. Phải truyền rõ state dict của LoRA cho text encoder vì nó đến từ 🤗 Transformers. - is_main_process (
bool, tùy chọn, mặc định làTrue) — Xác định xem tiến trình gọi hàm này có phải là tiến trình chính hay không. Hữu ích trong quá trình huấn luyện phân tán khi bạn cần gọi hàm này trên tất cả các tiến trình. Trong trường hợp này, chỉ đặtis_main_process=Truetrên tiến trình chính để tránh điều kiện đua. - save_function (
Callable) — Hàm được sử dụng để lưu state dictionary. Hữu ích trong quá trình huấn luyện phân tán khi bạn cần thay thếtorch.savebằng một phương pháp khác. Có thể được cấu hình bằng biến môi trườngDIFFUSERS_SAVE_MODE. - safe_serialization (
bool, tùy chọn, mặc định làTrue) — Liệu có lưu mô hình bằngsafetensorshay theo cách truyền thống của PyTorch vớipicklehay không. - unet_lora_adapter_metadata — Metadata của bộ thích ứng LoRA liên quan đến unet, sẽ được chuỗi hóa cùng với state dict.
- text_encoder_lora_adapter_metadata — Metadata của bộ thích ứng LoRA liên quan đến text encoder, sẽ được serialize cùng với state dict.
Lưu các tham số LoRA tương ứng với UNet và text encoder.
encode_prompt
< source >( 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 (
strhoặclist[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 (
strhoặclist[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ềnnegative_prompt_embedsthay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếuguidance_scalenhỏ hơn1). - 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àoprompt. - 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àonegative_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.
get_guidance_scale_embedding
< source >( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor
Tham số
- w (
torch.Tensor) — Tạo các vector nhúng với thang độ dẫn hướng được chỉ định để sau đó làm phong phú các nhúng bước thời gian. - embedding_dim (
int, tùy chọn, mặc định là 512) — Kích thước của các embedding cần tạo. - dtype (
torch.dtype, tùy chọn, mặc định làtorch.float32) — Kiểu dữ liệu của các embedding được tạo ra.
Trả về
torch.Tensor
Các vector nhúng có hình dạng (len(w), embedding_dim).
StableDiffusionPipelineOutput
lớp diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarraynsfw_content_detected: list[bool] | None )
Tham số
- images (
list[PIL.Image.Image]hoặcnp.ndarray) — danh sách các hình ảnh PIL đã khử nhiễu có độ dàibatch_sizehoặc mảng NumPy có hình dạng(batch_size, height, width, num_channels). - nsfw_content_detected (
list[bool]) — danh sách cho biết hình ảnh tương ứng có chứa nội dung “không an toàn” (nsfw) hay không, hoặcNonenếu không thể thực hiện kiểm tra an toàn.
Lớp đầu ra cho các pipeline Stable Diffusion.