Diffusers documentation

InstructPix2Pix

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

and get access to the augmented documentation experience

to get started

InstructPix2Pix

InstructPix2Pix adalah model Stable Diffusion yang dilatih untuk mengedit gambar berdasarkan instruksi dari manusia. Misalnya, prompt Anda bisa berupa “turn the clouds rainy” dan model akan mengedit gambar input sesuai dengan itu. Model ini dikondisikan pada prompt teks (atau instruksi pengeditan) dan gambar input.

Panduan ini akan membahas skrip pelatihan train_instruct_pix2pix.py untuk membantu Anda memahaminya, serta bagaimana Anda dapat menyesuaikannya untuk kasus penggunaan Anda sendiri.

Sebelum menjalankan skrip, pastikan Anda menginstal pustaka dari sumber:

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

Lalu, navigasikan ke folder contoh yang berisi skrip pelatihan dan instal dependensi yang diperlukan untuk skrip yang Anda gunakan:

cd examples/instruct_pix2pix
pip install -r requirements.txt

🤗 Accelerate adalah pustaka untuk membantu Anda melatih pada beberapa GPU/TPU atau dengan presisi campuran. Pustaka ini akan mengonfigurasi pengaturan pelatihan Anda secara otomatis berdasarkan perangkat keras dan lingkungan Anda. Lihat Tour singkat 🤗 Accelerate untuk mempelajari lebih lanjut.

Inisialisasi lingkungan 🤗 Accelerate:

accelerate config

Untuk menyiapkan lingkungan 🤗 Accelerate default tanpa memilih konfigurasi apa pun:

accelerate config default

Atau jika lingkungan Anda tidak mendukung shell interaktif, seperti notebook, Anda dapat menggunakan:

from accelerate.utils import write_basic_config

write_basic_config()

Terakhir, jika Anda ingin melatih model pada dataset Anda sendiri, lihat panduan Membuat dataset untuk pelatihan untuk mempelajari cara membuat dataset yang berfungsi dengan skrip pelatihan.

Bagian-bagian berikut menyoroti bagian dari skrip pelatihan yang penting untuk dipahami agar Anda dapat memodifikasinya, namun tidak membahas setiap aspek skrip secara detail. Jika Anda tertarik untuk mempelajari lebih lanjut, silakan membaca skrip tersebut dan beri tahu kami jika Anda memiliki pertanyaan atau kekhawatiran.

Parameter skrip

Skrip pelatihan memiliki banyak parameter untuk membantu Anda menyesuaikan eksekusi pelatihan Anda. Semua parameter dan deskripsinya dapat ditemukan di fungsi parse_args(). Nilai default disediakan untuk sebagian besar parameter yang bekerja cukup baik, tetapi Anda juga dapat mengatur nilai Anda sendiri dalam perintah pelatihan jika Anda mau.

Sebagai contoh, untuk meningkatkan resolusi gambar input:

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

Banyak parameter dasar dan penting dijelaskan dalam panduan pelatihan Text-to-image, sehingga panduan ini hanya berfokus pada parameter yang relevan untuk InstructPix2Pix:

  • --original_image_column: gambar asli sebelum pengeditan dilakukan
  • --edited_image_column: gambar setelah pengeditan dilakukan
  • --edit_prompt_column: instruksi untuk mengedit gambar
  • --conditioning_dropout_prob: probabilitas dropout untuk gambar yang diedit dan prompt edit selama pelatihan, yang memungkinkan classifier-free guidance (CFG) untuk satu atau kedua input kondisional

Skrip pelatihan

Kode pra-pemrosesan dataset dan loop pelatihan dapat ditemukan di fungsi main(). Di sinilah Anda akan melakukan perubahan pada skrip pelatihan untuk menyesuaikannya dengan kasus penggunaan Anda sendiri.

Sama seperti parameter skrip, penjelasan langkah demi langkah tentang skrip pelatihan tersedia di panduan pelatihan Text-to-image. Sebagai gantinya, panduan ini membahas bagian-bagian skrip yang relevan dengan InstructPix2Pix.

Skrip dimulai dengan memodifikasi jumlah saluran input pada lapisan konvolusional pertama dari UNet untuk mengakomodasi gambar kondisional tambahan dari InstructPix2Pix:

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

Parameter UNet ini diperbarui oleh optimizer:

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,
)

Selanjutnya, gambar yang diedit dan instruksi editnya di-praproses dan ditokenisasi. Penting untuk menerapkan transformasi gambar yang sama pada gambar asli dan gambar yang diedit.

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

Terakhir, dalam loop pelatihan, proses dimulai dengan mengkodekan gambar yang telah diedit ke ruang laten:

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

Kemudian, skrip menerapkan dropout pada embedding gambar asli dan instruksi edit untuk mendukung CFG. Hal ini memungkinkan model untuk memodulasi pengaruh instruksi edit dan gambar asli terhadap gambar yang diedit.

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

Itu saja! Selain perbedaan yang dijelaskan di sini, bagian lain dari skrip sangat mirip dengan skrip pelatihan Text-to-image, jadi silakan periksa untuk detail lebih lanjut. Jika Anda ingin mempelajari lebih lanjut tentang cara kerja loop pelatihan, lihat tutorial Understanding pipelines, models and schedulers yang menguraikan pola dasar dari proses denoising.

Jalankan skrip

Setelah Anda puas dengan perubahan pada skrip Anda atau jika Anda setuju dengan konfigurasi default, Anda siap untuk meluncurkan skrip pelatihan! 🚀

Panduan ini menggunakan dataset fusing/instructpix2pix-1000-samples, yang merupakan versi lebih kecil dari dataset asli. Anda juga dapat membuat dan menggunakan dataset Anda sendiri jika diinginkan (lihat panduan Membuat dataset untuk pelatihan).

Setel variabel lingkungan MODEL_NAME ke nama model (bisa berupa id model di Hub atau path ke model lokal), dan DATASET_ID ke nama dataset di Hub. Skrip ini membuat dan menyimpan semua komponen (feature extractor, scheduler, text encoder, UNet, dll.) ke subfolder di repositori Anda.

Untuk hasil yang lebih baik, coba jalankan pelatihan lebih lama dengan dataset yang lebih besar. Kami hanya menguji skrip pelatihan ini pada dataset berskala kecil.


Untuk memantau kemajuan pelatihan dengan Weights and Biases, tambahkan parameter --report_to=wandb ke perintah pelatihan dan tentukan gambar validasi dengan --val_image_url serta prompt validasi dengan --validation_prompt. Hal ini dapat sangat berguna untuk debugging model.

Jika Anda melatih pada lebih dari satu GPU, tambahkan parameter --multi_gpu ke perintah accelerate launch.

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

Setelah pelatihan selesai, Anda dapat menggunakan InstructPix2Pix baru Anda untuk inferensi:

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")

Anda sebaiknya bereksperimen dengan nilai num_inference_steps, image_guidance_scale, dan guidance_scale yang berbeda untuk melihat bagaimana mereka memengaruhi kecepatan dan kualitas inferensi. Parameter guidance scale sangat berdampak karena mereka mengontrol seberapa besar gambar asli dan instruksi pengeditan memengaruhi gambar yang diedit.

Stable Diffusion XL

Stable Diffusion XL (SDXL) adalah model teks-ke-gambar yang kuat yang menghasilkan gambar resolusi tinggi, dan menambahkan text-encoder kedua ke arsitekturnya. Gunakan skrip train_instruct_pix2pix_sdxl.py untuk melatih model SDXL agar mengikuti instruksi pengeditan gambar.

Skrip pelatihan SDXL dibahas lebih detail dalam panduan pelatihan SDXL.

Langkah selanjutnya

Selamat karena Anda telah melatih model InstructPix2Pix Anda sendiri! 🥳 Untuk mempelajari lebih lanjut tentang model tersebut, mungkin akan membantu jika Anda:

Update on GitHub