当训练数据只有 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 实时改权重。

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 数据集:合成图大胆发挥,多样性高,准确率也领先。 -
低 CLIPScore 数据集:AGS 主动压低多样性,防止跑偏,准确率与基线持平或略升。
7. FAQ:你可能遇到的 10 个问题
8. 小结与下一步
DALDA 用极低的门槛回答了“只有 1 张图怎么训练”的问题:
-
让 GPT-4 替你写“会呼吸的”提示词; -
让 CLIPScore 当“守门员”,防止跑题; -
让 Stable Diffusion 做“画师”,不额外微调。
下一步你可以:
-
把框架迁移到缺陷检测、医学影像等低数据场景; -
用更大模型(SDXL、DALL·E 3)做高分辨率合成; -
在 IP-Adapter 上加 LoRA,适配更细粒度的风格控制。
代码、论文和预训练权重已全部开源,祝你玩得开心,问题直接提 Issue。