Diffusers 文件
Kolors:用於逼真文字到影像合成的擴散模型的有效訓練
並獲得增強的文件體驗
開始使用
Kolors:用於逼真文字到影像合成的擴散模型的有效訓練
Kolors 是由快手 Kolors 團隊開發的一種基於潛在擴散的大規模文字到影像生成模型。Kolors 在數十億文字影像對上進行訓練,在視覺質量、複雜語義準確性以及中英文文字渲染方面,相較於開源和閉源模型都展現出顯著優勢。此外,Kolors 支援中英文輸入,在理解和生成中文特定內容方面表現出強大的效能。更多詳情,請參閱這份技術報告。
技術報告摘要如下:
我們推出了 Kolors,這是一種用於文字到影像合成的潛在擴散模型,其特點是對英語和漢語都有深刻的理解,並具有令人印象深刻的逼真度。Kolors 的開發有三個關鍵見解。首先,與 Imagen 和 Stable Diffusion 3 中使用的大型語言模型 T5 不同,Kolors 基於通用語言模型 (GLM) 構建,這增強了其在中英文方面的理解能力。此外,我們採用多模態大型語言模型對大量訓練資料集進行重新標註,以實現細粒度的文字理解。這些策略顯著提升了 Kolors 理解複雜語義(特別是涉及多個實體)的能力,並使其具備了先進的文字渲染能力。其次,我們將 Kolors 的訓練分為兩個階段:具有廣泛知識的概念學習階段和透過專門策劃的高美學資料進行質量改進的階段。此外,我們研究了噪聲排程表的關鍵作用,並引入了一種新穎的排程表來最佳化高解析度影像生成。這些策略共同提升了生成高解析度影像的視覺吸引力。最後,我們提出了一個類別平衡基準 KolorsPrompts,作為 Kolors 訓練和評估的指導。因此,即使採用常用的 U-Net 主幹網路,Kolors 在人類評估中也表現出了卓越的效能,超越了現有的開源模型,並達到了 Midjourney-v6 級別的效能,尤其是在視覺吸引力方面。我們將在https://github.com/Kwai-Kolors/Kolors釋出 Kolors 的程式碼和權重,希望它能造福視覺生成社群未來的研究和應用。
使用示例
import torch
from diffusers import DPMSolverMultistepScheduler, KolorsPipeline
pipe = KolorsPipeline.from_pretrained("Kwai-Kolors/Kolors-diffusers", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)
image = pipe(
prompt='一張瓢蟲的照片,微距,變焦,高質量,電影,拿著一個牌子,寫著"可圖"',
negative_prompt="",
guidance_scale=6.5,
num_inference_steps=25,
).images[0]
image.save("kolors_sample.png")
IP Adapter
Kolors 需要一個不同的 IP 介面卡才能工作,並且它使用 Openai-CLIP-336 作為影像編碼器。
使用 IP 介面卡與 Kolors 配合需要超過 24GB 的視訊記憶體。要使用它,我們建議在消費級 GPU 上使用 enable_model_cpu_offload()。
雖然 Kolors 已整合到 Diffusers 中,但您需要從某個修訂版載入影像編碼器才能使用 safetensor 檔案。如果您習慣載入 pickle 檢查點,仍然可以使用原始倉庫的主分支。
import torch
from transformers import CLIPVisionModelWithProjection
from diffusers import DPMSolverMultistepScheduler, KolorsPipeline
from diffusers.utils import load_image
image_encoder = CLIPVisionModelWithProjection.from_pretrained(
"Kwai-Kolors/Kolors-IP-Adapter-Plus",
subfolder="image_encoder",
low_cpu_mem_usage=True,
torch_dtype=torch.float16,
revision="refs/pr/4",
)
pipe = KolorsPipeline.from_pretrained(
"Kwai-Kolors/Kolors-diffusers", image_encoder=image_encoder, torch_dtype=torch.float16, variant="fp16"
)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)
pipe.load_ip_adapter(
"Kwai-Kolors/Kolors-IP-Adapter-Plus",
subfolder="",
weight_name="ip_adapter_plus_general.safetensors",
revision="refs/pr/4",
image_encoder_folder=None,
)
pipe.enable_model_cpu_offload()
ipa_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/kolors/cat_square.png")
image = pipe(
prompt="best quality, high quality",
negative_prompt="",
guidance_scale=6.5,
num_inference_steps=25,
ip_adapter_image=ipa_image,
).images[0]
image.save("kolors_ipa_sample.png")
KolorsPipeline
class diffusers.KolorsPipeline
< 源 >( vae: AutoencoderKL text_encoder: ChatGLMModel tokenizer: ChatGLMTokenizer unet: UNet2DConditionModel scheduler: KarrasDiffusionSchedulers image_encoder: CLIPVisionModelWithProjection = None feature_extractor: CLIPImageProcessor = None force_zeros_for_empty_prompt: bool = False )
引數
- vae (AutoencoderKL) — 用於將影像編碼和解碼為潛在表示的變分自編碼器 (VAE) 模型。
- text_encoder (
ChatGLMModel
) — 凍結文字編碼器。Kolors 使用 ChatGLM3-6B。 - tokenizer (
ChatGLMTokenizer
) — 類 ChatGLMTokenizer 的分詞器。 - unet (UNet2DConditionModel) — 用於對編碼影像潛在表示進行去噪的條件 U-Net 架構。
- scheduler (SchedulerMixin) — 與
unet
結合使用的排程器,用於對編碼影像潛在表示進行去噪。可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 中的一種。 - force_zeros_for_empty_prompt (
bool
, 可選, 預設為"False"
) — 負面提示詞嵌入是否強制始終設定為 0。另請參閱Kwai-Kolors/Kolors-diffusers
的配置。
用於文字到影像生成的 Kolors 管道。
此模型繼承自 DiffusionPipeline。請檢視超類文件,瞭解庫為所有管道實現的通用方法(例如下載或儲存、在特定裝置上執行等)。
該管道還繼承了以下載入方法
- load_lora_weights() 用於載入 LoRA 權重
- save_lora_weights() 用於儲存 LoRA 權重
- load_ip_adapter() 用於載入 IP 介面卡
encode_prompt
< 源 >( prompt device: typing.Optional[torch.device] = None num_images_per_prompt: int = 1 do_classifier_free_guidance: bool = True negative_prompt = None prompt_embeds: typing.Optional[torch.FloatTensor] = None pooled_prompt_embeds: typing.Optional[torch.Tensor] = None negative_prompt_embeds: typing.Optional[torch.FloatTensor] = None negative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = None max_sequence_length: int = 256 )
引數
- prompt (
str
或List[str]
, 可選) — 待編碼的提示詞 - device — (
torch.device
): torch 裝置 - num_images_per_prompt (
int
) — 每個提示詞應生成的影像數量 - do_classifier_free_guidance (
bool
) — 是否使用分類器自由引導 - negative_prompt (
str
或List[str]
, 可選) — 不用於引導影像生成的提示詞。如果未定義,則必須傳遞negative_prompt_embeds
。在使用非引導模式時被忽略(即,如果guidance_scale
小於1
則忽略)。 - prompt_embeds (
torch.FloatTensor
, 可選) — 預生成的文字嵌入。可用於輕鬆調整文字輸入,例如提示詞加權。如果未提供,文字嵌入將從prompt
輸入引數生成。 - pooled_prompt_embeds (
torch.Tensor
, 可選) — 預生成的池化文字嵌入。可用於輕鬆調整文字輸入,例如提示詞加權。如果未提供,池化文字嵌入將從prompt
輸入引數生成。 - negative_prompt_embeds (
torch.FloatTensor
, 可選) — 預生成的負面文字嵌入。可用於輕鬆調整文字輸入,例如提示詞加權。如果未提供,negative_prompt_embeds
將從negative_prompt
輸入引數生成。 - negative_pooled_prompt_embeds (
torch.Tensor
, 可選) — 預生成的負面池化文字嵌入。可用於輕鬆調整文字輸入,例如提示詞加權。如果未提供,池化negative_prompt_embeds
將從negative_prompt
輸入引數生成。 - max_sequence_length (
int
預設為 256) — 與prompt
一起使用的最大序列長度。
將提示編碼為文字編碼器隱藏狀態。
get_guidance_scale_embedding
< 源 >( w: Tensor embedding_dim: int = 512 dtype: dtype = torch.float32 ) → torch.Tensor
- all
- 呼叫
KolorsImg2ImgPipeline
class diffusers.KolorsImg2ImgPipeline
< 原始碼 >( vae: AutoencoderKL text_encoder: ChatGLMModel tokenizer: ChatGLMTokenizer unet: UNet2DConditionModel scheduler: KarrasDiffusionSchedulers image_encoder: CLIPVisionModelWithProjection = None feature_extractor: CLIPImageProcessor = None force_zeros_for_empty_prompt: bool = False )
引數
- vae (AutoencoderKL) — 用於將影像編碼和解碼為潛在表示的變分自編碼器(VAE)模型。
- text_encoder (
ChatGLMModel
) — 凍結的文字編碼器。Kolors 使用 ChatGLM3-6B。 - tokenizer (
ChatGLMTokenizer
) — ChatGLMTokenizer 類的分詞器。 - unet (UNet2DConditionModel) — 用於對編碼影像潛在表示進行去噪的條件 U-Net 架構。
- scheduler (SchedulerMixin) — 一個與
unet
結合使用的排程器,用於對編碼影像潛在表示進行去噪。可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 之一。 - force_zeros_for_empty_prompt (
bool
, 可選, 預設為"False"
) — 是否強制將負面提示嵌入始終設定為 0。另請參閱Kwai-Kolors/Kolors-diffusers
的配置。
用於文字到影像生成的 Kolors 管道。
此模型繼承自 DiffusionPipeline。請檢視超類文件,瞭解庫為所有管道實現的通用方法(例如下載或儲存、在特定裝置上執行等)。
該管道還繼承了以下載入方法
- load_lora_weights() 用於載入 LoRA 權重
- save_lora_weights() 用於儲存 LoRA 權重
- load_ip_adapter() 用於載入 IP 介面卡
encode_prompt
< 原始碼 >( prompt device: typing.Optional[torch.device] = None num_images_per_prompt: int = 1 do_classifier_free_guidance: bool = True negative_prompt = None prompt_embeds: typing.Optional[torch.FloatTensor] = None pooled_prompt_embeds: typing.Optional[torch.Tensor] = None negative_prompt_embeds: typing.Optional[torch.FloatTensor] = None negative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = None max_sequence_length: int = 256 )
引數
- prompt (
str
或List[str]
, 可選) — 待編碼的提示詞 - device — (
torch.device
): torch 裝置 - num_images_per_prompt (
int
) — 每個提示詞應生成的影像數量 - do_classifier_free_guidance (
bool
) — 是否使用無分類器指導 - negative_prompt (
str
或List[str]
, 可選) — 不引導影像生成的提示詞。如果未定義,則必須傳遞negative_prompt_embeds
。當不使用引導時(即如果guidance_scale
小於1
時),此引數將被忽略。 - prompt_embeds (
torch.FloatTensor
, 可選) — 預先生成的文字嵌入。可用於輕鬆調整文字輸入,例如提示詞權重。如果未提供,文字嵌入將從prompt
輸入引數生成。 - pooled_prompt_embeds (
torch.Tensor
, 可選) — 預先生成的池化文字嵌入。可用於輕鬆調整文字輸入,例如提示詞權重。如果未提供,池化文字嵌入將從prompt
輸入引數生成。 - negative_prompt_embeds (
torch.FloatTensor
, 可選) — 預先生成的負面文字嵌入。可用於輕鬆調整文字輸入,例如提示詞權重。如果未提供,negative_prompt_embeds
將從negative_prompt
輸入引數生成。 - negative_pooled_prompt_embeds (
torch.Tensor
, 可選) — 預先生成的負面池化文字嵌入。可用於輕鬆調整文字輸入,例如提示詞權重。如果未提供,池化負面提示嵌入將從negative_prompt
輸入引數生成。 - max_sequence_length (
int
預設為 256) — 與prompt
一起使用的最大序列長度。
將提示編碼為文字編碼器隱藏狀態。
get_guidance_scale_embedding
< 原始碼 >( w: Tensor embedding_dim: int = 512 dtype: dtype = torch.float32 ) → torch.Tensor
- all
- 呼叫