DreamBooth:用少量图微调模型生成特定主体

FreeGuideOnline 最新 2026-06-20

DreamBooth 自定义图像生成实战教程:用少量图片微调专属模型

什么是 DreamBooth?

DreamBooth 是一种基于扩散模型(如 Stable Diffusion)的微调技术,只需提供 3~5 张同一主体的照片,就能让模型学会生成该主体在不同场景、姿势、风格下的新图像,并尽可能保持主体特征一致性。它的核心思想是:将特定主体“植入”模型的输出空间,变成模型认识的一个新单词。

与传统的文生图模型相比,DreamBooth 解决了“无法精确控制人物或物品外观”的痛点,广泛应用于个人写真生成、虚拟角色定制、产品视觉设计等场景。

DreamBooth 的核心原理

1. 扩散模型召回

扩散模型通过逐步向图像添加噪声并学习去噪,来生成新图片。在推理时,给定一段文本提示,模型从随机噪声中逐步还原出对应图像。

2. 微调时的“灾难性遗忘”与先验保留损失

直接用小数据集微调整个模型,很容易造成过拟合灾难性遗忘——模型只记得几张训练图,丧失了原有的多样化生成能力。
DreamBooth 通过引入 先验保留损失(Prior Preservation Loss) 来缓解这一问题:在微调过程中,除了用主体图片训练,还会生成或采样一些同类别但无关的背景图像(称为“类别先验”),让模型同时保持对该类别的通用认知。例如,微调一只特定狗时,类别先验是随机生成的“一只狗”图片,损失函数会惩罚模型改变对普通狗的理解。

3. 罕见词标记策略

为了避免微调时覆盖模型原本的词汇表示,DreamBooth 通常使用一个罕见词或新造词(如 sks)作为主体标识符,并配合类别描述符。提示格式类似:a [identifier] [class noun],例如 a sks dog。模型会将 sks dog 学会映射到特定狗的图像上。

动手前准备:环境与数据

硬件要求

  • GPU 显存:推荐 12GB 以上(可用 RTX 3060 12GB 或更好)。通过梯度检查点、8-bit Adam 等优化,部分实现可在 6GB 显存下运行。
  • 存储:至少 20GB 空闲空间,用于存放基础模型和训练输出。

软件依赖

常用开源实现:Hugging Face Diffusers 库或 Automatic1111 webui 的 DreamBooth 扩展。这里以 Diffusers 脚本为例。

# 创建虚拟环境(Python 3.10)
conda create -n dreambooth python=3.10 -y
conda activate dreambooth
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
pip install accelerate==0.21.0 transformers diffusers==0.22.1 peft xformers
pip install bitsandbytes datasets pillow

准备训练图片(最重要的一步)

图片质量直接决定最终效果,请严格遵循:

  • 数量:3~5 张,不要超过 10 张(太多容易过拟合)。
  • 内容:主体清晰,背景尽量干净且多样化(室内、室外、不同光线),展示主体的不同角度。
  • 尺寸:裁剪为正方形,推荐 512×512 或 768×768 像素。
  • 文件命名:无限制,统一放入一个文件夹,如 ./my_subject/

示例:你想定制自己的宠物猫“Luna”,准备 5 张包含全身、脸部特写、侧面、玩耍姿态的照片。

实战:用 Diffusers 脚本训练 DreamBooth

步骤 1:下载基础模型

使用 Stable Diffusion 1.5 或类似模型作为起点。

export MODEL_NAME="runwayml/stable-diffusion-v1-5"

步骤 2:生成类别先验图片(可选但强烈推荐)

类别先验帮助保留通用类别的知识。我们为“猫”生成 200 张随机图片。

export CLASS_DIR="class_images/cat"
mkdir -p $CLASS_DIR
python generate_class_images.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --class_prompt="a photo of a cat" \
  --num_class_images=200 \
  --output_dir=$CLASS_DIR

(如果没有预先生成,训练脚本也可根据 class_prompt 在线生成)

步骤 3:启动训练

以下命令演示微调,关键参数解析附后。

accelerate launch train_dreambooth.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --instance_data_dir="./my_subject" \
  --class_data_dir=$CLASS_DIR \
  --output_dir="./dreambooth_luna" \
  --instance_prompt="a photo of sks cat" \
  --class_prompt="a photo of a cat" \
  --with_prior_preservation \
  --prior_loss_weight=1.0 \
  --resolution=512 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=1 \
  --learning_rate=5e-6 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --num_class_images=200 \
  --max_train_steps=800 \
  --mixed_precision="fp16" \
  --gradient_checkpointing \
  --enable_xformers_memory_efficient_attention

参数详解

  • instance_data_dir:你的主体图片文件夹。
  • instance_prompt关键,使用类似 a photo of sks catsks 是自定义罕见词。
  • class_prompt:类别通用提示,比如 a photo of a cat
  • with_prior_preservation:启用先验保留损失。
  • learning_rate5e-6 较保守安全,可在 1e-61e-5 间调整。
  • max_train_steps:通常图片张数 × 100 左右;5 张图训练 500~800 步。
  • mixed_precision="fp16"xformers:节省显存加速。

训练时间:单张 12GB 显卡约 15~25 分钟。

步骤 4:测试生成

训练完成后,使用新模型生成图片。

from diffusers import StableDiffusionPipeline
import torch

pipe = StableDiffusionPipeline.from_pretrained("./dreambooth_luna", torch_dtype=torch.float16)
pipe = pipe.to("cuda")

prompt = "a sks cat wearing a wizard hat, fantasy art, trending on artstation"
image = pipe(prompt, num_inference_steps=50, guidance_scale=7.5).images[0]
image.save("luna_wizard.png")

你会发现生成的猫保留了 Luna 的脸部特征。

高质量结果的调优技巧

1. 提示词工程

  • 生成主体时必须包含训练时的标识词 sks,并加上类别名词,如 a sks cat reading a book
  • 如果不加标识词,模型将生成任意猫;如果只写 sks,容易产生畸变。
  • 搭配艺术风格、光线等描述符提高画质。

2. 训练步数与过拟合控制

  • 训练步数过多会导致过拟合:主体背景或姿态严重重复训练图。表现:生成 sks cat 时几乎只出训练图的样子。
  • 步数过少则学习不足,相貌不像。
  • 建议:每 200 步保存一个检查点,然后生成测试对比,找到最佳点。通常 5 张图 600~800 步,3 张图 400~500 步。

3. 先验保留强度的调整

prior_loss_weight 默认 1.0。增大它(如 1.5)可以增强对类别多样性的保留,但可能降低主体辨识度;减小会加强主体学习,但易背景固化。如发现生成背景单一,可适当提高。

4. 罕见词的选择

避免使用常见单词(如 dogperson),skszwx 等无意义 token 效果稳定。有些实现支持直接使用 <TOK> 自定义占位符。

5. 图像预处理

  • 裁剪时保证主体在画面中占比大,背景占比较小的图像容易被模型忽略。
  • 如果需要生成全身像,包含全身照;需要面部特写,包含一张特写。

6. 使用 LoRA 作为轻量化替代

全量 DreamBooth 修改整个 UNet 权重,文件较大(约 2GB)。现在流行结合 LoRA(Low-Rank Adaptation),仅训练少量参数,最终文件只有几 MB,效果近似且更灵活。Diffusers 也提供 train_dreambooth_lora.py 脚本,参数类似,只需额外设置 --rank=4 等。推荐尝试。

常见问题排查

问题现象 可能原因 解决办法
生成的图像与主体完全不像 训练步数不够,或学习率过低 增加步数至 1000,或提高学习率到 1e-5
图像出现伪影、怪异变形 混合精度问题或生成分辨率不适配 固定生成 512×512,检查 torch_dtype
总是生成相同姿态/背景 过拟合,或训练图像背景太单一 降低训练步数,增加多样背景图片,提高先验损失权重
无法控制动作/场景 prompt 编写不当,未使用 sks category 格式 确保提示以 a sks [class] doing action 开头
显存不足 未开启优化选项 添加 --gradient_checkpointing--enable_xformers,减小分辨率

进阶应用:风格化与多主体组合

DreamBooth 不仅保留长相,还能融合风格。例如:

  • 将你自己微调后,生成“sks person in the style of Studio Ghibli”可得吉卜力风格画像。
  • 与 LoRA 模型堆叠:在推理时加载多个 LoRA(比如主体 LoRA + 场景风格 LoRA),实现精准控制。

伦理与版权提示

  • 请勿将 DreamBooth 用于生成未经授权的名人肖像或虚假信息。
  • 训练用图片应拥有版权或合法使用权。
  • 生成内容遵守平台规定与法律法规。

总结

DreamBooth 是通向个性化生成的重要技术,只需极少样本即可将你的宠物、产品、甚至你自己“教会”AI。理解先验保留原理并细心调节参数,是做出高质量定制的关键。现在就开始动手,用 5 张照片创造属于你的专属模型吧。