# InstructPix2Pix

[InstructPix2Pix](https://hf.co/papers/2211.09800) هو نموذج Stable Diffusion مُدرَّب لتحرير الصور بناءً على تعليمات بشرية. على سبيل المثال، يمكن أن يكون طلبك "اجعل الغيوم ممطرة" وسيُحرِّر النموذج الصورة المدخلة وفقًا لذلك. يعتمد هذا النموذج على النص المطلوب (أو تعليمات التحرير) والصورة المدخلة.

ستستكشف هذه الدليل سكربت التدريب [train_instruct_pix2pix.py](https://github.com/huggingface/diffusers/blob/main/examples/instruct_pix2pix/train_instruct_pix2pix.py) لمساعدتك على الاطلاع عليه، وكيفية تكييفه ليناسب حالتك الخاصة.

قبل تشغيل السكربت، تأكد من تثبيت المكتبة من المصدر:

```bash
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
```

ثم انتقل إلى مجلد المثال الذي يحتوي على سكربت التدريب وقم بتثبيت التبعيات المطلوبة للسكربت الذي تستخدمه:

```bash
cd examples/instruct_pix2pix
pip install -r requirements.txt
```

> [!TIP]
> 🤗 Accelerate هي مكتبة تساعدك على التدريب على عدة وحدات معالجة رسومية (GPU) أو وحدات معالجة مخصصة (TPU) أو باستخدام دقة مختلطة. ستقوم تلقائيًا بإعداد بيئة التدريب الخاصة بك بناءً على عتادك وبيئتك. اطّلع على [الجولة السريعة](https://huggingface.co/docs/accelerate/quicktour) في 🤗 Accelerate لمعرفة المزيد.

قم بتهيئة بيئة 🤗 Accelerate:

```bash
accelerate config
```

لإعداد بيئة 🤗 Accelerate افتراضية دون اختيار أي تكوينات:

```bash
accelerate config default
```

أو إذا لم يدعم بيئتك shell تفاعليًا، كما هو الحال في notebook، يمكنك استخدام:

```py
from accelerate.utils import write_basic_config

write_basic_config()
```

أخيرًا، إذا كنت ترغب في تدريب نموذج على مجموعة بياناتك الخاصة، فاطّلع على دليل [إنشاء مجموعة بيانات للتدريب](create_dataset) لمعرفة كيفية إنشاء مجموعة بيانات تعمل مع سكربت التدريب.

> [!TIP]
> تسلّط الأقسام التالية الضوء على أجزاء من سكربت التدريب التي تُعدّ مهمة لفهم كيفية تعديله، لكنها لا تغطي كل جانب من جوانب السكربت بالتفصيل. إذا كنت مهتمًا بالتعلّم أكثر، فلا تتردد في قراءة [السكربت](https://github.com/huggingface/diffusers/blob/main/examples/instruct_pix2pix/train_instruct_pix2pix.py) وإعلامنا بأي أسئلة أو مخاوف لديك.

## معاملات السكربت

يحتوي سكربت التدريب على العديد من المعاملات لمساعدتك على تخصيص عملية التدريب. يمكنك العثور على جميع المعاملات ووصفها في الدالة [`parse_args()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L65). يتم تقديم قيم افتراضية لمعظم المعاملات التي تعمل بشكل جيد جداً، لكن يمكنك أيضاً تعيين قيمك الخاصة في أمر التدريب إذا رغبت في ذلك.

على سبيل المثال، لزيادة دقة الصورة المدخلة:

```bash
accelerate launch train_instruct_pix2pix.py \
  --resolution=512 \
```

يُوصف العديد من المعلمات الأساسية والمهمة في دليل تدريب [النص إلى صورة](text2image#script-parameters)، لذا يركّز هذا الدليل فقط على المعلمات ذات الصلة بـ InstructPix2Pix:

- `--original_image_column`: الصورة الأصلية قبل إجراء التعديلات
- `--edited_image_column`: الصورة بعد إجراء التعديلات
- `--edit_prompt_column`: التعليمات لتحرير الصورة
- `--conditioning_dropout_prob`: احتمال الإسقاط (dropout) للصورة المعدّلة وموجّهات التحرير أثناء التدريب، مما يتيح التوجيه الحر من التصنيف (CFG) لإحدى مدخلات الشرط أو كليهما

## سكربت التدريب

تُوجد كود معالجة مسبقة للبيانات وحلقة التدريب في الدالة [`main()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L374). هنا ستُجري تعديلاتك على سكربت التدريب لتكييفه مع حالتك الخاصة.

كما هو الحال مع معاملات السكربت، يتوفر شرح تفصيلي لسكربت التدريب في دليل تدريب [النص إلى صورة](text2image#training-script). وبدلاً من ذلك، يتناول هذا الدليل الأجزاء ذات الصلة بـ InstructPix2Pix في السكربت.

يبدأ السكربت بتعديل [عدد قنوات الإدخال](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L445) في الطبقة الالتفافية الأولى من UNet لمراعاة صورة التكييف الإضافية في InstructPix2Pix:

```py
in_channels = 8
out_channels = unet.conv_in.out_channels
unet.register_to_config(in_channels=in_channels)

with torch.no_grad():
    new_conv_in = nn.Conv2d(
        in_channels, out_channels, unet.conv_in.kernel_size, unet.conv_in.stride, unet.conv_in.padding
    )
    new_conv_in.weight.zero_()
    new_conv_in.weight[:, :4, :, :].copy_(unet.conv_in.weight)
    unet.conv_in = new_conv_in
```

تُحدَّث هذه المعلمات الخاصة بـ UNet بواسطة [المُحسِّن](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L545C1-L551C6):

```py
optimizer = optimizer_cls(
    unet.parameters(),
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)
```

في الخطوة التالية، يتم [المعالجة المسبقة](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L624) للصور المعدّلة وتعليمات التعديل، ثم [تجزئتها](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L610C24-L610C24). من المهم تطبيق نفس تحويلات الصور على الصور الأصلية والصور المعدّلة.

```py
def preprocess_train(examples):
    preprocessed_images = preprocess_images(examples)

    original_images, edited_images = preprocessed_images.chunk(2)
    original_images = original_images.reshape(-1, 3, args.resolution, args.resolution)
    edited_images = edited_images.reshape(-1, 3, args.resolution, args.resolution)

    examples["original_pixel_values"] = original_images
    examples["edited_pixel_values"] = edited_images

    captions = list(examples[edit_prompt_column])
    examples["input_ids"] = tokenize_captions(captions)
    return examples
```

أخيرًا، في [حلقة التدريب](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L730)، يبدأ بتشفير الصور المعدّلة إلى الفضاء الكامن:

```py
latents = vae.encode(batch["edited_pixel_values"].to(weight_dtype)).latent_dist.sample()
latents = latents * vae.config.scaling_factor
```

ثمّ يطبّق السكربت إسقاط (dropout) على تمثيلات الصورة الأصلية وتعليمات التحرير لدعم CFG. وهذا ما يمكّن النموذج من ضبط تأثير تعليمات التحرير والصورة الأصلية على الصورة المُعدَّلة.

```py
encoder_hidden_states = text_encoder(batch["input_ids"])[0]
original_image_embeds = vae.encode(batch["original_pixel_values"].to(weight_dtype)).latent_dist.mode()

if args.conditioning_dropout_prob is not None:
    random_p = torch.rand(bsz, device=latents.device, generator=generator)
    prompt_mask = random_p < 2 * args.conditioning_dropout_prob
    prompt_mask = prompt_mask.reshape(bsz, 1, 1)
    null_conditioning = text_encoder(tokenize_captions([""]).to(accelerator.device))[0]
    encoder_hidden_states = torch.where(prompt_mask, null_conditioning, encoder_hidden_states)

    image_mask_dtype = original_image_embeds.dtype
    image_mask = 1 - (
        (random_p >= args.conditioning_dropout_prob).to(image_mask_dtype)
        * (random_p < 3 * args.conditioning_dropout_prob).to(image_mask_dtype)
    )
    image_mask = image_mask.reshape(bsz, 1, 1, 1)
    original_image_embeds = image_mask * original_image_embeds
```

هذا كل شيء تقريبًا! بخلاف الفروقات الموضحة هنا، فإن بقية السكربت مشابه جدًا لسكربت تدريب [النص إلى صورة](text2image#training-script)، لذا لا تتردد في الاطلاع عليه لمزيد من التفاصيل. إذا كنت ترغب في معرفة المزيد حول كيفية عمل حلقة التدريب، فتوجه إلى شروحات [فهم خطوط الأنظمة والنماذج والمجدولين](../using-diffusers/write_own_pipeline) التي تفصل النمط الأساسي لعملية إزالة الضوضاء.

## تشغيل السكربت

بمجرد أن تكون راضياً عن التعديلات التي أجريتها على سكربت التدريب، أو إذا كنت مرتاحاً مع الإعداد الافتراضي، فأنت مستعد لإطلاق سكربت التدريب! 🚀

يستخدم هذا الدليل مجموعة بيانات [fusing/instructpix2pix-1000-samples](https://huggingface.co/datasets/fusing/instructpix2pix-1000-samples)، وهي نسخة أصغر من [المجموعة الأصلية](https://huggingface.co/datasets/timbrooks/instructpix2pix-clip-filtered). يمكنك أيضاً إنشاء واستخدام مجموعتك الخاصة إذا رغبت في ذلك (انظر دليل [إنشاء مجموعة بيانات للتدريب](create_dataset)).

اضبط متغير البيئة `MODEL_NAME` على اسم النموذج (يمكن أن يكون معرّف نموذج على Hub أو مسارًا لنموذج محلي)، و`DATASET_ID` على اسم مجموعة البيانات على Hub. يقوم السكربت بإنشاء جميع المكونات (مستخرج الميزات، المجدول، مشفّر النص، UNet، إلخ) وحفظها في مجلد فرعي في مستودعك.

> [!TIP]
> للحصول على نتائج أفضل، جرّب دورات تدريب أطول باستخدام مجموعة بيانات أكبر. لقد اختبرنا هذا السكربت التدريبي فقط على مجموعة بيانات أصغر حجمًا.
>
> 
>
> لمراقبة تقدم التدريب باستخدام Weights and Biases، أضف معامل `--report_to=wandb` إلى أمر التدريب وحدد صورة التحقق باستخدام `--val_image_url` وموجّه التحقق باستخدام `--validation_prompt`. يمكن أن يكون هذا مفيدًا للغاية لتصحيح أخطاء النموذج.

إذا كنت تدرب على أكثر من وحدة معالجة رسومية واحدة، أضف معامل `--multi_gpu` إلى أمر `accelerate launch`.

```bash
accelerate launch --mixed_precision="fp16" train_instruct_pix2pix.py \
    --pretrained_model_name_or_path=$MODEL_NAME \
    --dataset_name=$DATASET_ID \
    --enable_xformers_memory_efficient_attention \
    --resolution=256 \
    --random_flip \
    --train_batch_size=4 \
    --gradient_accumulation_steps=4 \
    --gradient_checkpointing \
    --max_train_steps=15000 \
    --checkpointing_steps=5000 \
    --checkpoints_total_limit=1 \
    --learning_rate=5e-05 \
    --max_grad_norm=1 \
    --lr_warmup_steps=0 \
    --conditioning_dropout_prob=0.05 \
    --mixed_precision=fp16 \
    --seed=42 \
    --push_to_hub
```

بعد اكتمال التدريب، يمكنك استخدام نموذج InstructPix2Pix الجديد للاستدلال:

```py
import PIL
import requests
import torch
from diffusers import StableDiffusionInstructPix2PixPipeline
from diffusers.utils import load_image

pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained("your_cool_model", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(0)

image = load_image("https://huggingface.co/datasets/sayakpaul/sample-datasets/resolve/main/test_pix2pix_4.png")
prompt = "add some ducks to the lake"
num_inference_steps = 20
image_guidance_scale = 1.5
guidance_scale = 10

edited_image = pipeline(
   prompt,
   image=image,
   num_inference_steps=num_inference_steps,
   image_guidance_scale=image_guidance_scale,
   guidance_scale=guidance_scale,
   generator=generator,
).images[0]
edited_image.save("edited_image.png")
```

يجب أن تجري تجارب مع قيم مختلفة لـ `num_inference_steps` و`image_guidance_scale` و`guidance_scale` لمعرفة كيفية تأثيرها على سرعة الاستدلال وجودة النتائج. تُعدّ معاملات مقياس التوجيه (guidance scale) ذات تأثير خاص لأنها تتحكم في مدى تأثير الصورة الأصلية وتعليمات التعديل على الصورة المعدّلة.

## Stable Diffusion XL

يعتبر Stable Diffusion XL (SDXL) نموذجًا قويًا لتحويل النص إلى صورة، يقوم بتوليد صور عالية الدقة، ويضيف مشفّر نصي ثانٍ إلى بنيته. استخدم السكربت [`train_instruct_pix2pix_sdxl.py`](https://github.com/huggingface/diffusers/blob/main/examples/instruct_pix2pix/train_instruct_pix2pix_sdxl.py) لتدريب نموذج SDXL على اتباع تعليمات تحرير الصور.

يتم مناقشة سكربت تدريب SDXL بتفصيل أكبر في دليل [تدريب SDXL](sdxl).

## الخطوات التالية

تهانينا على تدريب نموذج InstructPix2Pix الخاص بك! 🥳 للتعرف على المزيد حول النموذج، قد يكون من المفيد:

- اقرأ منشور المدونة [ضبط Stable Diffusion التعليمي باستخدام InstructPix2Pix](https://huggingface.co/blog/instruction-tuning-sd) لمعرفة المزيد حول بعض التجارب التي أجريناها مع InstructPix2Pix، وتجهيز مجموعة البيانات، والنتائج لتعليمات مختلفة.

