# ControlNetUnionModel

ControlNetUnionModel adalah implementasi ControlNet untuk Stable Diffusion XL.

Model ControlNet diperkenalkan dalam [ControlNetPlus](https://github.com/xinsir6/ControlNetPlus) oleh xinsir6. Model ini mendukung beberapa input kondisioning tanpa meningkatkan komputasi.

*Kami merancang arsitektur baru yang dapat mendukung lebih dari 10 jenis kontrol dalam pembuatan gambar dari teks bersyarat dan mampu menghasilkan gambar beresolusi tinggi yang secara visual setara dengan midjourney. Jaringan ini didasarkan pada arsitektur ControlNet asli; kami mengusulkan dua modul baru untuk: 1 Memperluas ControlNet asli agar mendukung kondisi gambar yang berbeda menggunakan parameter jaringan yang sama. 2 Mendukung input kondisi ganda tanpa meningkatkan offload komputasi, yang sangat penting bagi desainer yang ingin mengedit gambar secara detail; kondisi yang berbeda menggunakan encoder kondisi yang sama, tanpa menambah komputasi atau parameter ekstra.*

## Memuat

Secara default, [ControlNetUnionModel](/docs/diffusers/v0.43.0/id/api/models/controlnet_union#diffusers.ControlNetUnionModel) harus dimuat dengan [from_pretrained()](/docs/diffusers/v0.43.0/id/api/models/overview#diffusers.ModelMixin.from_pretrained).

```py
from diffusers import StableDiffusionXLControlNetUnionPipeline, ControlNetUnionModel

controlnet = ControlNetUnionModel.from_pretrained("xinsir/controlnet-union-sdxl-1.0")
pipe = StableDiffusionXLControlNetUnionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", controlnet=controlnet)
```

## ControlNetUnionModel[[diffusers.ControlNetUnionModel]]

#### diffusers.ControlNetUnionModel[[diffusers.ControlNetUnionModel]]

```python
diffusers.ControlNetUnionModel(in_channels: int = 4, conditioning_channels: int = 3, flip_sin_to_cos: bool = True, 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, act_fn: str = 'silu', norm_num_groups: int | None = 32, norm_eps: float = 1e-05, cross_attention_dim: int = 1280, transformer_layers_per_block: int | tuple[int, ...] = 1, encoder_hid_dim: int | None = None, encoder_hid_dim_type: str | None = None, attention_head_dim: int | tuple[int, ...] = 8, num_attention_heads: int | tuple[int, ...] | None = None, use_linear_projection: bool = False, class_embed_type: str | None = None, addition_embed_type: str | None = None, addition_time_embed_dim: int | None = None, num_class_embeds: int | None = None, upcast_attention: bool = False, resnet_time_scale_shift: str = 'default', projection_class_embeddings_input_dim: int | None = None, controlnet_conditioning_channel_order: str = 'rgb', conditioning_embedding_out_channels: tuple[int, ...] | None = (48, 96, 192, 384), global_pool_conditions: bool = False, addition_embed_type_num_heads: int = 64, num_control_type: int = 6, num_trans_channel: int = 320, num_trans_head: int = 8, num_trans_layer: int = 1, num_proj_channel: int = 320)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/controlnets/controlnet_union.py#L85)

**Parameter:**

in_channels (`int`, defaultnya 4) : Jumlah channel dalam sampel input.

flip_sin_to_cos (`bool`, defaultnya `True`) : Apakah akan membalik sin menjadi cos dalam time embedding.

freq_shift (`int`, defaultnya 0) : Pergeseran frekuensi yang diterapkan pada time embedding.

down_block_types (`tuple[str]`, defaultnya `("CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "DownBlock2D")`) : Tuple dari blok downsample yang akan digunakan.

only_cross_attention (`bool | tuple[bool]`, defaultnya `False`) --

block_out_channels (`tuple[int]`, defaultnya `(320, 640, 1280, 1280)`) : Tuple dari saluran output untuk setiap blok.

layers_per_block (`int`, defaultnya 2) : Jumlah lapisan per blok.

downsample_padding (`int`, defaultnya 1) : Padding yang digunakan untuk konvolusi downsampling.

mid_block_scale_factor (`float`, defaultnya 1) : Faktor skala yang digunakan untuk blok tengah.

act_fn (`str`, defaultnya "silu") : Fungsi aktivasi yang akan digunakan.

norm_num_groups (`int`, *opsional*, defaultnya 32) : Jumlah grup yang digunakan untuk normalisasi. Jika None, lapisan normalisasi dan aktivasi dilewati dalam pascapemrosesan.

norm_eps (`float`, defaultnya 1e-5) : Epsilon yang digunakan untuk normalisasi.

cross_attention_dim (`int`, defaultnya 1280) : Dimensi dari fitur cross attention.

transformer_layers_per_block (`int` atau `tuple[int]`, *opsional*, default 1) : Jumlah blok transformer bertipe `BasicTransformerBlock`. Hanya relevan untuk `~models.unet_2d_blocks.CrossAttnDownBlock2D`, `~models.unet_2d_blocks.CrossAttnUpBlock2D`, `~models.unet_2d_blocks.UNetMidBlock2DCrossAttn`.

encoder_hid_dim (`int`, *opsional*, defaultnya None) : Jika `encoder_hid_dim_type` didefinisikan, `encoder_hidden_states` akan diproyeksikan dari dimensi `encoder_hid_dim` ke `cross_attention_dim`.

encoder_hid_dim_type (`str`, *opsional*, defaultnya `None`) : Jika diberikan, `encoder_hidden_states` dan kemungkinan embedding lainnya akan di-down-project ke embedding teks dengan dimensi `cross_attention` sesuai dengan `encoder_hid_dim_type`.

attention_head_dim (`int | tuple[int]`, defaultnya 8) : Dimensi dari kepala perhatian (attention heads).

use_linear_projection (`bool`, defaultnya `False`) --

class_embed_type (`str`, *opsional*, defaultnya `None`) : Jenis class embedding yang akan digunakan, yang pada akhirnya dijumlahkan dengan time embeddings. Pilih dari None, `"timestep"`, `"identity"`, `"projection"`, atau `"simple_projection"`.

addition_embed_type (`str`, *opsional*, defaultnya `None`) : Mengonfigurasi embedding opsional yang akan dijumlahkan dengan embedding waktu. Pilih dari `None` atau "text". "text" akan menggunakan lapisan `TextTimeEmbedding`.

num_class_embeds (`int`, *opsional*, default 0) : Dimensi input dari matriks embedding yang dapat dipelajari untuk diproyeksikan ke `time_embed_dim`, saat melakukan kondisioning kelas dengan `class_embed_type` yang sama dengan `None`.

upcast_attention (`bool`, defaultnya `False`) --

resnet_time_scale_shift (`str`, defaultnya `"default"`) : Konfigurasi pergeseran skala waktu untuk blok ResNet (lihat `ResnetBlock2D`). Pilih dari `default` atau `scale_shift`.

projection_class_embeddings_input_dim (`int`, *opsional*, defaultnya `None`) : Dimensi dari input `class_labels` ketika `class_embed_type="projection"`. Wajib diisi ketika `class_embed_type="projection"`.

controlnet_conditioning_channel_order (`str`, defaultnya `"rgb"`) : Urutan channel dari gambar kondisional. Akan dikonversi ke `rgb` jika `bgr`.

conditioning_embedding_out_channels (`tuple[int]`, *opsional*, defaultnya `(48, 96, 192, 384)`) : Tuple dari output channel untuk setiap blok di layer `conditioning_embedding`.

global_pool_conditions (`bool`, defaultnya `False`) --

Model ControlNetUnion.

#### forward[[diffusers.ControlNetUnionModel.forward]]

```python
forward(sample: Tensor, timestep: typing.Union[torch.Tensor, float, int], encoder_hidden_states: Tensor, controlnet_cond: list[torch.Tensor], control_type: Tensor, control_type_idx: list[int], conditioning_scale: float | list[float] = 1.0, class_labels: typing.Optional[torch.Tensor] = None, timestep_cond: typing.Optional[torch.Tensor] = None, attention_mask: typing.Optional[torch.Tensor] = None, added_cond_kwargs: dict[str, torch.Tensor] | None = None, cross_attention_kwargs: dict[str, typing.Any] | None = None, from_multi: bool = False, guess_mode: bool = False, return_dict: bool = True)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/controlnets/controlnet_union.py#L541)

**Parameter:**

sample (`torch.Tensor`) : Tensor input berisik.

timestep (`torch.Tensor | float | int`) : Jumlah langkah waktu untuk mendenoise input.

encoder_hidden_states (`torch.Tensor`) : Hidden states dari encoder.

controlnet_cond (`list[torch.Tensor]`) : Tensor input kondisional.

control_type (`torch.Tensor`) : Tensor dengan bentuk `(batch, num_control_type)` yang berisi nilai `0` atau `1` tergantung pada apakah tipe kontrol tersebut digunakan.

control_type_idx (`list[int]`) : Indeks dari `control_type`.

conditioning_scale (`float`, defaultnya `1.0`) : Faktor skala untuk output ControlNet.

class_labels (`torch.Tensor`, *opsional*, defaultnya `None`) : Label kelas opsional untuk kondisioning. Embedding-nya akan dijumlahkan dengan embedding timestep.

timestep_cond (`torch.Tensor`, *opsional*, defaultnya `None`) : Embedding kondisional tambahan untuk timestep. Jika disediakan, embedding tersebut akan dijumlahkan dengan timestep_embedding yang diteruskan melalui lapisan `self.time_embedding` untuk mendapatkan embedding timestep akhir.

attention_mask (`torch.Tensor`, *opsional*, defaultnya `None`) : Mask attention dengan bentuk `(batch, key_tokens)` diterapkan pada `encoder_hidden_states`. Jika `1`, mask dipertahankan, sedangkan jika `0`, mask dibuang. Mask akan dikonversi menjadi bias, yang menambahkan nilai negatif besar ke skor attention yang sesuai dengan token "buang".

added_cond_kwargs (`dict`) : Kondisi tambahan untuk UNet Stable Diffusion XL.

cross_attention_kwargs (`dict[str]`, *opsional*, defaultnya `None`) : Kamus kwargs yang jika ditentukan akan diteruskan ke `AttnProcessor`.

from_multi (`bool`, defaultnya `False`) : Gunakan penskalaan standar ketika dipanggil dari `MultiControlNetUnionModel`.

guess_mode (`bool`, defaultnya `False`) : Dalam mode ini, encoder ControlNet berusaha semaksimal mungkin untuk mengenali konten input dari input meskipun Anda menghapus semua prompt. `guidance_scale` antara 3.0 dan 5.0 direkomendasikan.

return_dict (`bool`, defaultnya `True`) : Apakah akan mengembalikan `~models.controlnet.ControlNetOutput` alih-alih tuple biasa.

**Mengembalikan:** `~models.controlnet.ControlNetOutput` **atau** `tuple`

Jika `return_dict` adalah `True`, sebuah `~models.controlnet.ControlNetOutput` dikembalikan, selain itu sebuah tuple dikembalikan di mana elemen pertama adalah tensor sampel.

Metode forward dari [ControlNetUnionModel](/docs/diffusers/v0.43.0/id/api/models/controlnet_union#diffusers.ControlNetUnionModel).

#### from_unet[[diffusers.ControlNetUnionModel.from_unet]]

```python
from_unet(unet: UNet2DConditionModel, controlnet_conditioning_channel_order: str = 'rgb', conditioning_embedding_out_channels: tuple[int, ...] | None = (16, 32, 96, 256), load_weights_from_unet: bool = True)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/controlnets/controlnet_union.py#L389)

**Parameter:**

unet (`UNet2DConditionModel`) : Bobot model UNet yang akan disalin ke [ControlNetUnionModel](/docs/diffusers/v0.43.0/id/api/models/controlnet_union#diffusers.ControlNetUnionModel). Semua opsi konfigurasi juga disalin jika berlaku.

Instansiasi [ControlNetUnionModel](/docs/diffusers/v0.43.0/id/api/models/controlnet_union#diffusers.ControlNetUnionModel) dari [UNet2DConditionModel](/docs/diffusers/v0.43.0/id/api/models/unet2d-cond#diffusers.UNet2DConditionModel).

#### set_attention_slice[[diffusers.ControlNetUnionModel.set_attention_slice]]

```python
set_attention_slice(slice_size: str | int | list[int])
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/controlnets/controlnet_union.py#L476)

**Parameter:**

slice_size (`str` atau `int` atau `list(int)`, *opsional*, defaultnya `"auto"`) : Ketika `"auto"`, input ke attention heads dipangkas setengahnya, sehingga attention dihitung dalam dua langkah. Jika `"max"`, jumlah memori yang dihemat maksimal dengan hanya menjalankan satu slice pada satu waktu. Jika angka diberikan, digunakan sebanyak slice sebanyak `attention_head_dim // slice_size`. Dalam kasus ini, `attention_head_dim` harus merupakan kelipatan dari `slice_size`.

Aktifkan perhitungan perhatian terpotong.

Ketika opsi ini diaktifkan, modul perhatian membagi tensor input menjadi beberapa potongan untuk menghitung perhatian dalam beberapa langkah. Hal ini berguna untuk menghemat sebagian memori dengan mengorbankan sedikit penurunan kecepatan.

#### set_default_attn_processor[[diffusers.ControlNetUnionModel.set_default_attn_processor]]

```python
set_default_attn_processor()
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/controlnets/controlnet_union.py#L460)

Menonaktifkan prosesor perhatian kustom dan mengatur implementasi perhatian default.

