Diffusers documentation
Kolors: Treinamento eficaz de modelo de difusão para síntese fotorealista de texto para imagem
Kolors: Treinamento eficaz de modelo de difusão para síntese fotorealista de texto para imagem

Kolors é um modelo de geração de texto para imagem em larga escala baseado em difusão latente, desenvolvido pela equipe Kuaishou Kolors. Treinado em bilhões de pares de texto-imagem, o Kolors apresenta vantagens significativas em relação a modelos de código aberto e fechados em qualidade visual, precisão semântica complexa e renderização de texto para caracteres em chinês e inglês. Além disso, o Kolors suporta entradas em chinês e inglês, demonstrando forte desempenho na compreensão e geração de conteúdo específico do chinês. Para mais detalhes, consulte este relatório técnico.
O resumo do relatório técnico é:
Apresentamos o Kolors, um modelo de difusão latente para síntese de texto para imagem, caracterizado por seu profundo entendimento do inglês e do chinês, bem como por um impressionante grau de fotorrealismo. Há três insights-chave que contribuem para o desenvolvimento do Kolors. Em primeiro lugar, diferentemente do grande modelo de linguagem T5 usado no Imagen e no Stable Diffusion 3, o Kolors é construído sobre o General Language Model (GLM), o que aprimora suas capacidades de compreensão tanto em inglês quanto em chinês. Além disso, empregamos um grande modelo de linguagem multimodal para recapturar o extenso conjunto de dados de treinamento para uma compreensão de texto de granularidade fina. Essas estratégias melhoram significativamente a capacidade do Kolors de compreender semânticas intrincadas, particularmente aquelas envolvendo múltiplas entidades, e permitem suas avançadas capacidades de renderização de texto. Em segundo lugar, dividimos o treinamento do Kolors em duas fases: a fase de aprendizado de conceitos com conhecimento amplo e a fase de melhoria de qualidade com dados de alta estética especificamente curados. Além disso, investigamos o papel crítico do agendamento de ruído e introduzimos um agendamento novo para otimizar a geração de imagens em alta resolução. Essas estratégias, coletivamente, aprimoram o apelo visual das imagens em alta resolução geradas. Por fim, propomos um benchmark balanceado por categoria, o KolorsPrompts, que serve como guia para o treinamento e a avaliação do Kolors. Consequentemente, mesmo ao empregar o backbone U-Net comumente utilizado, o Kolors demonstrou desempenho notável em avaliações humanas, superando os modelos open-source existentes e alcançando desempenho no nível do Midjourney-v6, especialmente em termos de apelo visual. Lançaremos o código e os pesos do Kolors em https://github.com/Kwai-Kolors/Kolors, e esperamos que isso benefite pesquisas e aplicações futuras na comunidade de geração visual.
Exemplo de uso
import torch
from diffusers import DPMSolverMultistepScheduler, KolorsPipeline
pipe = KolorsPipeline.from_pretrained("Kwai-Kolors/Kolors-diffusers", dtype=torch.float16, variant="fp16")
pipe.to("cuda") # or "mps", "xpu", "cpu"
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 precisa de um IP Adapter diferente para funcionar e usa Openai-CLIP-336 como codificador de imagem.
Usar um IP Adapter com Kolors requer mais de 24GB de VRAM. Para usá-lo, recomendamos usar enable_model_cpu_offload() em GPUs de consumo.
Embora o Kolors esteja integrado ao Diffusers, você precisa carregar o codificador de imagem de uma revisão para usar os arquivos safetensor. Você ainda pode usar o branch principal do repositório original, se estiver confortável carregando checkpoints 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,
dtype=torch.float16,
revision="refs/pr/4",
)
pipe = KolorsPipeline.from_pretrained(
"Kwai-Kolors/Kolors-diffusers", image_encoder=image_encoder, 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
classe diffusers.KolorsPipeline
< source >( vae: AutoencoderKLtext_encoder: ChatGLMModeltokenizer: ChatGLMTokenizerunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersimage_encoder: CLIPVisionModelWithProjection = Nonefeature_extractor: CLIPImageProcessorPil = Noneforce_zeros_for_empty_prompt: bool = False )
Parâmetros
- vae (AutoencoderKL) — Modelo de Variational Auto-Encoder (VAE) para codificar e decodificar imagens para e a partir de representações latentes.
- text_encoder (
ChatGLMModel) — Codificador de texto congelado. O Kolors usa ChatGLM3-6B. - tokenizer (
ChatGLMTokenizer) — Tokenizer da classe ChatGLMTokenizer. - unet (UNet2DConditionModel) — Arquitetura U-Net condicional para desruidar os latentes da imagem codificada.
- scheduler (SchedulerMixin) —
Um scheduler a ser usado em combinação com
unetpara desruidar os latentes da imagem codificada. Pode ser um de DDIMScheduler, LMSDiscreteScheduler ou PNDMScheduler. - force_zeros_for_empty_prompt (
bool, opcional, padrão"False") — Se as embeddings do prompt negativo devem ser forçadas a serem sempre definidas como 0. Veja também a configuração deKwai-Kolors/Kolors-diffusers.
Pipeline para geração de texto para imagem usando Kolors.
Este modelo herda de DiffusionPipeline. Consulte a documentação da superclasse para os métodos genéricos que a biblioteca implementa para todos os pipelines (como download ou salvamento, execução em um dispositivo específico, etc.)
O pipeline também herda os seguintes métodos de carregamento:
- load_lora_weights() para carregar os pesos do LoRA
- save_lora_weights() para salvar os pesos do LoRA
- load_ip_adapter() para carregar IP Adapters
encode_prompt
< source >( promptdevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = Truenegative_prompt = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 256 )
Parâmetros
- prompt (
stroulist[str], opcional) — prompt a ser codificado - device — (
torch.device): dispositivo torch - num_images_per_prompt (
int) — número de imagens que devem ser geradas por prompt - do_classifier_free_guidance (
bool) — se deve usar classifier free guidance ou não - negative_prompt (
stroulist[str], opcional) — O prompt ou os prompts que não devem orientar a geração da imagem. Se não for definido, é necessário passarnegative_prompt_embedsem vez disso. Ignorado quando não se usa orientação (ou seja, ignorado seguidance_scalefor menor que1). - prompt_embeds (
torch.FloatTensor, opcional) — Incorporações de texto pré-geradas. Podem ser usadas para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não forem fornecidas, as incorporações de texto serão geradas a partir do argumento de entradaprompt. - pooled_prompt_embeds (
torch.Tensor, opcional) — Embeddings de texto agrupados pré-gerados. Podem ser usados para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não fornecidos, os embeddings de texto agrupados serão gerados a partir do argumento de entradaprompt. - negative_prompt_embeds (
torch.FloatTensor, opcional) — Incorporações de texto negativas pré-geradas. Pode ser usado para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não for fornecido, negative_prompt_embeds será gerado a partir do argumento de entradanegative_prompt. - negative_pooled_prompt_embeds (
torch.Tensor, opcional) — Embeddings de texto negativo pré-gerados. Pode ser usado para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompt. Se não for fornecido, os pooled negative_prompt_embeds serão gerados a partir do argumento de entradanegative_prompt. - max_sequence_length (
intpadrão 256) — Comprimento máximo da sequência a ser usado com oprompt.
Codifica o prompt em estados ocultos do codificador de texto.
get_guidance_scale_embedding
< source >( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor
Parâmetros
- w (
torch.Tensor) — Gera vetores de incorporação com uma escala de orientação especificada para, em seguida, enriquecer as incorporações de passo de tempo. - embedding_dim (
int, opcional, padrão 512) — Dimensão dos embeddings a serem gerados. - dtype (
torch.dtype, opcional, padrãotorch.float32) — Tipo de dados dos embeddings gerados.
Retorna
torch.Tensor
Vetores de incorporação com forma (len(w), embedding_dim).
- todos
- call
KolorsImg2ImgPipeline
classe diffusers.KolorsImg2ImgPipeline
< source >( vae: AutoencoderKLtext_encoder: ChatGLMModeltokenizer: ChatGLMTokenizerunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersimage_encoder: CLIPVisionModelWithProjection = Nonefeature_extractor: CLIPImageProcessorPil = Noneforce_zeros_for_empty_prompt: bool = False )
Parâmetros
- vae (AutoencoderKL) — Modelo de Variational Auto-Encoder (VAE) para codificar e decodificar imagens para e a partir de representações latentes.
- text_encoder (
ChatGLMModel) — Codificador de texto congelado. O Kolors usa ChatGLM3-6B. - tokenizer (
ChatGLMTokenizer) — Tokenizer da classe ChatGLMTokenizer. - unet (UNet2DConditionModel) — Arquitetura U-Net condicional para desruidar os latentes da imagem codificada.
- scheduler (SchedulerMixin) —
Um scheduler a ser usado em combinação com
unetpara desruidar os latentes da imagem codificada. Pode ser um de DDIMScheduler, LMSDiscreteScheduler ou PNDMScheduler. - force_zeros_for_empty_prompt (
bool, opcional, padrão"False") — Se as embeddings do prompt negativo devem ser forçadas a serem sempre definidas como 0. Veja também a configuração deKwai-Kolors/Kolors-diffusers.
Pipeline para geração de texto para imagem usando Kolors.
Este modelo herda de DiffusionPipeline. Consulte a documentação da superclasse para os métodos genéricos que a biblioteca implementa para todos os pipelines (como download ou salvamento, execução em um dispositivo específico, etc.)
O pipeline também herda os seguintes métodos de carregamento:
- load_lora_weights() para carregar os pesos do LoRA
- save_lora_weights() para salvar os pesos do LoRA
- load_ip_adapter() para carregar IP Adapters
encode_prompt
< source >( promptdevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = Truenegative_prompt = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 256 )
Parâmetros
- prompt (
stroulist[str], opcional) — prompt a ser codificado - device — (
torch.device): dispositivo torch - num_images_per_prompt (
int) — número de imagens que devem ser geradas por prompt - do_classifier_free_guidance (
bool) — se deve usar classifier free guidance ou não - negative_prompt (
stroulist[str], opcional) — O prompt ou os prompts que não devem orientar a geração da imagem. Se não for definido, é necessário passarnegative_prompt_embedsem vez disso. Ignorado quando não se usa orientação (ou seja, ignorado seguidance_scalefor menor que1). - prompt_embeds (
torch.FloatTensor, opcional) — Incorporações de texto pré-geradas. Podem ser usadas para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não forem fornecidas, as incorporações de texto serão geradas a partir do argumento de entradaprompt. - pooled_prompt_embeds (
torch.Tensor, opcional) — Embeddings de texto agrupados pré-gerados. Podem ser usados para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não fornecidos, os embeddings de texto agrupados serão gerados a partir do argumento de entradaprompt. - negative_prompt_embeds (
torch.FloatTensor, opcional) — Incorporações de texto negativas pré-geradas. Pode ser usado para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não for fornecido, negative_prompt_embeds será gerado a partir do argumento de entradanegative_prompt. - negative_pooled_prompt_embeds (
torch.Tensor, opcional) — Embeddings de texto negativo pré-gerados. Pode ser usado para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompt. Se não for fornecido, os pooled negative_prompt_embeds serão gerados a partir do argumento de entradanegative_prompt. - max_sequence_length (
intpadrão 256) — Comprimento máximo da sequência a ser usado com oprompt.
Codifica o prompt em estados ocultos do codificador de texto.
get_guidance_scale_embedding
< source >( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor
Parâmetros
- w (
torch.Tensor) — Gera vetores de incorporação com uma escala de orientação especificada para, em seguida, enriquecer as incorporações de passo de tempo. - embedding_dim (
int, opcional, padrão 512) — Dimensão dos embeddings a serem gerados. - dtype (
torch.dtype, opcional, padrãotorch.float32) — Tipo de dados dos embeddings gerados.
Retorna
torch.Tensor
Vetores de incorporação com forma (len(w), embedding_dim).
- todos
- call