Diffusers documentation

Kolors: 写実的なテキストから画像への合成のための拡散モデルの効果的な学習

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Kolors: 写実的なテキストから画像への合成のための拡散モデルの効果的な学習

LoRA MPS

Kolors は、Kuaishou Kolors チームによって開発された、潜在拡散モデルに基づく大規模なテキストから画像を生成するモデルです。数十億のテキストと画像のペアで学習された Kolors は、視覚的な品質、複雑な意味の正確さ、および中国語と英語の文字のレンダリングにおいて、オープンソースモデルおよびクローズドソースモデルの両方に対して顕著な優位性を示しています。さらに、Kolors は中国語と英語の両方の入力をサポートしており、中国語固有のコンテンツの理解と生成において優れたパフォーマンスを発揮します。詳細については、この技術レポートを参照してください。

技術レポートの要旨は以下の通りです:

本稿では、テキストから画像を生成する潜在拡散モデル Kolors を提案します。Kolors は、英語と中国語の両方に対する深い理解力と、印象的なフォトリアリズム(写実性)を特徴としています。Kolors の開発に貢献した重要な洞察は3つあります。第一に、Imagen や Stable Diffusion 3 で使用されている大規模言語モデル T5 とは異なり、Kolors は General Language Model (GLM) を基盤として構築されており、これにより英語と中国語の両方における理解能力が強化されています。さらに、多モーダル大規模言語モデルを用いて、広範なトレーニングデータセットのキャプションを再記述し、細粒度のテキスト理解を実現しています。これらの戦略により、特に複数のエンティティを含む複雑なセマンティクスの理解能力が大幅に向上し、高度なテキストレンダリング機能が実現されています。第二に、Kolors のトレーニングを2つのフェーズに分割しています。広範な知識を用いた概念学習フェーズと、特に厳選された高審美的データを用いた品質向上フェーズです。さらに、ノイズスケジュールの重要な役割を調査し、高解像度画像生成を最適化するための新しいスケジュールを導入しました。これらの戦略により、生成される高解像度画像の視覚的な魅力が総合的に向上しています。最後に、カテゴリバランスの取れたベンチマーク KolorsPrompts を提案し、Kolors のトレーニングと評価のガイドとして機能するようにしました。その結果、一般的に使用される U-Net バックボーンを採用しているにもかかわらず、Kolors は人間評価において顕著なパフォーマンスを示し、既存のオープンソースモデルを上回り、特に視覚的な魅力の面で Midjourney-v6 レベルのパフォーマンスを達成しました。Kolors のコードと重みは https://github.com/Kwai-Kolors/Kolors で公開予定であり、視覚生成コミュニティにおける将来の研究や応用に貢献することを期待しています。

使用例

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 は動作するために別の IP Adapter が必要であり、画像エンコーダーとして Openai-CLIP-336 を使用します。

KolorsでIP Adapterを使用するには、24GBを超えるVRAMが必要です。コンシューマー向け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,
    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

< >

( vae: AutoencoderKLtext_encoder: ChatGLMModeltokenizer: ChatGLMTokenizerunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersimage_encoder: CLIPVisionModelWithProjection = Nonefeature_extractor: CLIPImageProcessorPil = Noneforce_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 を使用したテキストから画像への生成を行う Pipeline です。

このモデルは DiffusionPipeline を継承しています。すべてのパイプラインに対してライブラリが実装している汎用的なメソッド(ダウンロードや保存、特定のデバイスでの実行など)については、スーパークラスのドキュメントを参照してください。

パイプラインは、以下の読み込みメソッドも継承します:

encode_prompt

< >

( 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 )

パラメータ

  • prompt (str または list[str]、省略可能) — エンコードするプロンプト
  • device — (torch.device): torch デバイス
  • num_images_per_prompt (int) — 1つのプロンプトに対して生成する画像の数
  • do_classifier_free_guidance (bool) — classifier free guidance を使用するかどうか
  • 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 入力引数から negative_prompt_embeds が生成されます。
  • negative_pooled_prompt_embeds (torch.Tensor, 任意) — 事前に生成されたネガティブなプーリング済みテキスト埋め込み。テキスト入力の調整、例えばプロンプトの重み付けなどを容易に行うために使用できます。指定されない場合、negative_prompt 入力引数からプーリング済み negative_prompt_embeds が生成されます。
  • max_sequence_length (int、デフォルトは 256) — prompt に使用する最大シーケンス長。

プロンプトをテキストエンコーダーの隠れ状態にエンコードします。

get_guidance_scale_embedding

< >

( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor

パラメータ

  • w (torch.Tensor) — 指定されたガイダンススケールで埋め込みベクトルを生成し、タイムステップ埋め込みを後で強化するために使用します。
  • embedding_dim (int, 任意、デフォルトは 512) — 生成する埋め込みの次元数。
  • dtype (torch.dtype、任意、デフォルトは torch.float32) — 生成される埋め込みのデータ型です。

戻り値

torch.Tensor

(len(w), embedding_dim) の形状を持つ埋め込みベクトル。

https://github.com/google-research/vdm/blob/dc27b98a554f65cdc654b800da5aa1846545d41b/model_vdm.py#L298 を参照してください。

  • すべて
  • call

KolorsImg2ImgPipeline

class diffusers.KolorsImg2ImgPipeline

< >

( vae: AutoencoderKLtext_encoder: ChatGLMModeltokenizer: ChatGLMTokenizerunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersimage_encoder: CLIPVisionModelWithProjection = Nonefeature_extractor: CLIPImageProcessorPil = Noneforce_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 を使用したテキストから画像への生成を行う Pipeline です。

このモデルは DiffusionPipeline を継承しています。すべてのパイプラインに対してライブラリが実装している汎用的なメソッド(ダウンロードや保存、特定のデバイスでの実行など)については、スーパークラスのドキュメントを参照してください。

パイプラインは、以下の読み込みメソッドも継承します:

encode_prompt

< >

( 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 )

パラメータ

  • prompt (str または list[str]、省略可能) — エンコードするプロンプト
  • device — (torch.device): torch デバイス
  • num_images_per_prompt (int) — 1つのプロンプトに対して生成する画像の数
  • do_classifier_free_guidance (bool) — classifier free guidance を使用するかどうか
  • 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 入力引数から negative_prompt_embeds が生成されます。
  • negative_pooled_prompt_embeds (torch.Tensor, 任意) — 事前に生成されたネガティブなプーリング済みテキスト埋め込み。テキスト入力の調整、例えばプロンプトの重み付けなどを容易に行うために使用できます。指定されない場合、negative_prompt 入力引数からプーリング済み negative_prompt_embeds が生成されます。
  • max_sequence_length (int、デフォルトは 256) — prompt に使用する最大シーケンス長。

プロンプトをテキストエンコーダーの隠れ状態にエンコードします。

get_guidance_scale_embedding

< >

( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor

パラメータ

  • w (torch.Tensor) — 指定されたガイダンススケールで埋め込みベクトルを生成し、タイムステップ埋め込みを後で強化するために使用します。
  • embedding_dim (int, 任意、デフォルトは 512) — 生成する埋め込みの次元数。
  • dtype (torch.dtype、任意、デフォルトは torch.float32) — 生成される埋め込みのデータ型です。

戻り値

torch.Tensor

(len(w), embedding_dim) の形状を持つ埋め込みベクトル。

https://github.com/google-research/vdm/blob/dc27b98a554f65cdc654b800da5aa1846545d41b/model_vdm.py#L298 を参照してください。

  • すべて
  • call
Update on GitHub