# AsymmetricAutoencoderKL

نموذج الترميز التلقائي التبايني (VAE) الأكبر المحسّن مع خسارة KL لمهمة إعادة بناء الصور: [Designing a Better Asymmetric VQGAN for StableDiffusion](https://huggingface.co/papers/2306.04632) بقلم Zixin Zhu وXuelu Feng وDongdong Chen وJianmin Bao وLe Wang وYinpeng Chen وLu Yuan وGang Hua.

ملخص الورقة البحثية هو:

*يُعد StableDiffusion مولّدًا ثوريًا لتحويل النص إلى صور، ويثير ضجة في عالم توليد الصور وتحريرها. وعلى عكس الأساليب التقليدية التي تتعلم نموذج انتشار في فضاء البكسلات، يتعلم StableDiffusion نموذج انتشار في الفضاء الكامن عبر VQGAN، مما يضمن الكفاءة والجودة معًا. فهو لا يدعم مهام توليد الصور فحسب، بل يتيح أيضًا تحرير الصور الحقيقية، مثل إعادة بناء الصور (inpainting) والتحرير المحلي. ومع ذلك، لاحظنا أن VQGAN القياسي المستخدم في StableDiffusion يؤدي إلى فقدان كبير للمعلومات، مما يسبب تشوهات حتى في مناطق الصورة غير المحررة. لهذا الغرض، نقترح VQGAN غير متماثل جديدًا بتصميمين بسيطين. أولاً، بالإضافة إلى المدخلات من المشفّر، يحتوي المُفكّك على فرع شرطي يدمج معلومات من المسبقات الخاصة بالمهمة، مثل منطقة الصورة غير المقنّعة في إعادة البناء. ثانيًا، يكون المُفكّك أثقل بكثير من المشفّر، مما يتيح استعادة أكثر تفصيلًا مع زيادة طفيفة فقط في تكلفة الاستدلال الإجمالية. تكلفة تدريب VQGAN غير المتماثل لدينا منخفضة، ولا نحتاج سوى إلى إعادة تدريب مُفكّك غير متماثل جديد مع إبقاء مشفّر VQGAN القياسي وStableDiffusion دون تغيير. يمكن استخدام VQGAN غير المتماثل لدينا على نطاق واسع في طرق إعادة البناء والتحرير المحلي القائمة على StableDiffusion. تُظهر التجارب الواسعة أنه يمكن تحسين أداء إعادة البناء والتحرير بشكل كبير، مع الحفاظ على القدرة الأصلية على تحويل النص إلى صور. الكود متاح على https://github.com/buxiangzhiren/Asymmetric_VQGAN*

يمكن العثور على نتائج التقييم في القسم 4.1 من الورقة الأصلية.

## نقاط التفتيش المتاحة

* [https://huggingface.co/cross-attention/asymmetric-autoencoder-kl-x-1-5](https://huggingface.co/cross-attention/asymmetric-autoencoder-kl-x-1-5)
* [https://huggingface.co/cross-attention/asymmetric-autoencoder-kl-x-2](https://huggingface.co/cross-attention/asymmetric-autoencoder-kl-x-2)

## مثال على الاستخدام

```python
from diffusers import AsymmetricAutoencoderKL, StableDiffusionInpaintPipeline
from diffusers.utils import load_image, make_image_grid

prompt = "a photo of a person with beard"
img_url = "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/repaint/celeba_hq_256.png"
mask_url = "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/repaint/mask_256.png"

original_image = load_image(img_url).resize((512, 512))
mask_image = load_image(mask_url).resize((512, 512))

pipe = StableDiffusionInpaintPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-inpainting")
pipe.vae = AsymmetricAutoencoderKL.from_pretrained("cross-attention/asymmetric-autoencoder-kl-x-1-5")
pipe.to("cuda")  # or "mps", "xpu", "cpu"

image = pipe(prompt=prompt, image=original_image, mask_image=mask_image).images[0]
make_image_grid([original_image, mask_image, image], rows=1, cols=3)
```

## AsymmetricAutoencoderKL[[diffusers.AsymmetricAutoencoderKL]]

#### diffusers.AsymmetricAutoencoderKL[[diffusers.AsymmetricAutoencoderKL]]

```python
diffusers.AsymmetricAutoencoderKL(in_channels: int = 3, out_channels: int = 3, down_block_types: tuple = ('DownEncoderBlock2D',), down_block_out_channels: tuple = (64,), layers_per_down_block: int = 1, up_block_types: tuple = ('UpDecoderBlock2D',), up_block_out_channels: tuple = (64,), layers_per_up_block: int = 1, act_fn: str = 'silu', latent_channels: int = 4, norm_num_groups: int = 32, sample_size: int = 32, scaling_factor: float = 0.18215)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/autoencoder_asym_kl.py#L24)

**المعاملات:**

in_channels (int, *اختياري*، القيمة الافتراضية 3) : عدد القنوات في الصورة المدخلة.

out_channels (int، *اختياري*، القيمة الافتراضية 3) : عدد القنوات في المخرجات.

down_block_types (`tuple[str]`، *اختياري*، القيمة الافتراضية `("DownEncoderBlock2D",)`) : مجموعة من أنواع كتل التقليل (downsample).

down_block_out_channels (`tuple[int]`، *اختياري*، القيمة الافتراضية `(64,)`) : مجموعة من قنوات مخرجات كتل التقليل.

layers_per_down_block (`int`، *اختياري*، القيمة الافتراضية `1`) : عدد الطبقات في الكتلة السفلية.

up_block_types (`tuple[str]`، *اختياري*، القيمة الافتراضية `("UpDecoderBlock2D",)`) : مجموعة من أنواع كتل التوسيع (upsample).

up_block_out_channels (`tuple[int]`، *اختياري*، القيمة الافتراضية `(64,)`) : tuple لقنوات المخرجات في كتل up.

layers_per_up_block (`int`، *اختياري*، القيمة الافتراضية `1`) : عدد الطبقات في الكتلة العلوية.

act_fn (`str`، *اختياري*، القيمة الافتراضية `"silu"`) : دالة التنشيط المستخدمة.

latent_channels (`int`، *اختياري*، القيمة الافتراضية 4) : عدد القنوات في الفضاء الكامن.

sample_size (`int`، *اختياري*، القيمة الافتراضية `32`) : حجم الإدخال العينة.

norm_num_groups (`int`، *اختياري*، القيمة الافتراضية `32`) : عدد المجموعات المستخدمة في طبقة التطبيع الأولى في كتل ResNet.

scaling_factor (`float`، *اختياري*، القيمة الافتراضية 0.18215) : الانحراف المعياري لكل مكوّن في الفضاء الكامن المُدرَّب، المُحسوب باستخدام الدفعة الأولى من مجموعة التدريب. يُستخدم هذا الانحراف لتقريب الفضاء الكامن بحيث يكون له تباين وحدة عند تدريب نموذج الانتشار. يتم تقريب الكمونات باستخدام الصيغة `z = z * scaling_factor` قبل تمريرها إلى نموذج الانتشار. عند فك الترميز، تُعاد الكمونات إلى المقياس الأصلي باستخدام الصيغة: `z = 1 / scaling_factor * z`. لمزيد من التفاصيل، راجع الأقسام 4.3.2 و D.1 من ورقة [High-Resolution Image Synthesis with Latent Diffusion Models](https://huggingface.co/papers/2112.10752).

تصميم VQGAN غير متماثل أفضل لـ StableDiffusion https://huggingface.co/papers/2306.04632 . نموذج VAE مع خسارة KL لتشفير الصور إلى كامنات وفك تمثيل الكامنات إلى صور.

يرث هذا النموذج من [ModelMixin](/docs/diffusers/main/ar/api/models/overview#diffusers.ModelMixin). راجع توثيق الفئة الأصلية لمعرفة طرقه العامة المُنفَّذة لجميع النماذج (مثل التنزيل أو الحفظ).

#### forward[[diffusers.AsymmetricAutoencoderKL.forward]]

```python
forward(sample: Tensor, mask: typing.Optional[torch.Tensor] = None, sample_posterior: bool = False, return_dict: bool = True, generator: typing.Optional[torch.Generator] = None)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/autoencoder_asym_kl.py#L153)

**المعاملات:**

sample (`torch.Tensor`) : عينة الإدخال.

mask (`torch.Tensor`، *اختياري*، القيمة الافتراضية `None`) : قناع التلوين الاختياري.

sample_posterior (`bool`، *اختياري*، الافتراضي `False`) : ما إذا كان سيتم أخذ عينة من التوزيع اللاحق.

return_dict (`bool`، *اختياري*، الافتراضي `True`) : ما إذا كان يجب إرجاع `DecoderOutput` بدلاً من tuple عادي.

generator (`torch.Generator`، *اختياري*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) لجعل عملية أخذ العينات حتمية.

**يعيد:** `DecoderOutput` أو `tuple`

إذا كان `return_dict` صحيحًا، يُعاد `DecoderOutput`، وإلا يُعاد `tuple` عادي.

## AutoencoderKLOutput[[diffusers.models.modeling_outputs.AutoencoderKLOutput]]

#### diffusers.models.modeling_outputs.AutoencoderKLOutput[[diffusers.models.modeling_outputs.AutoencoderKLOutput]]

```python
diffusers.models.modeling_outputs.AutoencoderKLOutput(latent_dist: DiagonalGaussianDistribution)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_outputs.py#L7)

**المعاملات:**

latent_dist (`DiagonalGaussianDistribution`) : المخرجات المُرمّزة لـ`Encoder` ممثّلةً بمتوسط `DiagonalGaussianDistribution` ومتغيره اللوغاريتمي. تتيح `DiagonalGaussianDistribution` أخذ عينات من المتغيّرات الكامنة انطلاقًا من هذا التوزيع.

مخرجات طريقة الترميز encoding في AutoencoderKL.

## DecoderOutput[[diffusers.models.autoencoders.vae.DecoderOutput]]

#### diffusers.models.autoencoders.vae.DecoderOutput[[diffusers.models.autoencoders.vae.DecoderOutput]]

```python
diffusers.models.autoencoders.vae.DecoderOutput(sample: Tensor, commit_loss: typing.Optional[torch.FloatTensor] = None)
```

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/vae.py#L49)

**المعاملات:**

sample (`torch.Tensor` من الشكل `(batch_size, num_channels, height, width)`) : عينة الإخراج المُفكّكة من الطبقة الأخيرة للنموذج.

مخرجات طريقة فك الترميز.

