Dieses Repository bietet Code für die feine stabile Diffusion in Keras. Es wird aus diesem Skript durch Umarmung des Gesichts angepasst. Das für die Feinabstimmung verwendete vorgeborene Modell stammt von Kerascv. Über das Originalmodell informieren Sie diese Dokumentation.
Der in diesem Repository bereitgestellte Code dient nur zu Forschungszwecken . Bitte überprüfen Sie diesen Abschnitt, um mehr über die potenziellen Anwendungsfälle und Einschränkungen zu erfahren.
Wenn Sie dieses Modell laden, 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:
Inhaltsverzeichnis :
Dieses Repository verfügt über ein Schwester-Repository (Keras-SD-Diener), das verschiedene Bereitstellungsmuster für eine stabile Diffusion abdeckt.
Update 13. Januar 2023 : Dieses Projekt hat den 2. Platz beim ersten von Google organisierten Wettbewerb der Keras-Community-Preis sichergestellt.
Nach dem ursprünglichen Skript von Sugging Face verwendet dieses Repository auch den Pokemon -Datensatz. Aber es wurde regeneriert, um mit tf.data besser zu arbeiten. Die regenerierte Version des Datensatzes wird hier gehostet. Weitere Informationen finden Sie in diesem Link.
Der Feinabstimmungscode ist in finetune.py bereitgestellt. Stellen Sie vor dem Ausführen der Schulung sicher, dass die Abhängigkeiten (siehe requirements.txt ) installiert sind.
Sie können ein Training mit den Standardargumenten starten, indem Sie python finetune.py ausführen. Führen Sie python finetune.py -h aus, um über die unterstützten Befehlszeilenargumente zu erfahren. Sie können ein Training mit gemischtem Präzision aktivieren, indem Sie das Flag --mp Flag übergeben.
Beim Starten des Trainings wird ein Diffusionsmodell-Checkpoint nur dann epoch generiert, wenn der aktuelle Verlust niedriger als der vorherige ist.
Um OOM und schnelleres Training zu vermeiden, wird empfohlen, zumindest eine V100 -GPU zu verwenden. Wir haben einen A100 verwendet.
Einige wichtige Details zu beachten :
Trainingsdetails :
Wir haben das Modell mit zwei verschiedenen Auflösungen fein abgestimmt: 256x256 und 512x512. Wir haben nur die Chargengröße und Anzahl der Epochen für die Feinabstimmung mit diesen beiden verschiedenen Auflösungen variiert. Da wir keine Gradientenakkumulation verwendet haben, verwenden wir diesen Code -Snippet, um die Anzahl der Epochen abzuleiten.
python finetune.py --batch_size 4 --num_epochs 577python finetune.py --img_height 512 --img_width 512 --batch_size 1 --num_epochs 72 --mpBei einer Auflösung von 256x256 haben wir absichtlich die Anzahl der Epochen reduziert, um die Berechnung zu sparen.
Feinabstimmungsgewichte :
Hier finden Sie die fein abgestimmten Diffusionsmodellgewichte.
Der in diesem Repository verwendete Standard -Pokemon -Datensatz enthält die folgende Struktur:
pokemon_dataset/
data.csv
image_24.png
image_3.png
image_550.png
image_700.png
... data.csv sieht aus wie:
Solange Ihr benutzerdefinierter Datensatz dieser Struktur folgt, müssen Sie in der aktuellen Codebasis außer dem dataset_archive nichts ändern.
Falls Ihr Datensatz über mehrere Untertitel pro Bild verfügt, können Sie während des Trainings zufällig einen aus dem Bildunterschriften pro Bild auswählen.
Basierend auf dem Datensatz müssen Sie möglicherweise die Hyperparameter einstellen.
import keras_cv
import matplotlib . pyplot as plt
from tensorflow import keras
IMG_HEIGHT = IMG_WIDTH = 512
def plot_images ( images , title ):
plt . figure ( figsize = ( 20 , 20 ))
for i in range ( len ( images )):
ax = plt . subplot ( 1 , len ( images ), i + 1 )
plt . title ( title )
plt . imshow ( images [ i ])
plt . axis ( "off" )
# We just have to load the fine-tuned weights into the diffusion model.
weights_path = keras . utils . get_file (
origin = "https://huggingface.co/sayakpaul/kerascv_sd_pokemon_finetuned/resolve/main/ckpt_epochs_72_res_512_mp_True.h5"
)
pokemon_model = keras_cv . models . StableDiffusion (
img_height = IMG_HEIGHT , img_width = IMG_WIDTH
)
pokemon_model . diffusion_model . load_weights ( weights_path )
# Generate images.
generated_images = pokemon_model . text_to_image ( "Yoda" , batch_size = 3 )
plot_images ( generated_images , "Fine-tuned on the Pokemon dataset" ) Sie können Ihre weights_path einbringen (sollte mit dem diffusion_model kompatibel sein) und den Code -Snippet wiederverwenden.
Schauen Sie sich dieses Colab -Notizbuch an, um mit dem Inferenzcode zu spielen.
Zunächst haben wir das Modell mit einer Auflösung von 256x256 fein abgestimmt. Hier sind einige Ergebnisse zusammen mit Vergleiche mit den Ergebnissen des ursprünglichen Modells.
| Bilder | Aufforderungen |
|---|---|
| Yoda | |
| Roboterkatze mit Flügeln | |
| Hallo Kitty |
Wir können sehen, dass das fein abgestimmte Modell stabilere Ausgänge hat als das ursprüngliche Modell. Obwohl die Ergebnisse ästhetisch viel mehr verbessert werden können, sind die Feinabstimmungseffekte sichtbar. Außerdem folgten wir den gleichen Hyperparametern aus dem Drehbuch von Face für die 256x256 -Auflösung (abgesehen von der Anzahl der Epochen und der Chargengröße). Mit besseren Hyperparametern werden sich die Ergebnisse wahrscheinlich verbessern.
Für die 512x512 -Auflösung beobachten wir etwas Ähnliches. Wir haben also mit dem Parameter unconditional_guidance_scale experimentiert und bemerkten, dass die Ergebnisse bei 40 auf 40 festgelegt sind (während die anderen Argumente festgelegt wurden).
| Bilder | Aufforderungen |
|---|---|
| Yoda | |
| Roboterkatze mit Flügeln | |
| Hallo Kitty |
HINWEIS : Die Feinabstimmung auf dem 512x512 ist zum jetzigen Zeitpunkt noch im Gange. Aber es braucht viel Zeit, um eine einzelne Epoche ohne das Vorhandensein verteilter Trainings- und Gradientenakkumulation zu vervollständigen. Die obigen Ergebnisse stammen aus dem nach der 60. Epoche abgeleiteten Checkpoint.
Mit einem ähnlichen Rezept (aber für mehr Optimierungsschritte trainiert) zeigen Lambda Labs erstaunliche Ergebnisse.