Stabile Diffusion erklärt. Große Text-zu-Bild-Modelle haben… | von Onkar Mishra | Juni 2023

0
27


Bei der latenten Diffusion gibt es hauptsächlich drei Hauptkomponenten:

  1. Ein Autoencoder (VAE).
  2. A U-Net.
  3. Ein Textual content-Encoder, z.B CLIPs Text-Encoder.

1. Der Autoencoder (VAE)

TDas VAE-Modell besteht aus zwei Teilen, einem Encoder und einem Decoder. Während der latenten Diffusion Ausbildung, Der Encoder wandelt ein 512*512*3-Bild für den Vorwärtsdiffusionsprozess in eine niedrigdimensionale latente Darstellung eines Bildes mit einer Größe von beispielsweise 64*64*4 um. Wir bezeichnen diese kleinen codierten Versionen von Bildern als latente. Mit jedem Trainingsschritt wenden wir mehr und mehr Rauschen auf diese Latenten an. Diese codierte latente Darstellung von Bildern dient als Eingabe für die U-Web Modell.

Hier konvertieren wir ein Formbild (3, 512, 512) in eine latente Kind(4, 64, 64), was 48-mal weniger Speicher benötigt. Dies führt im Vergleich zu Pixelraum-Diffusionsmodellen zu geringeren Speicher- und Rechenanforderungen. Somit sind wir in der Lage zu generieren 512 × 512 Bilder auch auf 16-GB-Colab-GPUs sehr schnell.

Der Decoder wandelt die latente Darstellung wieder in ein Bild um. Wir wandeln die entrauschten Latentsignale, die durch den umgekehrten Diffusionsprozess erzeugt werden, mithilfe des VAE-Decoders in Bilder um.

Während InferenzWir benötigen lediglich den VAE-Decoder, um das entrauschte Bild in tatsächliche Bilder umzuwandeln.

from torchvision import transforms as tfms
from diffusers import AutoencoderKL

# Load the autoencoder mannequin which shall be used to decode the latents into picture area.
vae = AutoencoderKL.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="vae")

# To the GPU we go!
vae = vae.to(torch_device)

# Convert PIL picture to latents

def pil_to_latent(input_im):
# Single picture -> single latent in a batch (so measurement 1, 4, 64, 64)
with torch.no_grad():
latent = vae.encode(tfms.ToTensor()(input_im).unsqueeze(0).to(torch_device)*2-1) # Be aware scaling
return 0.18215 * latent.latent_dist.pattern()

2. UNet

TDas U-Web sagt eine entrauschte Bilddarstellung verrauschter latenter Objekte voraus. Hier fungieren verrauschte Latentdaten als Eingabe für Unet und die Ausgabe von UNet ist Rauschen in den Latentdaten. Auf diese Weise können wir tatsächliche Latentwerte erhalten, indem wir das Rauschen von den verrauschten Latentwerten subtrahieren.

Das Unet, das die verrauschten Latentdaten (x) aufnimmt und das Rauschen vorhersagt. Wir verwenden ein bedingtes Modell, das auch den Zeitschritt



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here