当训练数据只有 1 张时,如何让 AI 模型“见多识广”?——DALDA 框架详解与实操指南
“
本文面向已经具备 Python 基础、想用扩散模型(Diffusion Model)解决“数据荒”问题的开发者。阅读时间约 15 分钟,你将收获:
DALDA 是什么、为什么有效;2. 如何 30 分钟跑通 Flowers102 1-shot 实验;3. 常见疑问的直截了当的解答。
目录
-
背景问题:数据少、模型“近视” -
DALDA 框架速览 -
原理解码:LLM 写提示词 + CLIPScore 动态调权重 -
环境搭建:一步步把代码跑起来 -
动手实验:用 Oxford Pets 做 1-shot 分类 -
结果怎么看:多样性 vs. 准确率 -
FAQ:你可能遇到的 10 个问题 -
小结与下一步
1. 背景问题:数据少、模型“近视”
在计算机视觉项目里,最常听到的抱怨是:
“
“每个类别只有几张照片,模型根本学不动。”
传统做法是做旋转、翻转、颜色扰动,但这些只能“变形”不能“变义”——不会给狗的照片加上“在草地上奔跑”的新语义。
扩散模型(Stable Diffusion 等)可以“无中生有”地合成图片,可一旦提示词太放飞,又会跑出完全不像目标类别的“外星狗”。
DALDA 的任务就是:用最少 1 张原图,合成既多样又不出界的训练图。
2. DALDA 框架速览
一句话:
DALDA = GPT-4 写提示词 + Stable Diffusion 画图 + 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。