Ce référentiel fournit une implémentation de DreamBooth utilisant KerasCV et TensorFlow. L'implémentation est largement inspirée de l'exemple diffusers
de Hugging Face.
DreamBooth est un moyen d'enseigner (affiner) rapidement la diffusion stable sur de nouveaux concepts visuels. Pour plus de détails, reportez-vous à ce document.
Le code fourni dans ce référentiel est uniquement destiné à des fins de recherche . Veuillez consulter cette section pour en savoir plus sur les cas d'utilisation potentiels et les limitations.
En chargeant ce modèle, vous acceptez la licence CreativeML Open RAIL-M sur https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE.
Si vous recherchez simplement les ressources qui accompagnent ce référentiel, voici les liens :
Mise à jour du 15/02/2023 : Merci à Soumik Rakshit ; nous disposons désormais de meilleurs utilitaires pour prendre en charge les pondérations et les biais (voir #22).
Installez les pré-requis : pip install -r requirements.txt
.
Vous devez d'abord choisir une classe à laquelle un identifiant unique est ajouté. Cette base de code de référentiel a été testée en utilisant sks
comme identifiant unique et dog
comme classe.
Ensuite, deux types d'invites sont générés :
(a) invite d'instance : f"une photo de {self.unique_id} {self.class_category}" (b) invite de classe : f"une photo de {self.class_category}"
Images d'instances
Obtenez quelques images (3 à 10) représentatives du concept avec lequel le modèle va être affiné. Ces images seraient associées au instance_prompt
. Ces images sont appelées instance_images
de la base de code. Archivez ces images et hébergez-les quelque part en ligne de manière à ce que l'archive puisse être téléchargée à l'aide de la fonction tf.keras.utils.get_file()
en interne.
Images de classe
DreamBooth utilise la perte de conservation préalable pour régulariser l'entraînement. Pour faire court, la perte de préservation antérieure aide le modèle à s'adapter lentement au nouveau concept considéré à partir de toute connaissance préalable qu'il aurait pu avoir sur le concept. Pour utiliser la perte de conservation préalable, nous avons besoin de l'invite de classe comme indiqué ci-dessus. L'invite de classe est utilisée pour générer un nombre prédéfini d'images qui sont utilisées pour calculer la perte finale utilisée pour la formation DreamBooth.
Selon cette ressource, 200 à 300 images générées à l'aide de l'invite de classe fonctionnent bien dans la plupart des cas.
Ainsi, après avoir décidé instance_prompt
et class_prompt
, utilisez ce Colab Notebook pour générer des images qui seraient utilisées pour la formation avec la perte de conservation préalable. Archivez ensuite les images générées en tant qu'archive unique et hébergez-les en ligne de manière à pouvoir les télécharger à l'aide de la fonction tf.keras.utils.get_file()
en interne. Dans la base de code, nous appelons simplement ces images class_images
.
Il est possible de réaliser une formation DreamBooth SANS recourir à une perte de conservation préalable. Ce référentiel l'utilise toujours. Pour que les utilisateurs puissent tester facilement cette base de code, nous avons hébergé les images d'instance et de classe ici.
Lancez la formation ! Il existe un certain nombre d’hyperparamètres avec lesquels vous pouvez jouer. Référez-vous au script train_dreambooth.py
pour en savoir plus à leur sujet. Voici une commande qui lance l'entraînement avec une précision mixte et d'autres valeurs par défaut :
python train_dreambooth.py --mp
Vous pouvez également affiner l'encodeur de texte en spécifiant l'option --train_text_encoder
.
De plus, le script prend en charge l'intégration avec les poids et les biais ( wandb
). Si vous spécifiez --log_wandb
,
wandb
à l'aide du rappel WandbMetricsLogger
.wandb
en tant qu'artefacts pour la gestion des versions du modèle. Cela se fait à l'aide du DreamBoothCheckpointCallback
qui a été construit à l'aide du rappel WandbModelCheckpoint
.wandb.Table
dans votre tableau de bord wandb
. Cela se fait à l'aide du QualitativeValidationCallback
, qui enregistre également les images générées dans un panneau multimédia sur votre tableau de bord wandb
à la fin de la formation.Voici une commande qui lance l'entraînement et enregistre les métriques d'entraînement et les images générées dans votre espace de travail Poids et biais :
python train_dreambooth.py
--log_wandb
--validation_prompts
" a photo of sks dog with a cat "
" a photo of sks dog riding a bicycle "
" a photo of sks dog peeing "
" a photo of sks dog playing cricket "
" a photo of sks dog as an astronaut "
Voici un exemple d'exécution wandb
où vous pouvez trouver les images générées ainsi que les points de contrôle du modèle.
Nous avons testé notre implémentation selon deux méthodes différentes : (a) affiner le modèle de diffusion (l'UNet) uniquement, (b) affiner le modèle de diffusion avec l'encodeur de texte. Les expériences ont été menées sur un large éventail d'hyperparamètres pour learning rate
et training steps
pendant l'entraînement, ainsi que pour number of steps
et unconditional guidance scale
(ugs) pendant l'inférence. Mais seuls les résultats les plus marquants (de notre point de vue) sont inclus ici. Si vous êtes curieux de savoir comment différents hyperparamètres affectent la qualité de l'image générée, recherchez le lien vers les rapports complets dans chaque section.
Notez que nos expériences ont été guidées par cet article de blog de Hugging Face.
Voici quelques résultats sélectionnés issus de diverses expériences que nous avons menées. Nos journaux expérimentaux pour ce paramètre sont disponibles ici. D'autres images de visualisation (générées avec les points de contrôle de ces expériences) sont disponibles ici.
Images | Mesures | UGS | Paramètre |
---|---|---|---|
50 | 30 | LR : 1e-6 Étapes d'entraînement : 800 (Poids) | |
25 | 15 | LR : 1e-6 Étapes d'entraînement : 1000 (Poids) | |
75 | 15 | LR : 3e-6 Étapes d'entraînement : 1200 (Poids) |
Images | Mesures | pouah |
---|---|---|
75 | 15 | |
75 | 30 |
avec taux d'apprentissage = 9e-06, pas de train maximum = 200 (poids | rapports)
Images | Mesures | pouah |
---|---|---|
150 | 15 | |
75 | 30 |
avec taux d'apprentissage = 9e-06, pas de train maximum = 200 (ensembles de données | rapports)
La bibliothèque diffusers
fournit des outils de pointe pour expérimenter différents modèles de diffusion, y compris la diffusion stable. Il comprend différentes techniques d'optimisation qui peuvent être exploitées pour effectuer une inférence efficace avec diffusers
lors de l'utilisation de grands points de contrôle de diffusion stable. Une fonctionnalité particulièrement avantageuse diffusers
est la prise en charge de différents planificateurs qui peuvent être configurés pendant l'exécution et peuvent être intégrés dans n'importe quel modèle de diffusion compatible.
Une fois que vous avez obtenu les points de contrôle affinés de DreamBooth à l'aide de cette base de code, vous pouvez les exporter dans un StableDiffusionPipeline
pratique et l'utiliser directement à partir de la bibliothèque diffusers
.
Considérez ce référentiel : chansung/dreambooth-dog. Vous pouvez utiliser les points de contrôle de ce référentiel dans un StableDiffusionPipeline
après avoir exécuté quelques petites étapes :
from diffusers import StableDiffusionPipeline
# checkpoint of the converted Stable Diffusion from KerasCV
model_ckpt = "sayakpaul/text-unet-dogs-kerascv_sd_diffusers_pipeline"
pipeline = StableDiffusionPipeline . from_pretrained ( model_ckpt )
pipeline . to ( "cuda" )
unique_id = "sks"
class_label = "dog"
prompt = f"A photo of { unique_id } { class_label } in a bucket"
image = pipeline ( prompt , num_inference_steps = 50 ). images [ 0 ]
Suivez ce guide pour en savoir plus.
Nous avons converti le point de contrôle affiné pour les images de chiens en StableDiffusionPipeline compatible avec les diffuseurs et avons mené diverses expériences avec différents paramètres de planificateur. Par exemple, les paramètres suivants du DDIMScheduler
sont testés sur un ensemble différent de guidance_scale
et num_inference_steps
.
num_inference_steps_list = [ 25 , 50 , 75 , 100 ]
guidance_scale_list = [ 7.5 , 15 , 30 ]
scheduler_configs = {
"DDIMScheduler" : {
"beta_value" : [
[ 0.000001 , 0.02 ],
[ 0.000005 , 0.02 ],
[ 0.00001 , 0.02 ],
[ 0.00005 , 0.02 ],
[ 0.0001 , 0.02 ],
[ 0.0005 , 0.02 ]
],
"beta_schedule" : [
"linear" ,
"scaled_linear" ,
"squaredcos_cap_v2"
],
"clip_sample" : [ True , False ],
"set_alpha_to_one" : [ True , False ],
"prediction_type" : [
"epsilon" ,
"sample" ,
"v_prediction"
]
}
}
Vous trouverez ci-dessous la comparaison entre les différentes valeurs des paramètres beta_schedule
tandis que d'autres sont fixées à leurs valeurs par défaut. Jetez un œil au rapport original qui inclut les résultats d'autres planificateurs tels que PNDMScheduler
et LMSDiscreteScheduler
.
On observe souvent que les paramètres par défaut garantissent la génération d’images de meilleure qualité. Par exemple, les valeurs par défaut de guidance_scale
et beta_schedule
sont définies sur 7,5 et linear
. Cependant, lorsque guidance_scale
est défini sur 7,5, scaled_linear
de beta_schedule
semble mieux fonctionner. Ou, lorsque beta_schedule
est défini sur linear
, guidance_scale
plus élevée semble mieux fonctionner.
Nous avons mené 4 800 expériences qui ont généré 38 400 images au total. Ces expériences sont enregistrées dans Poids et biais. Si vous êtes curieux, consultez-les ici ainsi que le script utilisé pour exécuter les expériences.
En plus des trucs et astuces partagés dans cet article de blog, nous avons suivi ces éléments lors de la préparation des instances pour mener une formation DreamBooth sur les visages humains :
Merci à Abhishek Thakur pour avoir partagé ces conseils.