View file src/colab/stable_diffusion_gen.py - Download

# -*- coding: utf-8 -*-
"""stable_diffusion_gen.ipynb

Automatically generated by Colaboratory.

Original file is located at
    https://colab.research.google.com/drive/1cKc_YoLbyLNP_2TausAHM_BDZIP1TwjS

Links :

- https://towardsdatascience.com/stable-diffusion-using-hugging-face-501d8dbdd8

- https://colab.research.google.com/github/fastai/diffusion-nbs/blob/master/Stable%20Diffusion%20Deep%20Dive.ipynb#scrollTo=650e1224-d757-45e9-a7cc-67d608bd73bd

- https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/stable_diffusion.ipynb

- https://colab.research.google.com/drive/1dlgggNa5Mz8sEAGU0wFCHhGLFooW_pf1?usp=sharing

- https://colab.research.google.com/drive/1qXCgWuH8VWldCszISA58SKp7w0w7OlJZ?usp=sharing

Stable Diffusion is based on a particular type of diffusion model called **Latent Diffusion**, proposed in [High-Resolution Image Synthesis with Latent Diffusion Models](https://arxiv.org/abs/2112.10752).

General diffusion models are machine learning systems that are trained to *denoise* random gaussian noise step by step, to get to a sample of interest, such as an *image*. For a more detailed overview of how they work, check [this colab](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/diffusers_intro.ipynb).

Latent diffusion can reduce the memory and compute complexity by applying the diffusion process over a lower dimensional _latent_ space, instead of using the actual pixel space. This is the key difference between standard diffusion and latent diffusion models: **in latent diffusion the model is trained to generate latent (compressed) representations of the images.**

There are three main components in latent diffusion.

1. An autoencoder (VAE).
2. A [U-Net](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/diffusers_intro.ipynb#scrollTo=wW8o1Wp0zRkq).
3. A text-encoder, *e.g.* [CLIP's Text Encoder](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModel).

**1. The autoencoder (VAE)**

The VAE model has two parts, an encoder and a decoder. The encoder is used to convert the image into a low dimensional latent representation, which will serve as the input to the *U-Net* model.
The decoder, conversely, transforms the latent representation back into an image.

 During latent diffusion _training_, the encoder is used to get the latent representations (_latents_) of the images for the forward diffusion process, which applies more and more noise at each step. During _inference_, the denoised latents generated by the reverse diffusion process are converted back into images using the VAE decoder. As we will see during inference we **only need the VAE decoder**.

**2. The U-Net**

The U-Net has an encoder part and a decoder part both comprised of ResNet blocks.
The encoder compresses an image representation into a lower resolution image representation and the decoder decodes the lower resolution image representation back to the original higher resolution image representation that is supposedly less noisy.
More specifically, the U-Net output predicts the noise residual which can be used to compute the predicted denoised image representation.

**3. The Text-encoder**

The text-encoder is responsible for transforming the input prompt, *e.g.* "An astronout riding a horse" into an embedding space that can be understood by the U-Net. It is usually a simple *transformer-based* encoder that maps a sequence of input tokens to a sequence of latent text-embeddings.

Here is a typical chart of a Python script using Stable Diffusion :

![stable_diffusion.png](data:image/png;base64,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)

Installations and imports
"""

diffusers_old_version = True

if diffusers_old_version:
  !pip install -q --upgrade transformers diffusers==0.2.4 ftfy
else:
  !pip install -q --upgrade transformers diffusers ftfy

from base64 import b64encode

import numpy
import torch
from diffusers import AutoencoderKL, LMSDiscreteScheduler, UNet2DConditionModel
from huggingface_hub import notebook_login

# For video display:
from IPython.display import HTML
from matplotlib import pyplot as plt
from pathlib import Path
from PIL import Image
from torch import autocast
from torchvision import transforms as tfms
from tqdm.auto import tqdm
from transformers import CLIPTextModel, CLIPTokenizer, logging

torch.manual_seed(1)
if not (Path.home()/'.huggingface'/'token').exists(): notebook_login()

# Supress some unnecessary warnings when loading the CLIPTextModel
logging.set_verbosity_error()

# Set device
torch_device = "cuda" if torch.cuda.is_available() else "cpu"


# Load the autoencoder model which will be used to decode the latents into image space.
vae = AutoencoderKL.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="vae")

# Load the tokenizer and text encoder to tokenize and encode the text.
tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14")
text_encoder = CLIPTextModel.from_pretrained("openai/clip-vit-large-patch14")

# The UNet model for generating the latents.
unet = UNet2DConditionModel.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="unet")

# The noise scheduler
scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000)

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

"""Functions"""

def pil_to_latent(input_im):
    # Single image -> single latent in a batch (so size 1, 4, 64, 64)
    with torch.no_grad():
        latent = vae.encode(tfms.ToTensor()(input_im).unsqueeze(0).to(torch_device)*2-1) # Note scaling
    if diffusers_old_version:
      return 0.18215 * latent.mode()
    else:
      return 0.18215 * latent.latent_dist.sample()

def latents_to_pil(latents):
    # bath of latents -> list of images
    latents = (1 / 0.18215) * latents
    with torch.no_grad():
      image = vae.decode(latents)
      if not diffusers_old_version:
        image = image.sample
    image = (image / 2 + 0.5).clamp(0, 1)
    image = image.detach().cpu().permute(0, 2, 3, 1).numpy()
    images = (image * 255).round().astype("uint8")
    pil_images = [Image.fromarray(image) for image in images]
    return pil_images

def generate(guidance_scale, num_inference_steps, seed, prompts, nprompts=[("", 1)], input_image=None, start_step=0, start_loop=None):

  if not start_loop:
    start_loop = start_step

  height = 512                        # default height of Stable Diffusion
  width = 512                         # default width of Stable Diffusion
  batch_size = 1

  generator = torch.manual_seed(seed)   # Seed generator to create the inital latent noise

  # Prep text
  # text_input = tokenizer(prompt, padding="max_length", max_length=tokenizer.model_max_length, truncation=True, return_tensors="pt")
  # with torch.no_grad():
  #   text_embeddings = text_encoder(text_input.input_ids.to(torch_device))[0]
  # max_length = text_input.input_ids.shape[-1]
  # uncond_input = tokenizer(
  #   [nprompt] * batch_size, padding="max_length", max_length=max_length, return_tensors="pt"
  # )
  # with torch.no_grad():
  #   uncond_embeddings = text_encoder(uncond_input.input_ids.to(torch_device))[0]
  # text_embeddings = torch.cat([uncond_embeddings, text_embeddings])

  i = 0
  for prompt in prompts:
    i += 1
    text_input = tokenizer([prompt[0]], padding="max_length", max_length=tokenizer.model_max_length, truncation=True, return_tensors="pt")
    with torch.no_grad():
      text_embeddings_i = text_encoder(text_input.input_ids.to(torch_device))[0]
    if (i == 1):
      text_embeddings = text_embeddings_i * prompt[1]
    else:
      text_embeddings += text_embeddings_i * prompt[1]

  # Prompt amplification :
  # The text embeddings are the concatenation of the text embeddings for an empty prompt and the text embeddings for the given prompt
  max_length = text_input.input_ids.shape[-1]

  i = 0
  for nprompt in nprompts:
    i += 1
    uncond_input = tokenizer(
      [nprompt[0]] * batch_size, padding="max_length", max_length=max_length, return_tensors="pt"
    )
    with torch.no_grad():
      uncond_embeddings_i = text_encoder(uncond_input.input_ids.to(torch_device))[0]
    if i == 1:
      uncond_embeddings = uncond_embeddings_i * nprompt[1]
    else:
      uncond_embeddings += uncond_embeddings_i * nprompt[1]
    text_embeddings = torch.cat([uncond_embeddings, text_embeddings])


  # Prep Scheduler
  scheduler.set_timesteps(num_inference_steps)

  # Prep latents
  if not input_image:
    latents = torch.randn(
      (batch_size, unet.in_channels, height // 8, width // 8),
      generator=generator,
    )
    latents = latents.to(torch_device)
    # latents = latents * scheduler.init_noise_sigma # Scaling (previous versions did latents = latents * self.scheduler.sigmas[0]
    latents = latents * scheduler.sigmas[start_step]
  else:
    # Encode to the latent space
    encoded = pil_to_latent(input_image)
    # start_sigma = scheduler.sigmas[start_step]
    noise = torch.randn_like(encoded)
    if diffusers_old_version:
      latents = scheduler.add_noise(encoded, noise, timesteps=int(scheduler.timesteps[start_step]))
    else:
      latents = scheduler.add_noise(encoded, noise, timesteps=torch.tensor([scheduler.timesteps[start_step]]))
    latents = latents.to(torch_device) # .float()
    # latents = latents * start_sigma
    if diffusers_old_version:
      latents = latents * scheduler.sigmas[start_step]

  # Loop
  with autocast(torch_device):
    for i, t in tqdm(enumerate(scheduler.timesteps)):
      if i >= start_loop:
        # expand the latents if we are doing classifier-free guidance to avoid doing two forward passes.
        latent_model_input = torch.cat([latents] * 2)
        sigma = scheduler.sigmas[i]
        # Scale the latents (preconditioning):
        latent_model_input = latent_model_input / ((sigma**2 + 1) ** 0.5) # Diffusers 0.3 and below
        # latent_model_input = scheduler.scale_model_input(latent_model_input, t)

        # predict the noise residual
        with torch.no_grad():
            noise_pred = unet(latent_model_input, t, encoder_hidden_states=text_embeddings)["sample"]

        # perform guidance
        noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)
        noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)

        # compute the previous noisy sample x_t -> x_t-1
        if diffusers_old_version:
          latents = scheduler.step(noise_pred, i, latents)["prev_sample"] # Diffusers 0.3 and below
        else:
          latents = scheduler.step(noise_pred, t, latents)["prev_sample"]

  # scale and decode the image latents with vae
  latents = 1 / 0.18215 * latents
  with torch.no_grad():
    image = vae.decode(latents)
    if not diffusers_old_version:
      image = image.sample

  # Display
  image = (image / 2 + 0.5).clamp(0, 1)
  image = image.detach().cpu().permute(0, 2, 3, 1).numpy()
  images = (image * 255).round().astype("uint8")
  pil_images = [Image.fromarray(image) for image in images]
  return pil_images[0]

  # return latents_to_pil(latents)[0]

"""Examples of image generation from a simple prompt"""

prompt = [("A watercolor painting of an otter", 1)]
num_inference_steps = 30            # Number of denoising steps
guidance_scale = 7.5                # Scale for classifier-free guidance
seed = 32
generate(guidance_scale, num_inference_steps, seed, prompt)

guidance_scale = 6
num_inference_steps = 20
seed = 13
prompt = [("An astronaut riding a horse", 1)]
image = generate(guidance_scale, num_inference_steps, seed, prompt)
display(image)

"""Prompt hybridation : a flower-bird"""

guidance_scale = 8
num_inference_steps = 12
seed = 32
prompt = [("a flower", 0.52), ("a bird", 0.48)]
image = generate(guidance_scale, num_inference_steps, seed, prompt)
display(image)

"""Prompt hybridation : a mouse-leopard"""

guidance_scale = 7.5
num_inference_steps = 30
seed = 32
prompt = [("A mouse", 0.5), ("A leopard", 0.5)]
image = generate(guidance_scale, num_inference_steps, seed, prompt)
display(image)

"""Image generation from a prompt and another image (image to image)"""

!curl --output house.jpg 'http://log.chez.com/images/house.jpg'

# Input image
img_name = "house.jpg"
input_image = Image.open(img_name).resize((512, 512))
display(input_image)

prompt = [("A drawing of a small house on a green hill with a tree beside", 1)]
nprompt = [("", 1)]
num_inference_steps = 50           # Number of denoising steps
guidance_scale = 7.5               # Scale for classifier-free guidance
seed = 32
start_step = 10
start_loop = 10

for seed in range(30, 40):
  # for guidance_scale in range(1,12):
    #for start_step in range(1,20):
      #for start_loop in range(5, 15):
        # start_loop = start_step + 1
        print(f"seed={seed} start_step={start_step} start_loop={start_loop} scale={guidance_scale}")
        image = generate(guidance_scale, num_inference_steps, seed, prompt, nprompt, input_image, start_step, start_loop)
        display(image)

!curl --output house.jpg 'http://log.chez.com/images/house.jpg'

# Input image
img_name = "house.jpg"
input_image = Image.open(img_name).resize((512, 512))
display(input_image)
# input_image = None

# prompt = [("A color drawing of a small house on a green hill with a tree beside", 1)]
prompt = [("A painting of a small house on a green hill with a tree beside", 1)]
nprompt = [("", 1)]
num_inference_steps = 50           # Number of denoising steps
guidance_scale = 2                # Scale for classifier-free guidance
seed = 32
start_step = 10
start_loop = 11

for seed in range(30, 40):
  # for guidance_scale in range(1,12):
    #for start_step in range(1,20):
      #for start_loop in range(5, 15):
        # start_loop = start_step + 1
        print(f"seed={seed} start_step={start_step} start_loop={start_loop} scale={guidance_scale}")
        image = generate(guidance_scale, num_inference_steps, seed, prompt, nprompt, input_image, start_step, start_loop)
        display(image)

# Download a demo Image
!curl --output macaw.jpg 'https://lafeber.com/pet-birds/wp-content/uploads/2018/06/Scarlet-Macaw-2.jpg'
# Load the image with PIL
input_image = Image.open('macaw.jpg').resize((512, 512))
display(input_image)
# Encode to the latent space
encoded = pil_to_latent(input_image)

# Settings (same as before except for the new prompt)
prompt = [("A colorful dancer, nat geo photo", 1)]
nprompt = [("", 1)]
num_inference_steps = 50            # Number of denoising steps
guidance_scale = 8                  # Scale for classifier-free guidance
seed = 32
start_step = 10

image = generate(guidance_scale, num_inference_steps, seed, prompt, nprompt, input_image, start_step)
display(image)

import urllib
guidance_scale = 8
num_inference_steps = 40
seed = 34
prompt = [("A colorful dancer, nat geo photo", 1)]
nprompt = [("", 1)]
input_image_url = "https://img.cutenesscdn.com/630x/clsd/getty/33e691dded7d4ddc87a83613469f897e?type=webp"
urllib.request.urlretrieve(input_image_url, "alter_input.jpg")
input_image = Image.open('alter_input.jpg').resize((512, 512))
display(input_image)
start_step = 4

image = generate(guidance_scale, num_inference_steps, seed, prompt, nprompt, input_image, start_step)
display(image)

"""Negative prompt : gardens with few flowers"""

guidance_scale = 7.5
seeds = range(0, 8)
num_inference_steps = 20
prompt = [("A garden", 1)]
nprompt = [("flower", 1)]

for seed in seeds:
  image = generate(guidance_scale, num_inference_steps, seed, prompt)
  print(f"seed={seed} without negative prompt")
  display(image)
  image = generate(guidance_scale, num_inference_steps, seed, prompt, nprompt)
  print(f"seed={seed} with negative prompt")
  display(image)