Table of Contents
Stable Diffusion, metinden görüntüye dönüştürme konusunda devrim yaratan bir derin öğrenme modelidir. Bu model, basit bir metin açıklamasını kullanarak son derece gerçekçi ve sanatsal görüntüler oluşturabilir. Stable Diffusion, LAION-5B adı verilen 5.85 milyar görüntü-metin çiftinden oluşan veri setinin alt kümesinden alınan 512×512 görüntüler ile eğitilmiştir.
Stable Diffusion; CLIPText, U-Net ve Variational Autoencoder’den oluşur. Temelde şu adımlardan geçer;
- CLIPText modeli ile prompt kodlanır.
- Rastgele bir gürültü oluşturulur.
- U-Net, gürültü ve kodlanmış metni girdi olarak kullanır ve çıktı olarak görüntünün gizli bir temsili oluşturur.
- Variational Autoencoder ile görüntünün gizli temsili çözülerek görüntü orijinal boyuta döndürülür.
CLIP
CLIP (Contrastive Language-Image Pretraining), OpenaI tarafından geliştirilmiştir. Hem görüntüler hem de metinler için bir gömülü uzayda eğitilmiş, görsel ve metin verileri arasındaki ilişkileri keşfetmek için kullanılır. Metinlerin belirli bir uzayda gömülmesini ve görsel verilerle karşılaştırılabilir bir şekilde temsil edilmesini sağlar. Stable Diffusion’da CLIP tarafından üretilen vektörler modelin Attention katmanlarından birçok kez geçer. Bu Attention katmanları cross-attention prensibiyle çalışır.
Cross-Attention
Cross-Attention, bir veri kümesindeki her bir elemanın, başka bir veri kümesindeki tüm elemanlara olan dikkatini ölçer. Bu, bir veri kümesindeki her bir elemanın, diğer veri kümesindeki en uygun başlıkları veya ilişkili elemanları belirlemesine yardımcı olur. Stable Diffusion’da bir resmin belirli bir metin açıklaması ile ilişkilendirmek için kullanılır.
U-Net
Görüntü oluşturma aşamasında kullanılır. Gürültüden yola çıkarak gerçekçi bir görüntü oluşturur.
Variational Autoencoder
Encoder, 512×512 boyutundaki görüntü 64×64 boyutuna düşürülerek U-Net modeline girdi olarak gönderilir. Decoder, gizli temsili tekrar görüntüye dönüştürür. Reverse Diffusion sonrası üretilen gürültüden arındırılmış temsilleri görüntüye dönüştürür.
Diffusers Kütüphanesi ile Kullanımı
Diffusers kütüphanesi ile önceden eğitilmiş çeşitli modelleri kullanarak metinden görüntü üretebiliriz. Aşağıdaki kodda veri setindeki her bir satırda bulunan hikaye metinlerini BART ile özetleyip bu özetlenmiş metni kullanarak bir görüntü oluşturacağız. İlgili kodlara bu linkten erişebilirsiniz.
import pandas as pd
import matplotlib.pyplot as plt
import torch
from transformers import BartTokenizer, BartForConditionalGeneration
from diffusers import StableDiffusionPipeline
from tqdm import tqdm
df = pd.read_csv('/kaggle/input/grimms-fairy-tales/grimms_fairytales.csv', index_col=0)
pipe1 = StableDiffusionPipeline.from_pretrained(
'CompVis/stable-diffusion-v1-4', revision='fp16', torch_dtype=torch.float16
)
pipe1.to('cuda')
bart_model = BartForConditionalGeneration.from_pretrained("facebook/bart-large-cnn")
bart_tokenizer = BartTokenizer.from_pretrained("facebook/bart-large-cnn")
device = 'cuda'
seed = 7
for i, item in df[:1].iterrows():
test = item['Text']
inputs = bart_tokenizer([test], max_length=1024, return_tensors="pt")
summary_ids = bart_model.generate(inputs['input_ids'], num_beams=4, max_length=100, early_stopping=True)
summary = ([bart_tokenizer.decode(i, skip_special_tokens=True, clean_up_tokenization_spaces=False) for i in summary_ids])
prompt = summary[0]
images = pipe1(
prompt=prompt,
generator=torch.Generator('cuda').manual_seed(seed)
).images
plt.figure(figsize=(5, 5))
plt.imshow(images[0])
plt.title(item['Title'])
plt.axis('off')
plt.show()