Dieses Repository bietet eine Implementierung von DreamBooth mit KerasCV und TensorFlow. Die Implementierung bezieht sich stark auf das diffusers
-Beispiel von Hugging Face.
DreamBooth ist eine Möglichkeit, Stable Diffusion schnell neue visuelle Konzepte beizubringen (zu optimieren). Weitere Einzelheiten finden Sie in diesem Dokument.
Der in diesem Repository bereitgestellte Code dient ausschließlich Forschungszwecken . Bitte lesen Sie diesen Abschnitt, um mehr über die möglichen Anwendungsfälle und Einschränkungen zu erfahren.
Durch das Laden dieses Modells akzeptieren Sie die CreativeML Open RAIL-M-Lizenz unter https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE.
Wenn Sie nur nach den begleitenden Ressourcen dieses Repositorys suchen, finden Sie hier die Links:
Update 15.02.2023 : Danke an Soumik Rakshit; Wir verfügen jetzt über bessere Dienstprogramme zur Unterstützung von Gewichtungen und Verzerrungen (siehe Nr. 22).
Installieren Sie die Voraussetzungen: pip install -r requirements.txt
.
Sie müssen zunächst eine Klasse auswählen, an die eine eindeutige Kennung angehängt wird. Diese Repository-Codebasis wurde mit sks
als eindeutigem Bezeichner und dog
als Klasse getestet.
Dann werden zwei Arten von Eingabeaufforderungen generiert:
(a) Instanz-Eingabeaufforderung : f „ein Foto von {self.unique_id} {self.class_category}“ (b) Klassen-Eingabeaufforderung : f „ein Foto von {self.class_category}“
Instanzbilder
Besorgen Sie sich ein paar Bilder (3–10), die repräsentativ für das Konzept sind, mit dem das Modell verfeinert werden soll. Diese Bilder würden mit der instance_prompt
verknüpft werden. Diese Bilder werden als instance_images
aus der Codebasis bezeichnet. Archivieren Sie diese Bilder und hosten Sie sie irgendwo online, sodass das Archiv intern mit der Funktion tf.keras.utils.get_file()
heruntergeladen werden kann.
Klassenbilder
DreamBooth nutzt den Verlust der vorherigen Erhaltung, um das Training zu regulieren. Um es kurz zu machen: Der Prior-Preservation-Loss hilft dem Modell, sich langsam an das neue Konzept anzupassen, das in Betracht gezogen wird, und zwar ausgehend von eventuell vorhandenen Vorkenntnissen über das Konzept. Um den Prior-Preservation-Loss zu verwenden, benötigen wir die oben gezeigte Klassenaufforderung. Die Klasseneingabe wird verwendet, um eine vordefinierte Anzahl von Bildern zu generieren, die zur Berechnung des endgültigen Verlusts für das DreamBooth-Training verwendet werden.
Laut dieser Ressource funktionieren in den meisten Fällen 200–300 Bilder, die mithilfe der Klassenaufforderung generiert wurden.
Nachdem Sie sich also instance_prompt
und class_prompt
entschieden haben, verwenden Sie dieses Colab-Notizbuch, um einige Bilder zu generieren, die für das Training mit dem Verlust der vorherigen Erhaltung verwendet werden. Anschließend archivieren Sie die generierten Bilder als einzelnes Archiv und hosten es online, sodass es mithilfe der internen Funktion tf.keras.utils.get_file()
heruntergeladen werden kann. In der Codebasis bezeichnen wir diese Bilder einfach als class_images
.
Es ist möglich, DreamBooth-Schulungen durchzuführen, OHNE einen vorherigen Konservierungsverlust zu verwenden. Dieses Repository verwendet es immer. Damit Benutzer diese Codebasis einfacher testen können, haben wir die Instanz- und Klassenbilder hier gehostet.
Training starten! Es gibt eine Reihe von Hyperparametern, mit denen Sie herumspielen können. Weitere Informationen dazu finden Sie im Skript train_dreambooth.py
. Hier ist ein Befehl, der das Training mit gemischter Genauigkeit und anderen Standardwerten startet:
python train_dreambooth.py --mp
Sie können den Text-Encoder auch optimieren, indem Sie die Option --train_text_encoder
angeben.
Darüber hinaus unterstützt das Skript die Integration mit Weights and Biases ( wandb
). Wenn Sie --log_wandb
angeben,
WandbMetricsLogger
Rückrufs werden die Trainingsmetriken automatisch in Ihrem wandb
-Dashboard protokolliert.wandb
-Projekt hochgeladen. Dies erfolgt mit dem DreamBoothCheckpointCallback
, der mit WandbModelCheckpoint
-Callback erstellt wurde.wandb.Table
in Ihrem wandb
-Dashboard. Dies erfolgt mithilfe des QualitativeValidationCallback
, der am Ende des Trainings auch generierte Bilder in einem Medienfeld auf Ihrem wandb
-Dashboard protokolliert.Hier ist ein Befehl, der das Training startet und Trainingsmetriken und generierte Bilder in Ihrem Arbeitsbereich „Gewichtungen und Verzerrungen“ protokolliert:
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 "
Hier ist ein Beispiel für wandb
-Lauf, in dem Sie die generierten Bilder sowie die Modellprüfpunkte finden können.
Wir haben unsere Implementierung mit zwei verschiedenen Methoden getestet: (a) Feinabstimmung nur des Diffusionsmodells (UNet), (b) Feinabstimmung des Diffusionsmodells zusammen mit dem Text-Encoder. Die Experimente wurden mit einem breiten Spektrum von Hyperparametern für learning rate
und training steps
während des Trainings sowie für number of steps
und unconditional guidance scale
(ugs) während der Inferenz durchgeführt. Hier werden jedoch nur die (aus unserer Sicht) hervorstechendsten Ergebnisse aufgeführt. Wenn Sie neugierig sind, wie sich unterschiedliche Hyperparameter auf die generierte Bildqualität auswirken, finden Sie in jedem Abschnitt den Link zu den vollständigen Berichten.
Beachten Sie, dass sich unsere Experimente an diesem Blogbeitrag von Hugging Face orientiert haben.
Hier finden Sie einige ausgewählte Ergebnisse verschiedener von uns durchgeführter Experimente. Unsere experimentellen Protokolle für diese Einstellung finden Sie hier. Weitere Visualisierungsbilder (generiert mit den Kontrollpunkten dieser Experimente) sind hier verfügbar.
Bilder | Schritte | UGS | Einstellung |
---|---|---|---|
50 | 30 | LR: 1e-6 Trainingsschritte: 800 (Gewichte) | |
25 | 15 | LR: 1e-6 Trainingsschritte: 1000 (Gewichte) | |
75 | 15 | LR: 3e-6 Trainingsschritte: 1200 (Gewichte) |
Bilder | Schritte | ugs |
---|---|---|
75 | 15 | |
75 | 30 |
mit Lernrate = 9e-06, max. Trainingsschritte = 200 (Gewichte | Berichte)
Bilder | Schritte | ugs |
---|---|---|
150 | 15 | |
75 | 30 |
mit Lernrate = 9e-06, maximale Trainingsschritte = 200 (Datensätze | Berichte)
Die diffusers
-Bibliothek bietet hochmoderne Werkzeuge zum Experimentieren mit verschiedenen Diffusionsmodellen, einschließlich Stable Diffusion. Es umfasst verschiedene Optimierungstechniken, die genutzt werden können, um bei Verwendung großer Stable-Diffusion-Kontrollpunkte eine effiziente Inferenz mit diffusers
durchzuführen. Eine besonders vorteilhafte Funktion diffusers
ist die Unterstützung verschiedener Scheduler, die zur Laufzeit konfiguriert und in jedes kompatible Diffusionsmodell integriert werden können.
Sobald Sie mit dieser Codebasis die fein abgestimmten Prüfpunkte von DreamBooth erhalten haben, können Sie diese tatsächlich in eine praktische StableDiffusionPipeline
exportieren und sie direkt aus der diffusers
verwenden.
Betrachten Sie dieses Repository: chansung/dreambooth-dog. Sie können die Prüfpunkte dieses Repositorys in einer StableDiffusionPipeline
verwenden, nachdem Sie einige kleine Schritte ausgeführt haben:
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 ]
Folgen Sie dieser Anleitung, um mehr zu erfahren.
Wir haben den fein abgestimmten Kontrollpunkt für die Hundebilder in eine mit Diffusoren kompatible StableDiffusionPipeline konvertiert und verschiedene Experimente mit unterschiedlichen Zeitplanereinstellungen durchgeführt. Beispielsweise werden die folgenden Parameter des DDIMScheduler
auf einem anderen Satz von guidance_scale
und num_inference_steps
getestet.
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"
]
}
}
Nachfolgend finden Sie den Vergleich zwischen verschiedenen Werten von beta_schedule
-Parametern, während andere auf ihre Standardwerte festgelegt sind. Sehen Sie sich den Originalbericht an, der die Ergebnisse anderer Planer wie PNDMScheduler
und LMSDiscreteScheduler
enthält.
Es wird oft beobachtet, dass die Standardeinstellungen eine bessere Bildqualität garantieren. Beispielsweise sind die Standardwerte von guidance_scale
und beta_schedule
auf 7,5 und linear
festgelegt. Wenn guidance_scale
jedoch auf 7,5 eingestellt ist, scheint scaled_linear
des beta_schedule
besser zu funktionieren. Oder wenn beta_schedule
auf linear
eingestellt ist, scheint ein höherer guidance_scale
besser zu funktionieren.
Wir führten 4.800 Experimente durch, die insgesamt 38.400 Bilder erzeugten. Diese Experimente werden in Gewichtungen und Verzerrungen protokolliert. Wenn Sie neugierig sind, schauen Sie sich diese sowie das Skript, mit dem die Experimente ausgeführt wurden, hier an.
Zusätzlich zu den in diesem Blogbeitrag geteilten Tipps und Tricks haben wir bei der Vorbereitung der Instanzen für die Durchführung von DreamBooth-Schulungen an menschlichen Gesichtern die folgenden Punkte beachtet:
Vielen Dank an Abhishek Thakur für das Teilen dieser Tipps.