# Kolors : Entraînement efficace d'un modèle de diffusion pour la synthèse photoréaliste d'images à partir de texte

  
  

![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/kolors/kolors_header_collage.png)

Kolors est un modèle de génération d’images à partir de texte à grande échelle, basé sur la diffusion latente, développé par [l’équipe Kuaishou Kolors](https://github.com/Kwai-Kolors/Kolors). Entraîné sur des milliards de paires texte-image, Kolors présente des avantages significatifs par rapport aux modèles open source et fermés, en termes de qualité visuelle, de précision sémantique complexe et de rendu du texte pour les caractères chinois et anglais. De plus, Kolors prend en charge les entrées en chinois et en anglais, démontrant de solides performances dans la compréhension et la génération de contenu spécifique au chinois. Pour plus de détails, veuillez consulter ce [rapport technique](https://github.com/Kwai-Kolors/Kolors/blob/master/imgs/Kolors_paper.pdf).

L'abstract du rapport technique est le suivant :

*Nous présentons Kolors, un modèle de diffusion latente pour la synthèse d’images à partir de texte, caractérisé par sa compréhension approfondie de l’anglais et du chinois, ainsi que par un degré impressionnant de photoréalisme. Trois idées clés ont contribué au développement de Kolors. Premièrement, contrairement au grand modèle de langage T5 utilisé dans Imagen et Stable Diffusion 3, Kolors est construit sur le General Language Model (GLM), ce qui renforce ses capacités de compréhension en anglais et en chinois. De plus, nous utilisons un grand modèle de langage multimodal pour réécrire les légendes de l’ensemble de données d’entraînement étendu afin d’obtenir une compréhension fine du texte. Ces stratégies améliorent considérablement la capacité de Kolors à comprendre des sémantiques complexes, en particulier celles impliquant plusieurs entités, et permettent ses avancées en matière de rendu de texte. Deuxièmement, nous divisons l’entraînement de Kolors en deux phases : la phase d’apprentissage des concepts avec des connaissances larges et la phase d’amélioration de la qualité avec des données à haute esthétique spécifiquement sélectionnées. En outre, nous étudions le rôle crucial du calendrier de bruit et introduisons un nouveau calendrier pour optimiser la génération d’images haute résolution. Ces stratégies améliorent collectivement l’attrait visuel des images haute résolution générées. Enfin, nous proposons un benchmark équilibré par catégorie, KolorsPrompts, qui sert de guide pour l’entraînement et l’évaluation de Kolors. Par conséquent, même en utilisant l’architecture U-Net couramment employée, Kolors a démontré des performances remarquables lors des évaluations humaines, surpassant les modèles open source existants et atteignant un niveau de performance comparable à Midjourney-v6, en particulier en termes d’attrait visuel. Nous publierons le code et les poids de Kolors à , et espérons qu’ils bénéficieront aux recherches et applications futures au sein de la communauté de la génération visuelle.*

## Exemple d'utilisation

```python
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 nécessite un adaptateur IP différent pour fonctionner et utilise [Openai-CLIP-336](https://huggingface.co/openai/clip-vit-large-patch14-336) comme encodeur d'images.

> [!TIP]
> L'utilisation d'un IP Adapter avec Kolors nécessite plus de 24 Go de VRAM. Pour l'utiliser, nous recommandons d'employer [enable_model_cpu_offload()](/docs/diffusers/v0.43.0/fr/api/pipelines/overview#diffusers.DiffusionPipeline.enable_model_cpu_offload) sur les GPU grand public.

> [!TIP]
> Bien que Kolors soit intégré dans Diffusers, vous devez charger l’encodeur d’image depuis une révision pour utiliser les fichiers safetensor. Vous pouvez toujours utiliser la branche principale du dépôt d’origine si vous êtes à l’aise avec le chargement de points de contrôle pickle.

```python
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[[diffusers.KolorsPipeline]]

#### diffusers.KolorsPipeline[[diffusers.KolorsPipeline]]

```python
diffusers.KolorsPipeline(vae: AutoencoderKL, text_encoder: ChatGLMModel, tokenizer: ChatGLMTokenizer, unet: UNet2DConditionModel, scheduler: KarrasDiffusionSchedulers, image_encoder: CLIPVisionModelWithProjection = None, feature_extractor: CLIPImageProcessorPil = None, force_zeros_for_empty_prompt: bool = False)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/kolors/pipeline_kolors.py#L123)

**Paramètres :**

vae ([AutoencoderKL](/docs/diffusers/v0.43.0/fr/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Modèle de Variational Auto-Encoder (VAE) pour encoder et décoder des images vers et depuis des représentations latentes.

text_encoder (`ChatGLMModel`) : encodeur de texte figé. Kolors utilise [ChatGLM3-6B](https://huggingface.co/THUDM/chatglm3-6b).

tokenizer (`ChatGLMTokenizer`) : Tokenizer de la classe [ChatGLMTokenizer](https://huggingface.co/THUDM/chatglm3-6b/blob/main/tokenization_chatglm.py).

unet ([UNet2DConditionModel](/docs/diffusers/v0.43.0/fr/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : architecture U-Net conditionnelle pour le débruitage des latents d'image encodés.

scheduler ([SchedulerMixin](/docs/diffusers/v0.43.0/fr/api/schedulers/overview#diffusers.SchedulerMixin)) : Un planificateur à utiliser en combinaison avec `unet` pour débruyer les latents de l'image encodée. Peut être l'un des [DDIMScheduler](/docs/diffusers/v0.43.0/fr/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/fr/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) ou [PNDMScheduler](/docs/diffusers/v0.43.0/fr/api/schedulers/pndm#diffusers.PNDMScheduler).

force_zeros_for_empty_prompt (`bool`, *facultatif*, valeur par défaut `"False"`) : Indique si les embeddings du prompt négatif doivent être forcés à être toujours définis à 0. Voir également la configuration de `Kwai-Kolors/Kolors-diffusers`.

Pipeline pour la génération d'images à partir de texte utilisant Kolors.

Ce modèle hérite de [DiffusionPipeline](/docs/diffusers/v0.43.0/fr/api/pipelines/overview#diffusers.DiffusionPipeline). Consultez la documentation de la classe parente pour les méthodes génériques que la bibliothèque implémente pour tous les pipelines (téléchargement ou sauvegarde, exécution sur un appareil particulier, etc.).

Le pipeline hérite également des méthodes de chargement suivantes :
- [load_lora_weights()](/docs/diffusers/v0.43.0/fr/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.load_lora_weights) pour charger les poids LoRA
- [save_lora_weights()](/docs/diffusers/v0.43.0/fr/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.save_lora_weights) pour enregistrer les poids LoRA
- [load_ip_adapter()](/docs/diffusers/v0.43.0/fr/api/loaders/ip_adapter#diffusers.loaders.IPAdapterMixin.load_ip_adapter) pour charger des IP Adapters

#### encode_prompt[[diffusers.KolorsPipeline.encode_prompt]]

```python
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)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/kolors/pipeline_kolors.py#L199)

**Paramètres :**

prompt (`str` ou `list[str]`, *facultatif*) : invite à encoder

device : (`torch.device`) : appareil torch

num_images_per_prompt (`int`) : nombre d'images à générer par invite

do_classifier_free_guidance (`bool`) : indique s'il faut utiliser le guidage sans classifieur ou non

negative_prompt (`str` ou `list[str]`, *facultatif*) : Le prompt ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passer `negative_prompt_embeds` à la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré si `guidance_scale` est inférieur à `1`).

prompt_embeds (`torch.FloatTensor`, *facultatif*) : Incrustations de texte pré-générées. Peut être utilisé pour ajuster facilement les entrées de texte, *par ex.* pondération des prompts. Si non fourni, les incrustations de texte seront générées à partir de l'argument d'entrée `prompt`.

pooled_prompt_embeds (`torch.Tensor`, *facultatif*) : Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, *par ex.* le pondération des prompts. S'il n'est pas fourni, les embeddings de texte seront générés à partir de l'argument d'entrée `prompt`.

negative_prompt_embeds (`torch.FloatTensor`, *facultatif*) : Incrustations de texte négatif pré-générées. Peut être utilisé pour ajuster facilement les entrées de texte, *par ex.* le pondération des prompts. Si non fourni, negative_prompt_embeds sera généré à partir de l'argument d'entrée `negative_prompt`.

negative_pooled_prompt_embeds (`torch.Tensor`, *facultatif*) : Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, *par ex.* le pondération des prompts. S'il n'est pas fourni, pooled negative_prompt_embeds sera généré à partir de l'argument d'entrée `negative_prompt`.

max_sequence_length (`int` par défaut 256) : Longueur maximale de la séquence à utiliser avec le `prompt`.

Encode le prompt dans les états cachés de l'encodeur de texte.

#### get_guidance_scale_embedding[[diffusers.KolorsPipeline.get_guidance_scale_embedding]]

```python
get_guidance_scale_embedding(w: Tensor, embedding_dim: int = 512, dtype: dtype = torch.float32)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/kolors/pipeline_kolors.py#L590)

**Paramètres :**

w (`torch.Tensor`) : Génère des vecteurs d'incorporation avec une échelle de guidage spécifiée afin d'enrichir par la suite les incorporations de pas de temps.

embedding_dim (`int`, *facultatif*, par défaut 512) : Dimension des embeddings à générer.

dtype (`torch.dtype`, *facultatif*, par défaut `torch.float32`) : Type de données des embeddings générés.

**Retourne :** `torch.Tensor`

Vecteurs d'embedding de forme `(len(w), embedding_dim)`.

Voir https://github.com/google-research/vdm/blob/dc27b98a554f65cdc654b800da5aa1846545d41b/model_vdm.py#L298

- tous
- __appel__

## KolorsImg2ImgPipeline[[diffusers.KolorsImg2ImgPipeline]]

#### diffusers.KolorsImg2ImgPipeline[[diffusers.KolorsImg2ImgPipeline]]

```python
diffusers.KolorsImg2ImgPipeline(vae: AutoencoderKL, text_encoder: ChatGLMModel, tokenizer: ChatGLMTokenizer, unet: UNet2DConditionModel, scheduler: KarrasDiffusionSchedulers, image_encoder: CLIPVisionModelWithProjection = None, feature_extractor: CLIPImageProcessorPil = None, force_zeros_for_empty_prompt: bool = False)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/kolors/pipeline_kolors_img2img.py#L142)

**Paramètres :**

vae ([AutoencoderKL](/docs/diffusers/v0.43.0/fr/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Modèle de Variational Auto-Encoder (VAE) pour encoder et décoder des images vers et depuis des représentations latentes.

text_encoder (`ChatGLMModel`) : encodeur de texte figé. Kolors utilise [ChatGLM3-6B](https://huggingface.co/THUDM/chatglm3-6b).

tokenizer (`ChatGLMTokenizer`) : Tokenizer de la classe [ChatGLMTokenizer](https://huggingface.co/THUDM/chatglm3-6b/blob/main/tokenization_chatglm.py).

unet ([UNet2DConditionModel](/docs/diffusers/v0.43.0/fr/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : architecture U-Net conditionnelle pour le débruitage des latents d'image encodés.

scheduler ([SchedulerMixin](/docs/diffusers/v0.43.0/fr/api/schedulers/overview#diffusers.SchedulerMixin)) : Un planificateur à utiliser en combinaison avec `unet` pour débruyer les latents de l'image encodée. Peut être l'un des [DDIMScheduler](/docs/diffusers/v0.43.0/fr/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/fr/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) ou [PNDMScheduler](/docs/diffusers/v0.43.0/fr/api/schedulers/pndm#diffusers.PNDMScheduler).

force_zeros_for_empty_prompt (`bool`, *facultatif*, valeur par défaut `"False"`) : Indique si les embeddings du prompt négatif doivent être forcés à être toujours définis à 0. Voir également la configuration de `Kwai-Kolors/Kolors-diffusers`.

Pipeline pour la génération d'images à partir de texte utilisant Kolors.

Ce modèle hérite de [DiffusionPipeline](/docs/diffusers/v0.43.0/fr/api/pipelines/overview#diffusers.DiffusionPipeline). Consultez la documentation de la classe parente pour les méthodes génériques que la bibliothèque implémente pour tous les pipelines (téléchargement ou sauvegarde, exécution sur un appareil particulier, etc.).

Le pipeline hérite également des méthodes de chargement suivantes :
- [load_lora_weights()](/docs/diffusers/v0.43.0/fr/api/loaders/lora#diffusers.loaders.StableDiffusionXLLoraLoaderMixin.load_lora_weights) pour charger les poids LoRA
- [save_lora_weights()](/docs/diffusers/v0.43.0/fr/api/loaders/lora#diffusers.loaders.StableDiffusionXLLoraLoaderMixin.save_lora_weights) pour enregistrer les poids LoRA
- [load_ip_adapter()](/docs/diffusers/v0.43.0/fr/api/loaders/ip_adapter#diffusers.loaders.IPAdapterMixin.load_ip_adapter) pour charger des IP Adapters

#### encode_prompt[[diffusers.KolorsImg2ImgPipeline.encode_prompt]]

```python
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)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/kolors/pipeline_kolors_img2img.py#L219)

**Paramètres :**

prompt (`str` ou `list[str]`, *facultatif*) : invite à encoder

device : (`torch.device`) : appareil torch

num_images_per_prompt (`int`) : nombre d'images à générer par invite

do_classifier_free_guidance (`bool`) : indique s'il faut utiliser le guidage sans classifieur ou non

negative_prompt (`str` ou `list[str]`, *facultatif*) : Le prompt ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passer `negative_prompt_embeds` à la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré si `guidance_scale` est inférieur à `1`).

prompt_embeds (`torch.FloatTensor`, *facultatif*) : Incrustations de texte pré-générées. Peut être utilisé pour ajuster facilement les entrées de texte, *par ex.* pondération des prompts. Si non fourni, les incrustations de texte seront générées à partir de l'argument d'entrée `prompt`.

pooled_prompt_embeds (`torch.Tensor`, *facultatif*) : Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, *par ex.* le pondération des prompts. S'il n'est pas fourni, les embeddings de texte seront générés à partir de l'argument d'entrée `prompt`.

negative_prompt_embeds (`torch.FloatTensor`, *facultatif*) : Incrustations de texte négatif pré-générées. Peut être utilisé pour ajuster facilement les entrées de texte, *par ex.* le pondération des prompts. Si non fourni, negative_prompt_embeds sera généré à partir de l'argument d'entrée `negative_prompt`.

negative_pooled_prompt_embeds (`torch.Tensor`, *facultatif*) : Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, *par ex.* le pondération des prompts. S'il n'est pas fourni, pooled negative_prompt_embeds sera généré à partir de l'argument d'entrée `negative_prompt`.

max_sequence_length (`int` par défaut 256) : Longueur maximale de la séquence à utiliser avec le `prompt`.

Encode le prompt dans les états cachés de l'encodeur de texte.

#### get_guidance_scale_embedding[[diffusers.KolorsImg2ImgPipeline.get_guidance_scale_embedding]]

```python
get_guidance_scale_embedding(w: Tensor, embedding_dim: int = 512, dtype: dtype = torch.float32)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/kolors/pipeline_kolors_img2img.py#L718)

**Paramètres :**

w (`torch.Tensor`) : Génère des vecteurs d'incorporation avec une échelle de guidage spécifiée afin d'enrichir par la suite les incorporations de pas de temps.

embedding_dim (`int`, *facultatif*, par défaut 512) : Dimension des embeddings à générer.

dtype (`torch.dtype`, *facultatif*, par défaut `torch.float32`) : Type de données des embeddings générés.

**Retourne :** `torch.Tensor`

Vecteurs d'embedding de forme `(len(w), embedding_dim)`.

Voir https://github.com/google-research/vdm/blob/dc27b98a554f65cdc654b800da5aa1846545d41b/model_vdm.py#L298

- tous
- __appel__

