Sofortantwort
DreamBooth einfach erklärt
Fine-Tuning von Bildmodellen auf spezifische Personen oder Objekte mit wenigen Bildern.
- Kurz gesagt
- Lernt neue Konzepte aus wenigen geeigneten Bildern
- Typischer Einsatz
- Personalisierte Avatare, Produkt-Visualisierung, Haustier-Portraits
- Wichtig zu wissen
- Ermöglicht personalisierte Bildgenerierung in vielen Kontexten
DreamBooth im Überblick
DreamBooth ist eine Technik, um Bildgenerierungs-Modellen neue Konzepte beizubringen – oft mit wenigen geeigneten Beispielbildern. Du kannst etwa eine Person, ein Haustier oder ein Produkt einlernen und dann in verschiedenen Szenen generieren.
Der Prozess:
Input: Beispielbilder des Konzepts
↓
DreamBooth- oder Adaptertraining
↓
Output: Modell kennt ein Trigger-Konzept
Prompt: "trigger person as astronaut on mars"
→ Bild des gelernten Konzepts in neuer Szene
Warum ein seltenes Token?
- Ein seltenes oder eindeutiges Token reduziert Verwechslungen
- Es wird zum Trigger-Wort für dein Konzept
- Token sollten konsistent und nicht bereits stark belegt sein
Beispiel-Prompts nach Training:
"trigger person in a suit, professional photo"
"trigger person as illustrated character"
"trigger person in classical painting style"
"trigger person in outdoor scene"
Technisch betrachtet
Training mit Diffusers
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
from diffusers.training_utils import EMAModel
import torch
# Basis-Modell laden
model_id = "base-diffusion-model"
pipe = DiffusionPipeline.from_pretrained(model_id, torch_dtype=model_dtype)
# Training-Konfiguration
training_args = {
"instance_prompt": "a photo of trigger person",
"class_prompt": "a photo of a person", # Prior Preservation
"instance_data_dir": "./instance_images",
"class_data_dir": "./class_images",
"num_class_images": class_image_count,
"learning_rate": learning_rate,
"max_train_steps": max_train_steps,
"train_batch_size": train_batch_size,
}
Prior Preservation Loss
Problem: Modell "vergisst" allgemeines Wissen über "person"
→ Alle Personen sehen aus wie du
Lösung: Prior Preservation
→ Trainiere auch auf generische "person"-Bilder
→ Modell behält allgemeines Wissen
# Loss-Funktion
loss = mse_loss(noise_pred, noise) # Instance Loss
if use_prior_preservation:
prior_loss = mse_loss(prior_noise_pred, prior_noise)
loss = loss + prior_preservation_weight * prior_loss
DreamBooth vs. LoRA vs. Textual Inversion
| Methode | Trainiert | Größe | Qualität | Speed |
|---|---|---|---|---|
| DreamBooth | großes Modell oder viele Gewichte | groß | hoch, setupabhängig | eher langsam |
| DreamBooth-LoRA | LoRA-Adapter | kompakter | hoch, setupabhängig | mittel bis schnell |
| Textual Inversion | Embedding | sehr klein | begrenzter | schnell |
Kohya SS Training
# Beispiel für DreamBooth-/LoRA-Training
accelerate launch train_network.py \
--pretrained_model_name_or_path="base-diffusion-model" \
--train_data_dir="./training_images" \
--output_dir="./output" \
--resolution=$RESOLUTION \
--train_batch_size=$BATCH_SIZE \
--learning_rate=$LEARNING_RATE \
--max_train_steps=$MAX_TRAIN_STEPS \
--network_module=networks.lora \
--network_dim=$NETWORK_DIM
Best Practices für Training-Bilder
| Aspekt | Empfehlung |
|---|---|
| Anzahl | genug Bilder für gewünschte Variation |
| Qualität | scharf, gut belichtet, relevant |
| Vielfalt | verschiedene Winkel, Beleuchtung und Kontexte |
| Hintergrund | variiert, wenn Generalisierung gewünscht ist |
| Auflösung | passend zur Modell- und Trainingskonfiguration |
| Konsistenz | gleiches Subjekt, keine Verwechslung |
Inference nach Training
from diffusers import DiffusionPipeline
# Trainiertes Modell laden
pipe = DiffusionPipeline.from_pretrained(
"./dreambooth_output",
torch_dtype=model_dtype
).to(device)
# Generieren mit Trigger-Wort
image = pipe(
"trigger person as a superhero, comic book style",
num_inference_steps=inference_steps,
guidance_scale=guidance_scale,
).images[0]