Diffusers documentation

ControlNet với Hunyuan-DiT

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

ControlNet với Hunyuan-DiT

HunyuanDiTControlNetPipeline là một triển khai của ControlNet cho Hunyuan-DiT.

ControlNet được giới thiệu trong Adding Conditional Control to Text-to-Image Diffusion Models bởi Lvmin Zhang, Anyi Rao và Maneesh Agrawala.

Với một mô hình ControlNet, bạn có thể cung cấp một hình ảnh điều khiển bổ sung để điều kiện hóa và kiểm soát quá trình tạo hình ảnh của Hunyuan-DiT. Ví dụ, nếu bạn cung cấp một bản đồ độ sâu, mô hình ControlNet sẽ tạo ra một hình ảnh giữ lại thông tin không gian từ bản đồ độ sâu. Đây là một cách linh hoạt và chính xác hơn để kiểm soát quá trình tạo hình ảnh.

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

Chúng tôi giới thiệu ControlNet, một kiến trúc mạng nơ-ron để thêm các điều khiển điều kiện không gian vào các mô hình khuếch tán từ văn bản sang ảnh lớn, được huấn luyện trước. ControlNet khóa các mô hình khuếch tán lớn sẵn sàng cho sản xuất, và tái sử dụng các lớp mã hóa sâu và mạnh mẽ của chúng, được huấn luyện trước với hàng tỷ hình ảnh, làm một khung xương mạnh mẽ để học một tập hợp đa dạng các điều khiển có điều kiện. Kiến trúc mạng nơ-ron được kết nối bằng các “cuộn không” (các lớp tích chập khởi tạo bằng không) giúp tăng dần các tham số từ không và đảm bảo rằng không có nhiễu có hại nào có thể ảnh hưởng đến việc tinh chỉnh. Chúng tôi kiểm tra các điều khiển điều kiện khác nhau, ví dụ như cạnh, độ sâu, phân đoạn, tư thế con người, v.v., với Stable Diffusion, sử dụng một hoặc nhiều điều kiện, có hoặc không có lời nhắc. Chúng tôi cho thấy rằng việc huấn luyện ControlNet là mạnh mẽ với các bộ dữ liệu nhỏ (<50k) và lớn (>1m). Các kết quả mở rộng cho thấy ControlNet có thể thúc đẩy các ứng dụng rộng hơn để kiểm soát các mô hình khuếch tán ảnh.

Mã này được triển khai bởi Tencent Hunyuan Team. Bạn có thể tìm thấy các checkpoint được huấn luyện trước cho Hunyuan-DiT ControlNets trên Tencent Hunyuan.

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

HunyuanDiTControlNetPipeline

lớp diffusers.HunyuanDiTControlNetPipeline

< >

( vae: AutoencoderKLtext_encoder: BertModeltokenizer: BertTokenizertransformer: HunyuanDiT2DModelscheduler: DDPMSchedulersafety_checker: StableDiffusionSafetyCheckerfeature_extractor: CLIPImageProcessorPilcontrolnet: diffusers.models.controlnets.controlnet_hunyuan.HunyuanDiT2DControlNetModel | list[diffusers.models.controlnets.controlnet_hunyuan.HunyuanDiT2DControlNetModel] | tuple[diffusers.models.controlnets.controlnet_hunyuan.HunyuanDiT2DControlNetModel] | diffusers.models.controlnets.controlnet_hunyuan.HunyuanDiT2DMultiControlNetModeltext_encoder_2: transformers.models.t5.modeling_t5.T5EncoderModel | None = Nonetokenizer_2: transformers.models.t5.tokenization_t5.T5Tokenizer | None = Nonerequires_safety_checker: bool = True )

Tham số

  • 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. Chúng tôi sử dụng sdxl-vae-fp16-fix.
  • text_encoder (~transformers.BertModel, ~transformers.CLIPTextModel | None) — Bộ mã hóa văn bản đóng băng (clip-vit-large-patch14). HunyuanDiT sử dụng [CLIP song ngữ] được tinh chỉnh.
  • tokenizer (~transformers.BertTokenizer, ~transformers.CLIPTokenizer | None) — Một BertTokenizer hoặc CLIPTokenizer để phân tách văn bản.
  • transformer (HunyuanDiT2DModel) — Mô hình HunyuanDiT do Tencent Hunyuan thiết kế.
  • text_encoder_2 (T5EncoderModel) — Bộ nhúng mT5. Cụ thể, nó là ‘t5-v1_1-xxl’.
  • tokenizer_2 (T5Tokenizer) — Tokenizer cho bộ nhúng mT5.
  • scheduler (DDPMScheduler) — Một scheduler được sử dụng kết hợp với HunyuanDiT để khử nhiễu các latents ảnh đã mã hóa.
  • controlnet (HunyuanDiT2DControlNetModel hoặc list[HunyuanDiT2DControlNetModel] hoặc HunyuanDiT2DControlNetModel) — Cung cấp điều kiện bổ sung cho unet trong quá trình khử nhiễu. Nếu bạn đặt nhiều ControlNet dưới dạng danh sách, đầu ra từ mỗi ControlNet sẽ được cộng lại với nhau để tạo thành một điều kiện bổ sung kết hợp.

Pipeline để tạo ảnh từ tiếng Anh/tiếng Trung sử dụng HunyuanDiT.

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 mà thư viện triển khai cho tất cả các pipeline (chẳng hạn như tải xuống hoặc lưu, chạy trên một thiết bị cụ thể, v.v.)

HunyuanDiT sử dụng hai bộ mã hóa văn bản: mT5 và [CLIP song ngữ](được chúng tôi tinh chỉnh)

__call__

< >

( prompt: str | list[str] = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int | None = 50guidance_scale: float | None = 5.0control_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonecontrolnet_conditioning_scale: float | list[float] = 1.0negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1eta: float | None = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_embeds_2: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds_2: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Noneprompt_attention_mask_2: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask_2: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback_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']guidance_rescale: float = 0.0original_size: tuple[int, int] | None = (1024, 1024)target_size: tuple[int, int] | None = Nonecrops_coords_top_left: tuple[int, int] = (0, 0)use_resolution_binning: bool = True ) → StableDiffusionPipelineOutput 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) — Chiều cao của hình ảnh được tạo ra, tính bằng pixel.
  • width (int) — 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. Tham số này được điều chỉnh bởi strength.
  • 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ớ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.
  • control_image (torch.Tensor, PIL.Image.Image, np.ndarray, list[torch.Tensor], list[PIL.Image.Image], list[np.ndarray], — list[list[torch.Tensor]], list[list[np.ndarray]] hoặc list[list[PIL.Image.Image]]): Điều kiện đầu vào của ControlNet để cung cấp hướng dẫn cho unet trong quá trình tạo ảnh. Nếu kiểu được chỉ định là torch.Tensor, nó sẽ được truyền nguyên vẹn vào ControlNet. PIL.Image.Image cũng được chấp nhận dưới dạng ảnh. Kích thước của ảnh đầu ra mặc định là kích thước của image. Nếu chiều cao và/hoặc chiều rộng được truyền vào, image sẽ được thay đổi kích thước cho phù hợp. Nếu nhiều ControlNet được chỉ định trong init, các ảnh phải được truyền dưới dạng danh sách sao cho mỗi phần tử của danh sách có thể được batch đúng cách để làm đầu vào cho một ControlNet duy nhất.
  • controlnet_conditioning_scale (float hoặc list[float], tùy chọn, mặc định là 1.0) — Đầu ra của ControlNet được nhân với controlnet_conditioning_scale trước khi được cộng vào phần dư trong unet gốc. Nếu nhiều ControlNet được chỉ định trong init, bạn có thể đặt thang tương ứng dưới dạng một danh sách.
  • 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.
  • prompt_embeds_2 (torch.Tensor, tùy chọn) — Các embedding văn bản đã đượ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, 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.
  • negative_prompt_embeds_2 (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.
  • prompt_attention_mask (torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt. Bắt buộc khi prompt_embeds được truyền trực tiếp.
  • prompt_attention_mask_2 (torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt. Bắt buộc khi prompt_embeds_2 được truyền trực tiếp.
  • negative_prompt_attention_mask (torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt âm. Bắt buộc khi negative_prompt_embeds được truyền trực tiếp.
  • negative_prompt_attention_mask_2 (torch.Tensor, tùy chọn) — Attention mask cho negative prompt. Bắt buộc khi negative_prompt_embeds_2 được truyền trực tiế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.Image hoặc np.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.
  • callback_on_step_end (Callable[[int, int], None], PipelineCallback, MultiPipelineCallbacks, tùy chọn) — Một hàm callback hoặc danh sách các hàm callback sẽ được gọi vào cuối mỗi bước khử nhiễu.
  • callback_on_step_end_tensor_inputs (list[str], tùy chọn) — Danh sách các đầu vào tensor cần được truyền đến hàm callback. Nếu không được định nghĩa, tất cả các đầu vào tensor sẽ được truyền.
  • guidance_rescale (float, tùy chọn, mặc định là 0.0) — Tái chuẩn hóa noise_cfg theo guidance_rescale. Dựa trên kết quả của Common Diffusion Noise Schedules and Sample Steps are Flawed. Xem Mục 3.4
  • original_size (tuple[int, int], tuỳ chọn, mặc định là (1024, 1024)) — Kích thước gốc của hình ảnh. Được dùng để tính toán các time ids.
  • target_size (tuple[int, int], tuỳ chọn) — Kích thước đích của hình ảnh. Được dùng để tính toán các id thời gian.
  • crops_coords_top_left (tuple[int, int], tùy chọn, mặc định là (0, 0)) — Tọa độ góc trên bên trái của vùng cắt. Được sử dụng để tính toán các id thời gian.
  • use_resolution_binning (bool, tùy chọn, mặc định là True) — Có sử dụng phân loại độ phân giải hay không. Nếu True, độ phân giải đầu vào sẽ được ánh xạ đến độ phân giải chuẩn gần nhất. Các độ phân giải được hỗ trợ là 1024x1024, 1280x1280, 1024x768, 1152x864, 1280x960, 768x1024, 864x1152, 960x1280, 1280x768 và 768x1280. Khuyến nghị đặt giá trị này thành True.

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 pipeline để tạo nội dung với HunyuanDiT.

Ví dụ:

from diffusers import HunyuanDiT2DControlNetModel, HunyuanDiTControlNetPipeline
import torch

controlnet = HunyuanDiT2DControlNetModel.from_pretrained(
    "Tencent-Hunyuan/HunyuanDiT-v1.1-ControlNet-Diffusers-Canny", torch_dtype=torch.float16
)

pipe = HunyuanDiTControlNetPipeline.from_pretrained(
    "Tencent-Hunyuan/HunyuanDiT-v1.1-Diffusers", controlnet=controlnet, torch_dtype=torch.float16
)
pipe.to("cuda")

from diffusers.utils import load_image

cond_image = load_image(
    "https://huggingface.co/Tencent-Hunyuan/HunyuanDiT-v1.1-ControlNet-Diffusers-Canny/resolve/main/canny.jpg?download=true"
)

## You may also use English prompt as HunyuanDiT supports both English and Chinese
prompt = "在夜晚的酒店门前,一座古老的中国风格的狮子雕像矗立着,它的眼睛闪烁着光芒,仿佛在守护着这座建筑。背景是夜晚的酒店前,构图方式是特写,平视,居中构图。这张照片呈现了真实摄影风格,蕴含了中国雕塑文化,同时展现了神秘氛围"
# prompt="At night, an ancient Chinese-style lion statue stands in front of the hotel, its eyes gleaming as if guarding the building. The background is the hotel entrance at night, with a close-up, eye-level, and centered composition. This photo presents a realistic photographic style, embodies Chinese sculpture culture, and reveals a mysterious atmosphere."
image = pipe(
    prompt,
    height=1024,
    width=1024,
    control_image=cond_image,
    num_inference_steps=50,
).images[0]

encode_prompt

< >

( prompt: strdevice: device = Nonedtype: dtype = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = Truenegative_prompt: str | None = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int | None = Nonetext_encoder_index: int = 0 )

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
  • dtype (torch.dtype) — torch dtype
  • 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.
  • prompt_attention_mask (torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt. Bắt buộc khi prompt_embeds được truyền trực tiếp.
  • negative_prompt_attention_mask (torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt âm. Bắt buộc khi negative_prompt_embeds được truyền trực tiếp.
  • max_sequence_length (int, tùy chọn) — độ dài tối đa của chuỗi để sử dụng cho prompt.
  • text_encoder_index (int, tùy chọn) — Chỉ số của text encoder cần sử dụng. 0 cho clip và 1 cho T5.

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

Update on GitHub