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

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
< source >( 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 を継承しています。すべてのパイプラインに対してライブラリが実装している汎用的なメソッド(ダウンロードや保存、特定のデバイスでの実行など)については、スーパークラスのドキュメントを参照してください。
パイプラインは、以下の読み込みメソッドも継承します:
- LoRA重みの読み込みにload_lora_weights()
- LoRA重みの保存にはsave_lora_weights()を使用します
- IP Adapterの読み込みにload_ip_adapter()
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 )
パラメータ
- 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
< source >( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor
- すべて
- call
KolorsImg2ImgPipeline
class diffusers.KolorsImg2ImgPipeline
< source >( 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 を継承しています。すべてのパイプラインに対してライブラリが実装している汎用的なメソッド(ダウンロードや保存、特定のデバイスでの実行など)については、スーパークラスのドキュメントを参照してください。
パイプラインは、以下の読み込みメソッドも継承します:
- LoRA重みの読み込みにload_lora_weights()
- LoRA重みの保存にはsave_lora_weights()を使用します
- IP Adapterの読み込みにload_ip_adapter()
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 )
パラメータ
- 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
< source >( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor
- すべて
- call