当训练数据只有 1 张时,如何让 AI 模型“见多识广”?——DALDA 框架详解与实操指南

本文面向已经具备 Python 基础、想用扩散模型(Diffusion Model)解决“数据荒”问题的开发者。阅读时间约 15 分钟,你将收获:

  1. DALDA 是什么、为什么有效;2. 如何 30 分钟跑通 Flowers102 1-shot 实验;3. 常见疑问的直截了当的解答。

目录

  1. 背景问题:数据少、模型“近视”
  2. DALDA 框架速览
  3. 原理解码:LLM 写提示词 + CLIPScore 动态调权重
  4. 环境搭建:一步步把代码跑起来
  5. 动手实验:用 Oxford Pets 做 1-shot 分类
  6. 结果怎么看:多样性 vs. 准确率
  7. FAQ:你可能遇到的 10 个问题
  8. 小结与下一步

1. 背景问题:数据少、模型“近视”

在计算机视觉项目里,最常听到的抱怨是:

“每个类别只有几张照片,模型根本学不动。”

传统做法是做旋转、翻转、颜色扰动,但这些只能“变形”不能“变义”——不会给狗的照片加上“在草地上奔跑”的新语义。
扩散模型(Stable Diffusion 等)可以“无中生有”地合成图片,可一旦提示词太放飞,又会跑出完全不像目标类别的“外星狗”。
DALDA 的任务就是:用最少 1 张原图,合成既多样又不出界的训练图。


2. DALDA 框架速览

一句话:
DALDA = GPT-4 写提示词 + Stable Diffusion 画图 + CLIPScore 实时改权重。

DALDA 三步流程图:计算 CLIPScore → 自适应权重 → 合成新图
步骤 做什么 目的
① 计算 CLIPScore 用 CLIP 给每张原图打分,衡量“图-类别名”匹配度 判断这张原图靠不靠谱
② 自适应权重 AGS 分数高 → 允许文本提示词发挥更大作用,增加多样性;分数低 → 让原图占主导,防止跑偏 平衡“多样 vs. 不出界”
③ 合成新图 把文本提示词 + 原图一起喂给带 IP-Adapter 的 Stable Diffusion,生成 10 张扩充图 直接得到训练集

3. 原理解码:LLM 写提示词 + CLIPScore 动态调权重

3.1 CLIPScore 是什么?

把图片和类别名各自编码成向量,算余弦相似度。

  • 0.9 以上:图和词高度匹配(比如“金毛”照片 vs. “golden retriever”)。
  • 0.3 以下:图可能是侧拍、模糊或类别难辨认。

3.2 AGS(Adaptive Guidance Scaling)怎么做?

在 IP-Adapter 的交叉注意力层里,文本和图像分别贡献一部分。设图像权重为 λ:

  • 高 CLIPScore → λ 取 0.1~0.4,文本提示词“戏份”更大,狗可以“戴墨镜、在雪地”。
  • 低 CLIPScore → λ 取 0.7~0.9,图像提示词“戏份”更大,防止把“哈士奇”画成“狼”。

λ 用截断正态分布采样,均值由 1 - CLIPScore 决定,代码里一行搞定:

lambda_ = truncnorm.rvs(low, high, loc=mu, scale=sigma)

3.3 LLM 提示词长什么样?

把数据集描述 + 类别名喂给 GPT-4,让它写 1 句带环境、动作、视角的英文描述。
示例(Oxford Pets):

"A fluffy Pomeranian dog trots merrily along a path bordered by radiant tulips, its tail lifted in tune with the whimsical spring air."

每张原图配 10 句,10 倍扩充。


4. 环境搭建:一步步把代码跑起来

4.1 准备机器

  • Ubuntu 20.04+ / macOS 12+ / Windows WSL2
  • Python 3.10
  • 至少 8 GB 显存的 NVIDIA GPU(实测 3090 单卡 15 分钟跑完 1-shot Oxford Pets)

4.2 安装

# 1. 创建虚拟环境
conda create -n dalda python=3.10 -y
conda activate dalda

# 2. 拉代码 & 装依赖
git clone https://github.com/xxx/dalda.git
cd dalda
pip install -r requirements.txt

# 3. 下载 IP-Adapter 权重
git lfs install
git clone https://huggingface.co/h94/IP-Adapter
mv IP-Adapter/models ./models

4.3 获取数据(以 Oxford Pets 为例)

wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
wget https://thor.robots.ox.ac.uk/~vgg/data/pets/annotations.tar.gz
tar -xvf images.tar.gz && tar -xvf annotations.tar.gz
mkdir -p datasets/oxford_pet
mv images datasets/oxford_pet/
mv annotations datasets/oxford_pet/

目录结构需保持:

datasets
└── oxford_pet
    ├── images
    └── annotations

5. 动手实验:用 Oxford Pets 做 1-shot 分类

5.1 生成 LLM 提示词

在根目录新建 .env

AZURE_ENDPOINT=https://xxx.openai.azure.com
AZURE_API_KEY=your_key
AZURE_API_VERSION=2023-07-01-preview

然后:

python generate_prompt_by_LLM.py

脚本会自动把 37 个宠物类别喂给 GPT-4,产出 prompts/oxford_pet_llm.json,每条 10 句。

5.2 训练分类器

python train_classifier.py \
  --config cfg_dalda_pets_llm_prompt_adaptive_scaling_clip

配置文件中关键参数:

  • examples_per_class: 1 # 1-shot
  • synthetic_probability: 0.5 # 训练时 50% 批次来自合成图
  • resume: [0, 1, 90, 5] # 如果中断了,自动续跑

5.3 观察输出

  • 合成图保存在 outputs/oxford_pet/synthetic/
  • 日志实时打印 CLIP-I(越低越多样)和 LPIPS(越高越多样)
  • 训练完自动测试,终端会打印 ResNet50 与 CLIP 的 1-shot 准确率

6. 结果怎么看:多样性 vs. 准确率

数据集 类别 CLIPScore 均值 方法 CLIP-I ↓ LPIPS ↑ ResNet50 Top-1 ↑
Oxford Pets 0.78(高) DALDA 0.882 0.709 80.7%
Caltech-101 0.84(高) DALDA 0.879 0.705 78.8%
Flowers102 0.55(低) DALDA 0.921 0.746 52.1%

解读:

  • 高 CLIPScore 数据集:合成图大胆发挥,多样性高,准确率也领先。
  • 低 CLIPScore 数据集:AGS 主动压低多样性,防止跑偏,准确率与基线持平或略升。

7. FAQ:你可能遇到的 10 个问题

问题 直接回答
1. 没有 GPT-4 怎么办? 先用作者提供的示例 prompt 文件,或手动写 10 句模板,也能跑通。
2. 显存不够? resolution 降到 256×256,batch_size 调到 8,仍可得到合理结果。
3. 能用于检测/分割吗? 目前代码只提供分类示例,理论上把 IP-Adapter 换成 ControlNet 即可,需自行扩展。
4. 合成图会不会侵权? 全部由扩散模型生成,不复制原图像素,商业使用前请再确认当地法规。
5. Windows 跑不动? 用 WSL2 + CUDA 驱动 ≥ 525,亲测可行。
6. 如何换自己的数据集? datasets/ 下新建文件夹,保持 class_name/*.jpg 结构,修改配置里的类别名单即可。
7. 训练时间多长? 1-shot Oxford Pets,3090 单卡约 15 分钟(含 370 张合成图)。
8. 能否继续加传统数据增强? 可以,代码已预留 Albumentations 接口,在配置文件里打开即可。
9. 合成图失真? 调低 guidance_scale(默认 7.5,可试 5.0),或增加 examples_per_class 到 4-shot。
10. 结果波动大? 作者已给三次随机种子平均,你的实验可多跑两次取中位数。

8. 小结与下一步

DALDA 用极低的门槛回答了“只有 1 张图怎么训练”的问题:

  • 让 GPT-4 替你写“会呼吸的”提示词;
  • 让 CLIPScore 当“守门员”,防止跑题;
  • 让 Stable Diffusion 做“画师”,不额外微调。

下一步你可以:

  • 把框架迁移到缺陷检测、医学影像等低数据场景;
  • 用更大模型(SDXL、DALL·E 3)做高分辨率合成;
  • 在 IP-Adapter 上加 LoRA,适配更细粒度的风格控制。

代码、论文和预训练权重已全部开源,祝你玩得开心,问题直接提 Issue。