ControlNet数据集格式:JSON标注文件规范与示例
概述
ControlNet作为强大的扩散模型控制工具,其训练效果高度依赖数据集质量。本文详细介绍ControlNet训练所需JSON标注文件的规范要求、字段含义及实际应用示例,帮助开发者快速构建符合标准的训练数据集。
数据集结构
ControlNet训练数据集采用"图片文件+JSON标注"的经典结构,典型组织方式如下:
training/
└── fill50k/
├── source/ # 条件控制图(如边缘图、深度图)
├── target/ # 目标生成图
└── prompt.json # 标注文件(核心)
上述结构在tutorial_dataset.py中得到实现,通过MyDataset类完成数据加载流程。
JSON标注文件规范
基础格式要求
JSON标注文件采用行分隔JSON(JSON Lines)格式,即每行一个独立JSON对象,而非数组形式。这种格式在处理大型数据集时具有内存效率优势,可逐行读取而无需加载整个文件。
核心字段定义
| 字段名 | 类型 | 描述 | 必要性 |
|---|---|---|---|
source | 字符串 | 条件控制图路径,相对于标注文件的位置 | 必需 |
target | 字符串 | 目标生成图路径,相对于标注文件的位置 | 必需 |
prompt | 字符串 | 文本提示词,描述目标图像内容 | 必需 |
字段约束条件
- 路径格式:使用Unix风格正斜杠
/,不支持Windows反斜杠\ - 文件名:建议使用数字ID命名(如
0001.png),避免特殊字符 - 提示词:长度控制在5-100字符,包含核心视觉特征描述
示例解析
标注文件示例
以下是符合规范的JSON标注行示例(源自tutorial_dataset.py的加载逻辑):
{"source": "source/0001.png", "target": "target/0001.png", "prompt": "a red car parked on street, photorealistic"}
{"source": "source/0002.png", "target": "target/0002.png", "prompt": "a cat sitting on sofa, digital art style"}
数据加载实现
tutorial_dataset.py中的MyDataset类完整实现了数据加载流程:
class MyDataset(Dataset):
def __init__(self):
self.data = []
# 读取JSON Lines格式标注文件
with open('./training/fill50k/prompt.json', 'rt') as f:
for line in f:
self.data.append(json.loads(line))
def __getitem__(self, idx):
item = self.data[idx]
# 加载条件图和目标图
source = cv2.imread('./training/fill50k/' + item['source'])
target = cv2.imread('./training/fill50k/' + item['target'])
# 图像预处理与格式转换
source = cv2.cvtColor(source, cv2.COLOR_BGR2RGB)
target = cv2.cvtColor(target, cv2.COLOR_BGR2RGB)
return dict(jpg=target, txt=item['prompt'], hint=source)
数据验证示例
tutorial_dataset_test.py提供了简单的数据验证方法:
dataset = MyDataset()
print(len(dataset)) # 输出数据集大小
item = dataset[1234] # 获取第1234个样本
print(item['txt']) # 打印提示词
print(item['jpg'].shape) # 验证图像维度
条件控制图类型
ControlNet支持多种条件控制图,每种类型对应不同的标注处理方式:
边缘检测图
使用HED或Canny边缘检测器生成,对应annotator/hed/模块实现的边缘提取算法。示例图:
深度图
通过MiDaS模型生成,对应annotator/midas/目录下的深度估计算法。示例图:
姿态图
使用OpenPose模型生成人体关键点,相关实现位于annotator/openpose/。示例图:
常见问题解决
路径错误
确保JSON中的source和target路径与实际文件位置匹配,可参考tutorial_dataset_test.py的调试方法,打印路径并验证文件存在性。
图像尺寸不一致
所有训练图像应统一尺寸,建议使用256×256、512×512等标准分辨率。可在数据加载时添加尺寸检查:
assert source.shape == (512, 512, 3), f"图像尺寸错误: {source.shape}"
中文乱码
JSON文件需使用UTF-8编码保存,提示词中的中文需直接写入,无需转义。
相关资源
- 官方数据集教程:
tutorial_dataset.py - 数据集测试工具:
tutorial_dataset_test.py - 条件控制模块:
annotator/ - 模型配置文件:
models/cldm_v15.yaml
总结
遵循本文介绍的JSON标注规范,配合提供的代码示例,即可构建高质量的ControlNet训练数据集。建议先使用少量样本(如100个)进行测试,通过tutorial_dataset_test.py验证数据加载正确性后,再扩展至完整数据集规模。合理的数据集构建是ControlNet模型训练成功的关键基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






