DreamBooth:用少量图微调模型生成特定主体
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 cat,sks是自定义罕见词。class_prompt:类别通用提示,比如a photo of a cat。with_prior_preservation:启用先验保留损失。learning_rate:5e-6较保守安全,可在1e-6到1e-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. 罕见词的选择
避免使用常见单词(如 dog 或 person),sks、zwx 等无意义 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 张照片创造属于你的专属模型吧。