//Stable_Diffusion.ipynb//
#Le texte commenté (#) en vert ne correspondent pas à du code exécutable. Il s’agit d’indications que nous avons rajouté afin de vous aider à comprendre notre modèle.
#On vérifie le type de GPU et de VRAM disponibles.
#GPU = puce informatique qui effectue des calculs mathématiques rapides, principalement pour le rendu d'images.
#VRAM = mémoire vidéo.
!nvidia-smi --query-gpu=name,memory.total,memory.free --format=csv,noheader
#On se connecte à HuggingFace, bibliothèque open source contenant des modèles pré-formés.
!mkdir -p ~/.huggingface
HUGGINGFACE_TOKEN = "" #@param {type:"string"}
!echo -n "{HUGGINGFACE_TOKEN}" > ~/.huggingface/token
#On installe les xformers à partir de wheels précompilés.
xformers = bibliothèque de modèles pré-entraînés.
wheels = composants de l'écosystème Python qui aident à faire fonctionner les installations de packs.
#On sauvegarde les paramètres du modèle dans notre Google drive.
save_to_gdrive = False
if save_to_gdrive:
from google.colab import drive
drive.mount('/content/drive')
MODEL_NAME = "runwayml/stable-diffusion-v1-5"
OUTPUT_DIR = "stable_diffusion_weights/zwx"
if save_to_gdrive:
OUTPUT_DIR = "/content/drive/MyDrive/" + OUTPUT_DIR
else:
OUTPUT_DIR = "/content/" + OUTPUT_DIR
print(f"[*] Weights will be saved at {OUTPUT_DIR}")
!mkdir -p $OUTPUT_DIR
#On crée une liste à partir de notre corpus d’images.
concepts_list = [
{
"instance_prompt": "photo of sacristy room",
"class_prompt": "photo of a room",
"instance_data_dir": "/content/data/sacristy",
"class_data_dir": "/content/data/room"
},
{
"instance_prompt": "photo of screens furniture",
"class_prompt": "photo of a furniture",
"instance_data_dir": "/content/data/screens",
"class_data_dir": "/content/data/furniture"
}
]
import json
import os
for c in concepts_list:
os.makedirs(c["instance_data_dir"], exist_ok=True)
with open("concepts_list.json", "w") as f:
json.dump(concepts_list, f, indent=4)
#On télécharge notre corpus d’images.
import os
from google.colab import files
import shutil
for c in concepts_list:
print(f"Uploading instance images for {c['instance_prompt']}")
uploaded = files.upload()
for filename in uploaded.keys():
dst_path = os.path.join(c['instance_data_dir'], filename)
shutil.move(filename, dst_path)
#On entraine notre corpus d’images.
!accelerate launch train_dreambooth.py
--pretrained_model_name_or_path=$MODEL_NAME
--pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse"
--output_dir=$OUTPUT_DIR
--revision="fp16"
--with_prior_preservation --prior_loss_weight=1.0
--seed=1337
--resolution=512
--train_batch_size=1
--train_text_encoder
--mixed_precision="fp16"
--use_8bit_adam
--gradient_accumulation_steps=1
--learning_rate=1e-6
--lr_scheduler="constant"
--lr_warmup_steps=0
--num_class_images=50
--sample_batch_size=4
--max_train_steps=800
--save_interval=10000
--concepts_list="concepts_list.json"
#On renseigne le chemin d’accès vers les paramètres du modèle pré-entrainé.
WEIGHTS_DIR = "" #@param {type:"string"}
if WEIGHTS_DIR == "":
from natsort import natsorted
from glob import glob
import os
WEIGHTS_DIR = natsorted(glob(OUTPUT_DIR + os.sep + ""))[-1]
print(f"[] WEIGHTS_DIR={WEIGHTS_DIR}")
#On renseigne le chemin d’accès vers les paramètres du modèle pré-entrainé.
WEIGHTS_DIR = "" #@param {type:"string"}
if WEIGHTS_DIR == "":
from natsort import natsorted
from glob import glob
import os
WEIGHTS_DIR = natsorted(glob(OUTPUT_DIR + os.sep + ""))[-1]
print(f"[] WEIGHTS_DIR={WEIGHTS_DIR}")
#On demande à utiliser le modèle pré-entrainé.
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline, DDIMScheduler
from IPython.display import display
model_path = WEIGHTS_DIR # If you want to use previously trained model saved in gdrive, replace this with the full path of model in gdrive
pipe = StableDiffusionPipeline.from_pretrained(model_path, safety_checker=None, torch_dtype=torch.float16).to("cuda")
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)
pipe.enable_xformers_memory_efficient_attention()
g_cuda = None
#On vient générer nos images à partir d’une entrée textuelle, le prompt.
prompt = "photo of a sacristy formed by three red satin screens"
negative_prompt = ""
num_samples = 4
guidance_scale = 7.5
num_inference_steps = 24
height = 512
width = 512
with autocast("cuda"), torch.inference_mode():
images = pipe(
prompt,
height=height,
width=width,
negative_prompt=negative_prompt,
num_images_per_prompt=num_samples,
num_inference_steps=num_inference_steps,
guidance_scale=guidance_scale,
generator=g_cuda
).images
for img in images:
display(img)