Diffusers documentation
InstructPix2Pix
InstructPix2Pix
InstructPix2Pix, insan sağladığı talimatlar doğrultusunda görüntü düzenlemesi yapacak şekilde eğitilmiş bir Stable Diffusion modelidir. Örneğin, “bulutları yağmurlu yap” gibi bir istem (prompt) verildiğinde model, girdi görüntüsünü buna göre düzenler. Bu model, metin istemine (veya düzenleme talimatına) ve girdi görüntüsüne koşullandırılmıştır.
Bu kılavuz, train_instruct_pix2pix.py eğitim betiğini inceleyerek onu tanımanıza ve kendi kullanım durumunuza nasıl uyarlayabileceğinizi göstermenize yardımcı olacaktır.
Betik çalıştırmadan önce, kütüphanenin kaynak kodundan yüklendiğinden emin olun:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .Ardından, eğitim betiğini içeren örnek klasörüne gidin ve kullandığınız betik için gerekli bağımlılıkları yükleyin:
cd examples/instruct_pix2pix
pip install -r requirements.txt🤗 Accelerate, birden fazla GPU/TPU ile veya karma hassasiyetle eğitim yapmanıza yardımcı olmak için tasarlanmış bir kütüphanedir. Donanımınıza ve ortamınıza göre eğitim kurulumunuzu otomatik olarak yapılandırır. Daha fazla bilgi edinmek için 🤗 Accelerate Hızlı tur sayfasına göz atın.
Bir 🤗 Accelerate ortamı başlatın:
accelerate config
Herhangi bir yapılandırma seçmeden varsayılan bir 🤗 Accelerate ortamı kurmak için:
accelerate config default
Ya da ortamınız, bir notebook gibi, etkileşimli bir kabuğu desteklemiyorsa, şunu kullanabilirsiniz:
from accelerate.utils import write_basic_config
write_basic_config()Son olarak, kendi veri setiniz üzerinde bir model eğitmek istiyorsanız, eğitim scriptiyle uyumlu bir veri seti oluşturma yöntemini öğrenmek için Eğitim için veri seti oluşturma kılavuzuna göz atın.
Aşağıdaki bölümler, betiğin nasıl değiştirileceğini anlamak için önemli olan eğitim betiğinin kısımlarını vurgular, ancak betiğin her yönünü ayrıntılı olarak kapsamaz. Daha fazla bilgi edinmek isterseniz, betiği okumaktan çekinmeyin ve herhangi bir sorunuz veya endişeniz varsa bize bildirin.
Betik parametreleri
Eğitim betiği, eğitim çalışmanızı özelleştirmenize yardımcı olmak için birçok parametreye sahiptir. Tüm parametreler ve açıklamaları parse_args() fonksiyonunda bulunur. Çoğu parametre için oldukça iyi çalışan varsayılan değerler sağlanmıştır, ancak isterseniz kendi değerlerinizi eğitim komutunda da ayarlayabilirsiniz.
Örneğin, giriş görüntüsünün çözünürlüğünü artırmak için:
accelerate launch train_instruct_pix2pix.py \ --resolution=512 \
Çok temel ve önemli parametreler Metinden görüntüye eğitim kılavuzunda anlatıldığından, bu kılavuz yalnızca InstructPix2Pix için ilgili parametrelere odaklanmaktadır:
--original_image_column: düzenlemeler yapılmadan önceki orijinal görüntü--edited_image_column: düzenlemeler yapıldıktan sonraki görüntü--edit_prompt_column: görüntüyü düzenlemek için talimatlar--conditioning_dropout_prob: eğitim sırasında düzenlenmiş görüntü ve düzenleme istemleri için dropout olasılığı; bu, bir veya her iki koşul girdisi için sınıflandırıcı-özgür yönlendirmeyi (CFG) mümkün kılar
Eğitim betiği
Veri seti ön işleme kodu ve eğitim döngüsü main() fonksiyonunda bulunur. Eğitim betiğini kendi kullanım senaryonuza uyarlamak için değişikliklerinizi burada yaparsınız.
Betik parametrelerinde olduğu gibi, eğitim betiğinin adım adım açıklaması Metinden görüntüye eğitim kılavuzunda sunulmaktadır. Bunun yerine bu kılavuz, betiğin InstructPix2Pix ile ilgili bölümlerine odaklanmaktadır.
Betik, UNet'in ilk konvolüsyon katmanındaki girdi kanal sayısını, InstructPix2Pix'in ek koşullandırma görüntüsünü hesaba katmak için değiştirerek başlar:
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_inBu UNet parametreleri optimizatör tarafından güncellenir:
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,
)Ardından, düzenlenmiş görüntüler ve düzenleme talimatları ön işlenir ve tokenize edilir. Orijinal ve düzenlenmiş görüntülere aynı görüntü dönüşümlerinin uygulanması önemlidir.
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 examplesSon olarak, eğitim döngüsünde, düzenlenmiş görüntüleri latent uzaya kodlamayla başlar:
latents = vae.encode(batch["edited_pixel_values"].to(weight_dtype)).latent_dist.sample()
latents = latents * vae.config.scaling_factorArdından, betik, CFG'yi desteklemek için orijinal görüntü ve düzenleme talimatı gömme değerlerine dropout uygular. Bu, modelin düzenleme talimatının ve orijinal görüntünün düzenlenmiş görüntü üzerindeki etkisini modüle etmesini sağlar.
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_embedsBunlar neredeyse hepsi! Burada açıklanan farklar dışında, scriptin geri kalanı Text-to-image eğitim scriptiyle çok benzerdir, bu nedenle daha fazla ayrıntı için incelemekten çekinmeyin. Eğitim döngüsünün nasıl çalıştığını daha ayrıntılı öğrenmek isterseniz, gürültü azaltma sürecinin temel kalıbını açıklayan Understanding pipelines, models and schedulers eğitim materyaline göz atın.
Betik başlat
Scriptinizdeki değişikliklerden memnunsanız veya varsayılan yapılandırmayla sorununuz yoksa, eğitim scriptini başlatmaya hazırsınız! 🚀
Bu kılavuz, orijinal veri setinin daha küçük bir versiyonu olan fusing/instructpix2pix-1000-samples veri setini kullanır. İsterseniz kendi veri setinizi oluşturup kullanabilirsiniz (Eğitim için veri seti oluşturma kılavuzuna bakın).
MODEL_NAME ortam değişkenini modelin adıyla (Hub'daki bir model kimliği veya yerel bir modele giden bir yol olabilir) ve DATASET_ID ortam değişkenini Hub'daki veri setinin adıyla ayarlayın. Betik, tüm bileşenleri (özellik çıkarıcı, zamanlayıcı, metin kodlayıcı, UNet vb.) oluşturur ve bunları depolamanızdaki bir alt klasöre kaydeder.
Daha iyi sonuçlar için, daha büyük bir veri setiyle daha uzun eğitim çalışmaları denemek isteyebilirsiniz. Bu eğitim betiğini yalnızca daha küçük ölçekli bir veri setinde test ettik.
Eğitim ilerlemesini Weights and Biases ile izlemek için eğitim komutuna
--report_to=wandbparametresini ekleyin ve--val_image_urlile bir doğrulama görseli,--validation_promptile bir doğrulama istemi belirtin. Bu, modelin hata ayıklanması için gerçekten faydalı olabilir.
Birden fazla GPU üzerinde eğitim yapıyorsanız, accelerate launch komutuna --multi_gpu parametresini ekleyin.
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_hubEğitim tamamlandıktan sonra, yeni InstructPix2Pix'inizi çıkarım için kullanabilirsiniz:
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")Farklı num_inference_steps, image_guidance_scale ve guidance_scale değerleriyle deneyler yaparak bunların çıkarım hızını ve kalitesini nasıl etkilediğini gözlemlemelisiniz. Rehberlik ölçeği parametreleri özellikle etkilidir çünkü orijinal görüntünün ve düzenleme talimatlarının düzenlenmiş görüntü üzerindeki etkisini kontrol ederler.
Stable Diffusion XL
Stable Diffusion XL (SDXL), yüksek çözünürlüklü görüntüler üreten güçlü bir metinden görüntüye modelidir ve mimarisine ikinci bir metin kodlayıcı ekler. Bir SDXL modelini görüntü düzenleme talimatlarını takip edecek şekilde eğitmek için train_instruct_pix2pix_sdxl.py betiğini kullanın.
SDXL eğitim betiği, SDXL eğitimi kılavuzunda daha ayrıntılı olarak ele alınmaktadır.
Sonraki adımlar
Kendi InstructPix2Pix modelinizi eğittiğiniz için tebrikler! 🥳 Model hakkında daha fazla bilgi edinmek için şunlar faydalı olabilir:
- InstructPix2Pix ile Stable Diffusion'u talimatla ayarlama hakkında daha fazla bilgi edinmek için InstructPix2Pix ile Stable Diffusion'u talimatla ayarlama blog yazısını okuyun; bu yazıda InstructPix2Pix ile yaptığımız bazı deneyler, veri seti hazırlığı ve farklı talimatlar için sonuçlar yer almaktadır.