Diffusers documentation

ControlNetModel

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

ControlNetModel

ControlNetモデルは、Lvmin Zhang、Anyi Rao、Maneesh Agrawala による Adding Conditional Control to Text-to-Image Diffusion Models で紹介されました。エッジマップ、深度マップ、セグメンテーションマップ、ポーズ検出用のキーポイントなどの追加入力に対してモデルを条件付けすることで、テキストから画像を生成する際の制御性を高めます。

論文の抄録は以下の通りです:

本稿では、大規模な事前学習済みテキストから画像への拡散モデルに空間的条件付け制御を追加するためのニューラルネットワークアーキテクチャであるControlNetを提案します。ControlNetは、実運用可能な大規模拡散モデルを固定し、数十億枚の画像で事前学習された深く頑健なエンコーディング層を強力なバックボーンとして再利用することで、多様な条件付け制御のセットを学習します。このニューラルアーキテクチャは、「ゼロ畳み込み」(ゼロ初期化された畳み込み層)によって接続されており、パラメータをゼロから段階的に増加させ、有害なノイズがファインチューニングに影響を与えないことを保証します。Stable Diffusionを用いて、エッジ、深度、セグメンテーション、人間のポーズなどの様々な条件付け制御を、プロンプトの有無にかかわらず、単一または複数の条件を用いてテストしました。ControlNetの学習は、小規模(<50k)および大規模(>1m)のデータセットのいずれにおいても頑健であることが示されています。広範な結果から、ControlNetは画像拡散モデルの制御に関するより幅広いアプリケーションを促進し得ることが示されました。

元の形式から読み込む

デフォルトでは、ControlNetModelはfrom_pretrained()で読み込む必要がありますが、FromOriginalModelMixin.from_single_fileを使用して元の形式から読み込むこともできます。以下のようにします:

from diffusers import StableDiffusionControlNetPipeline, ControlNetModel

url = "https://huggingface.co/lllyasviel/ControlNet-v1-1/blob/main/control_v11p_sd15_canny.pth"  # can also be a local path
controlnet = ControlNetModel.from_single_file(url)

url = "https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/blob/main/v1-5-pruned.safetensors"  # can also be a local path
pipe = StableDiffusionControlNetPipeline.from_single_file(url, controlnet=controlnet)

Control LoRAからの読み込み

Control-LoRA は、Stability AI が stabilityai/control-lora で ControlNet に低ランクのパラメータ効率の良いファインチューニングを追加することによって導入されました。このアプローチにより、より効率的かつコンパクトな方法で、より幅広い消費者向け GPU に対してモデルの制御を可能にします。

from diffusers import ControlNetModel, UNet2DConditionModel

lora_id = "stabilityai/control-lora"
lora_filename = "control-LoRAs-rank128/control-lora-canny-rank128.safetensors"

unet = UNet2DConditionModel.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", subfolder="unet", dtype=torch.bfloat16).to("cuda")  # or "mps", "xpu", "cpu"
controlnet = ControlNetModel.from_unet(unet).to(device="cuda", dtype=torch.bfloat16)
controlnet.load_lora_adapter(lora_id, weight_name=lora_filename, prefix=None, controlnet_config=controlnet.config)

ControlNetModel

クラス diffusers.ControlNetModel

< >

( in_channels: int = 4conditioning_channels: int = 3flip_sin_to_cos: bool = Truefreq_shift: int = 0down_block_types: tuple = ('CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'DownBlock2D')mid_block_type: str | None = 'UNetMidBlock2DCrossAttn'only_cross_attention: bool | tuple[bool] = Falseblock_out_channels: tuple = (320, 640, 1280, 1280)layers_per_block: int = 2downsample_padding: int = 1mid_block_scale_factor: float = 1act_fn: str = 'silu'norm_num_groups: int | None = 32norm_eps: float = 1e-05cross_attention_dim: int = 1280transformer_layers_per_block: int | tuple[int, ...] = 1encoder_hid_dim: int | None = Noneencoder_hid_dim_type: str | None = Noneattention_head_dim: int | tuple[int, ...] = 8num_attention_heads: int | tuple[int, ...] | None = Noneuse_linear_projection: bool = Falseclass_embed_type: str | None = Noneaddition_embed_type: str | None = Noneaddition_time_embed_dim: int | None = Nonenum_class_embeds: int | None = Noneupcast_attention: bool = Falseresnet_time_scale_shift: str = 'default'projection_class_embeddings_input_dim: int | None = Nonecontrolnet_conditioning_channel_order: str = 'rgb'conditioning_embedding_out_channels: tuple[int, ...] | None = (16, 32, 96, 256)global_pool_conditions: bool = Falseaddition_embed_type_num_heads: int = 64 )

パラメータ

  • in_channels (int、デフォルト値は 4) — 入力サンプルのチャネル数。
  • flip_sin_to_cos (bool、デフォルトはTrue) — 時間埋め込みにおいて sin を cos に反転させるかどうか。
  • freq_shift (int、デフォルト値は 0) — 時間埋め込みに適用する周波数シフト。
  • down_block_types (tuple[str]、デフォルトは ("CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "DownBlock2D")) — 使用するダウンサンプリングブロックのタプルです。
  • only_cross_attention (bool | tuple[bool]、デフォルトは False) —
  • block_out_channels (tuple[int]、デフォルトは (320, 640, 1280, 1280)) — 各ブロックの出力チャネル数を表すタプルです。
  • layers_per_block (int、デフォルト値は 2) — ブロックあたりのレイヤー数です。
  • downsample_padding (int、デフォルト値は 1) — ダウンサンプリング用畳み込みで使用するパディング。
  • mid_block_scale_factor (float、デフォルト値は 1) — mid block に使用するスケール係数です。
  • act_fn (str、デフォルトは “silu”) — 使用する活性化関数。
  • norm_num_groups (int、任意、デフォルトは 32) — 正規化に使用するグループ数です。None の場合、後処理で正規化層と活性化層はスキップされます。
  • norm_eps (float、デフォルト値は 1e-5) — 正規化に使用する epsilon です。
  • cross_attention_dim (int、デフォルト値は 1280)— クロスアテンション特徴量の次元数です。
  • transformer_layers_per_block (int または tuple[int]、省略可、デフォルトは 1) — BasicTransformerBlock 型の Transformer ブロックの数。~models.unet_2d_blocks.CrossAttnDownBlock2D、~models.unet_2d_blocks.CrossAttnUpBlock2D、~models.unet_2d_blocks.UNetMidBlock2DCrossAttn の場合にのみ関連します。
  • encoder_hid_dim (int、任意、デフォルトは None)— encoder_hid_dim_type が定義されている場合、encoder_hidden_states は encoder_hid_dim 次元から cross_attention_dim 次元へ射影されます。
  • encoder_hid_dim_type (str、任意、デフォルトは None) — 指定された場合、encoder_hidden_states およびその他の埋め込みが、encoder_hid_dim_type に従って、次元 cross_attention のテキスト埋め込みにダウンプロジェクトされます。
  • attention_head_dim (int | tuple[int]、デフォルトは 8) — アテンションヘッドの次元です。
  • use_linear_projection (bool、デフォルトはFalse) —
  • class_embed_type (str、省略可、デフォルトは None) — 最終的に time embeddings と加算される class embedding の種類です。None、"timestep"、"identity"、"projection"、"simple_projection" から選択してください。
  • addition_embed_type (str、省略可、デフォルトはNone) — 時間埋め込みに加算される任意の埋め込みを設定します。Noneまたは“text”から選択します。“text”を指定すると、TextTimeEmbeddingレイヤーが使用されます。
  • num_class_embeds (int、省略可、デフォルト値は 0) — class_embed_type が None の場合、クラス条件付けを行う際に time_embed_dim へ射影される学習可能な埋め込み行列の入力次元。
  • upcast_attention(bool、デフォルトはFalse)—
  • resnet_time_scale_shift (str、デフォルトは "default") — ResNet ブロック用の time scale shift 設定(ResnetBlock2D を参照)。default または scale_shift から選択します。
  • projection_class_embeddings_input_dim (int、任意、デフォルトは None) — class_embed_type="projection" の場合の class_labels 入力の次元数です。class_embed_type="projection" の場合に必須です。
  • controlnet_conditioning_channel_order (str、デフォルトは "rgb") — 条件付き画像のチャネル順序です。bgr の場合は rgb に変換されます。
  • conditioning_embedding_out_channels (tuple[int]、任意、デフォルトは (16, 32, 96, 256)) — conditioning_embedding レイヤー内の各ブロックの出力チャネル数を表すタプルです。
  • global_pool_conditions (bool、デフォルトは False) — TODO(Patrick) - 未使用のパラメータです。
  • addition_embed_type_num_heads (int、デフォルト値は 64) — TextTimeEmbedding レイヤーで使用するヘッド数です。

ControlNetモデル。

forward

< >

( sample: Tensortimestep: typing.Union[torch.Tensor, float, int]encoder_hidden_states: Tensorcontrolnet_cond: Tensorconditioning_scale: float = 1.0class_labels: typing.Optional[torch.Tensor] = Nonetimestep_cond: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneadded_cond_kwargs: dict[str, torch.Tensor] | None = Nonecross_attention_kwargs: dict[str, typing.Any] | None = Noneguess_mode: bool = Falsereturn_dict: bool = True ) → ControlNetOutput or tuple

パラメータ

  • sample (torch.Tensor) — ノイズ付きの入力テンソルです。
  • timestep (torch.Tensor | float | int) — 入力ノイズを除去するためのタイムステップ数です。
  • encoder_hidden_states (torch.Tensor) — エンコーダーの隠れ状態です。
  • controlnet_cond (torch.Tensor) — (batch_size, sequence_length, hidden_size) の形状を持つ条件付き入力テンソルです。
  • conditioning_scale (float、デフォルト値は 1.0) — ControlNet の出力に対するスケール係数です。
  • class_labels (torch.Tensor、任意、デフォルトはNone) — 条件付け用の任意のクラスラベルです。その埋め込みは、タイムステップの埋め込みと加算されます。
  • timestep_cond (torch.Tensor、任意、デフォルトは None) — timestep 用の追加の条件埋め込みです。指定された場合、これらの埋め込みは self.time_embedding レイヤーを介して渡される timestep_embedding に加算され、最終的な timestep 埋め込みが得られます。
  • attention_mask (torch.Tensor、任意、デフォルトは None) — encoder_hidden_states に適用される、形状が (batch, key_tokens) のアテンションマスクです。1 の場合はマスクが保持され、0 の場合は破棄されます。マスクはバイアスに変換され、「破棄」対象のトークンに対応するアテンションスコアに大きな負の値が加算されます。
  • added_cond_kwargs (dict) — Stable Diffusion XL UNet用の追加条件。
  • cross_attention_kwargs (dict[str]、省略可、デフォルトはNone) — 指定された場合、AttnProcessor に渡される kwargs の辞書です。
  • guess_mode (bool、デフォルトは False) — このモードでは、すべてのプロンプトを削除した場合でも、ControlNet エンコーダーは入力内容の認識に最大限努めます。guidance_scale は 3.0 から 5.0 の範囲が推奨されます。
  • return_dict (bool、デフォルトは True) — プレーンなタプルの代わりに ControlNetOutput を返すかどうかを指定します。

戻り値

ControlNetOutput または tuple

return_dict が True の場合、ControlNetOutput が返され、それ以外の場合は、最初の要素がサンプルテンソルであるタプルが返されます。

ControlNetModelのforwardメソッド。

from_unet

< >

( unet: UNet2DConditionModelcontrolnet_conditioning_channel_order: str = 'rgb'conditioning_embedding_out_channels: tuple[int, ...] | None = (16, 32, 96, 256)load_weights_from_unet: bool = Trueconditioning_channels: int = 3 )

パラメータ

  • unet (UNet2DConditionModel) — The UNet model weights to copy to the ControlNetModel. All configuration options are also copied where applicable.

UNet2DConditionModelからControlNetModelをインスタンス化します。

set_attention_slice

< >

( slice_size: str | int | list[int] )

パラメータ

  • slice_size (str または int または list(int)、任意、デフォルトは "auto") — "auto" の場合、アテンションヘッドへの入力が半分になり、アテンションは2段階で計算されます。 "max" の場合、一度に1つのスライスのみを実行することで、最大限のメモリを節約します。数値が指定された場合、attention_head_dim // slice_size 個のスライスを使用します。この場合、attention_head_dim は slice_size の倍数である必要があります。

スライスされたアテンションの計算を有効にします。

このオプションが有効な場合、attention モジュールは入力テンソルをスライスに分割し、複数ステップで attention を計算します。これは、わずかな速度低下を代償にメモリを節約するために有用です。

set_default_attn_processor

< >

( )

カスタムアテンションプロセッサを無効にし、デフォルトのアテンション実装を設定します。

ControlNetOutput

クラス diffusers.models.controlnets.ControlNetOutput

< >

( down_block_res_samples: tuplemid_block_res_sample: Tensor )

パラメータ

  • down_block_res_samples (tuple[torch.Tensor]) — 各ダウンサンプリングブロックにおける、異なる解像度のダウンサンプル活性化値のタプルです。各テンソルの形状は (batch_size, channel * resolution, height //resolution, width // resolution) である必要があります。出力は、元の UNet のダウンサンプリング活性化値の条件付けに使用できます。
  • mid_down_block_re_sample (torch.Tensor) — 中間ブロックの活性化(最も低いサンプル解像度)です。各テンソルの形状は (batch_size, channel * lowest_resolution, height // lowest_resolution, width // lowest_resolution) である必要があります。出力は、元の UNet の中間ブロックの活性化を条件付けするために使用できます。

ControlNetModelの出力です。

Update on GitHub