数据集规范
众所周知,数据准备是AI任务开发流程中的重要一步,但是不同AI任务对数据准备的要求不尽相同,而且单个AI任务具有多种数据集,经常给大家带来困惑。
因此,飞桨低代码开发工具PaddleX针对常见AI任务,给出通用简明的数据集规范说明,涵盖数据集名称、组织结构、标注格式。
请大家在下面找到特定AI任务,参考说明准备数据,进而可以通过PaddleX的数据校验,最后完成全流程任务开发。
请注意:
- 目前PaddleX暂不针对测试集做规范要求,也不会对测试集进行模型评估。
- 如果已有数据集不符合PaddleX的规范说明,请大家进行相应转换。
图像分类任务
PaddleX针对图像分类任务定义的数据集,名称是ClsDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── images # 图像的保存目录,目录名称可以改变,但要注意与train.txt、val.txt的内容对应
├── label.txt # 标注id和类别名称的对应关系,文件名称不可改变。每行给出类别id和类别名称,内容举例:45 wallflower
├── train.txt # 训练集标注文件,文件名称不可改变。每行给出图像路径和图像类别id,使用空格分隔,内容举例:images/image_06765.jpg 0
└── val.txt # 验证集标注文件,文件名称不可改变。每行给出图像路径和图像类别id,使用空格分隔,内容举例:images/image_06767.jpg 10
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 图像分类任务数据集说明。
如果您已有数据集且数据集格式为如下格式,但是没有标注文件,可以使用脚本将已有的数据集生成标注文件。
dataset_dir # 数据集根目录,目录名称可以改变
├── images # 图像的保存目录,目录名称可以改变
├── train # 训练集目录,目录名称可以改变
├── class0 # 类名字,最好是有意义的名字,否则生成的类别映射文件label.txt无意义
├── xxx.jpg # 图片,此处支持层级嵌套
├── xxx.jpg # 图片,此处支持层级嵌套
...
├── class1 # 类名字,最好是有意义的名字,否则生成的类别映射文件label.txt无意义
...
├── val # 验证集目录,目录名称可以改变
wget https://paddleclas.bj.bcebos.com/tools/create_cls_trainval_lists.py
# 生成训练标注文件train.txt和类别映射文件label.txt,存储于`path/to/train_dataset`同级目录中
python create_cls_trainval_lists.py --dataset_path path/to/train_dataset --save_img_list_path train.txt
# 生成验证标注文件val.txt和类别映射文件label.txt,存储于`path/to/val_dataset`同级目录中
python create_cls_trainval_lists.py --dataset_path path/to/val_dataset --save_img_list_path val.txt
如果您使用的是老版本PaddleX的图像分类数据集,在经过训练集/验证集/测试集切分后,手动将train_list.txt、val_list.txt、test_list.txt修改为train.txt、val.txt、test.txt,并且按照规则修改label.txt即可。
# 原版label.txt
classname1
classname2
classname3
...
# 修改后的label.txt
0 classname1
1 classname2
2 classname3
...
目标检测任务
PaddleX针对目标检测任务定义的数据集,名称是COCODetDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── annotations # 标注文件的保存目录,目录名称不可改变
│ ├── instance_train.json # 训练集标注文件,文件名称不可改变,采用COCO标注格式
│ └── instance_val.json # 验证集标注文件,文件名称不可改变,采用COCO标注格式
└── images # 图像的保存目录,目录名称不可改变
标注文件采用COCO格式。请大家参考上述规范准备数据,此外可以参考:示例数据集 和 目标检测数据准备。
对于使用LabelMe标注的数据集,或是VOC格式的数据集,可以使用x2coco脚本将数据集转换成COCO格式,x2coco脚本使用方法如下:
# LabelMe标注格式转COCO,这里同步进行了训练集/验证集/测试集的划分
python x2coco.py --dataset_type labelme --json_input_dir ./labelme_annos/ --image_input_dir ./labelme_imgs/ --output_dir ./cocome/ --train_proportion 0.8 --val_proportion 0.2 --test_proportion 0.0
# VOC标注格式转COCO
# 不支持自动划分训练集/验证集,需要提前准备好train.txt以及val.txt
python x2coco.py --dataset_type voc --voc_anno_dir path/to/VOC_annotations/ --voc_anno_list path/to/train.txt --voc_out_name instance_train.json
python x2coco.py --dataset_type voc --voc_anno_dir path/to/VOC_annotations/ --voc_anno_list path/to/val.txt --voc_out_name instance_val.json
当大家使用老版PaddleX的目标检测数据集时,请参考上述VOC格式数据集的转换方式。
主体检测任务
PaddleX针对主体检测任务定义的数据集,和目标检测相同,名称是COCODetDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── annotations # 标注文件的保存目录,目录名称不可改变
│ ├── instance_train.json # 训练集标注文件,文件名称不可改变,采用coco标注格式
│ └── instance_val.json # 验证集标注文件,文件名称不可改变,采用coco标注格式
└── images # 图像文件的保存目录,目录名称不可改变
需要注意的是,对于主体检测任务,全部检测框对应的类别都是前景 ,因此数据集中只包含1个前景类别。
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 目标检测数据准备。
图像分割任务
PaddleX针对图像分割任务定义的数据集,名称是SegDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── annotations # 存放标注图像的目录,目录名称可以改变,注意与标识文件的内容相对应
├── images # 存放原始图像的目录,目录名称可以改变,注意与标识文件的内容相对应
├── train.txt # 训练集标注文件,文件名称不可改变。每行是原始图像路径和标注图像路径,使用空格分隔,内容举例:images/P0005.jpg annotations/P0005.png
└── val.txt # 验证集标注文件,文件名称不可改变。每行是原始图像路径和标注图像路径,使用空格分隔,内容举例:images/N0139.jpg annotations/N0139.png
标注图像是单通道灰度图或者单通道伪彩色图,建议使用PNG格式保存。标注图像中每种像素值代表一个类别,类别必须从0开始依次递增,例如0、1、2、3表示4种类别。标注图像的像素存储是8bit,所以标注类别最多支持256类。
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 图像语义分割数据准备。
使用LabelMe软件,大家可以参考文档标注图像;标注完成后,可以使用脚本将标注json文件转换成标注图像(如下代码示例);转换完成后,可以参考文档进行切分。
# 下载转换脚本,安装必要依赖。
wget https://paddleseg.bj.bcebos.com/tools/labelme2seg.py
# 执行转换。第一个input_dir参数是原始图像和json标注文件的保存目录,第二个output_dir参数是转换后数据集的保存目录。
python labelme2seg.py input_dir output_dir
如果大家使用老版PaddleX的图像分割数据集,当没有进行训练集/验证集/测试集的划分时,参考文档进行切分即可;当已经使用老版PaddleX切分好训练集/验证集/测试集时,手动将train_list.txt、val_list.txt、test_list.txt修改为train.txt、val.txt、test.txt即可。
特征检索任务
PaddleX针对特征检索任务定义的数据集,名称是ShiTuDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── images # 图像的保存目录,目录名称可以改变,但要注意与train.txt, val.txt的内容对应
├── train.txt # 训练集标注文件,文件名称不可改变。内容举例:images/111085122871_0.JPG 1 1
└── val.txt # 验证集标注文件,文件名称不可改变。内容举例:images/251952414262_0.JPG 575 4169
训练集标注文件和验证集标注文件 ,每行数据使用“空格”分隔,三列数据的含义分别是图像路径、 图像类别id、图像id。
与分类任务数据集不同,图像检索任务的数据集分为以下三部分:
- 训练集合(train dataset):用来训练模型,使模型能够学习该集合的图像特征。
- 底库数据集合(gallery dataset):用来提供图像检索任务中的底库数据,该集合可与训练集或测试集相同,也可以不同,当与训练集相同时,测试集的类别体系应与训练集的类别体系相同。
- 测试数据集合(query dataset):用来测试模型的好坏,通常要对测试集的每一张测试图片进行特征提取,之后和底库数据的特征进行距离匹配,得到识别结果,后根据识别结果计算整个测试集的指标。
注意:在样例数据集中,验证数据集(val.txt)中既是 gallery dataset,也是 query dataset,因此当 gallery dataset 和 query dataset 相同时,为了去掉检索得到的第一个数据(检索图片本身无须评估),每个数据需要对应一个 unique id(每张图片的 id 不同即可,可以用行号来表示 unique id),用于后续评测 mAP、recall@1 等指标。
请大家参考上述规范准备数据,此外可以参考:示例数据集
文本检测任务
PaddleX针对文本检测任务定义的数据集,名称是TextDetDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── images # 存放图像的目录,目录名称可以改变,但要注意和train.txt val.txt的内容对应
├── train.txt # 训练集标注文件,文件名称不可改变,内容举例:images/img_0.jpg \t [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]
└── val.txt # 验证集标注文件,文件名称不可改变,内容举例:images/img_61.jpg \t [{"transcription": "TEXT", "points": [[31, 10], [310, 140], [420, 220], [310, 170]]}, {...}]
标注文件的每行内容是一张图像的路径和一个组成元素是字典的列表,路径和列表必须使用制表符’\t‘进行分隔,不可使用空格进行分隔。
对于组成元素是字典的列表,字典中 points 表示文本框的四个顶点的坐标(x, y),从左上角的顶点开始顺时针排;字典中transcription
表示该文本框的文字,若transcription 的
内容为“###”时,表示该文本框无效,不参与训练。
如果您使用了PPOCRLabel标注数据,只需要在完成数据集划分后将文字检测(det)目录中的det_gt_train.txt
改名为train.txt
、det_gt_test.txt
改名为val.txt
即可。
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 文本检测数据准备。
文本识别任务
PaddleX针对文字识别任务定义的数据集,名称是MSTextRecDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── images # 存放图像的目录,目录名称可以改变,但要注意和train.txt val.txt的内容对应
├── train.txt # 训练集标注文件,文件名称不可改变,内容举例:images/111085122871_0.JPG \t 百度
├── val.txt # 验证集标注文件,文件名称不可改变,内容举例:images/111085122871_0.JPG \t 百度
└── dict.txt # 字典文件,文件名称不可改变。字典文件将所有出现的字符映射为字典的索引,每行为一个单字,内容举例:百
标注文件的每行内容是图像路径和文本内容,两者必须使用制表符’\t‘进行分隔,不可使用空格进行分隔。
如果您使用了PPOCRLabel标注数据,只需要在完成数据集划分后将文字识别(rec)目录中的rec_gt_train.txt
改名为train.txt
、rec_gt_test.txt
改名为val.txt
即可。
字典文件dict.txt的每行是一个单字,如"a"、"度"、"3"等,如下所示:
a
度
3
推荐使用 PP-OCR 默认字典(右击链接下载即可) 并重命名为 dict.txt
,也可使用脚本 gen_dict.py 根据训练/评估数据自动生成字典:
# 将脚本下载至 {dataset_dir} 目录下
wget https://paddleocr.bj.bcebos.com/script/gen_dict.py
# 执行转化,默认训练集标注文件为"train.txt", 验证集标注文件为"val.txt", 生成的字典文件为"dict.txt"
python gen_dict.py
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 文本识别数据准备。
版面分析任务
PaddleX针对版面分析任务定义的数据集,和目标检测相同,名称是COCODetDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── annotations # 标注文件的保存目录,目录名称不可改变
│ ├── instance_train.json # 训练集标注文件,文件名称不可改变,采用coco标注格式
│ └── instance_val.json # 验证集标注文件,文件名称不可改变,采用coco标注格式
└── images # 图像的保存目录,目录名称不可改变
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 版面分析数据准备。
表格识别任务
PaddleX针对表格识别任务定义的数据集,名称是PubTabTableRecDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── images # 图像的保存目录,目录名称可以改变,但要注意和train.txt val.txt的内容对应
├── train.txt # 训练集标注文件,文件名称不可改变
└── val.txt # 验证集标注文件,文件名称不可改变
标注文件采用PubTabNet数据集格式进行标注,每行内容都是一个字典。
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 表格识别数据准备。
关键信息抽取任务
PaddleX针对关键信息抽取任务定义的数据集,名称是KieDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── images # 图像的保存目录,目录名称可以改变,但要注意和train.txt val.txt的内容对应
├── train.txt # 训练集标注文件,文件名称不可改变,内容举例:images/111085122871_0.JPG \t [{"transcription": "汇丰晋信", "label": "other", "points": [[104, 114], [530, 114], [530, 175], [104, 175]], "id": 1, "linking": []}, {"transcription": "受理时间:", "label": "question", "points": [[126, 267], [266, 267], [266, 305], [126, 305]], "id": 7, "linking": [[7, 13]]}, {"transcription": "2020.6.15", "label": "answer", "points": [[321, 239], [537, 239], [537, 285], [321, 285]], "id": 13, "linking": [[7, 13]]}]
├── val.txt # 验证集标注文件,文件名称不可改变,内容举例:images/111085122871_0.JPG \t [{"transcription": "汇丰晋信", "label": "other", "points": [[104, 114], [530, 114], [530, 175], [104, 175]], "id": 1, "linking": []}, {"transcription": "受理时间:", "label": "question", "points": [[126, 267], [266, 267], [266, 305], [126, 305]], "id": 7, "linking": [[7, 13]]}, {"transcription": "2020.6.15", "label": "answer", "points": [[321, 239], [537, 239], [537, 285], [321, 285]], "id": 13, "linking": [[7, 13]]}]
└──dict.txt # 标签文件,文件名称不可改变,每行代表一个标签,与标注文件label字段对应且大小写不敏感,内容举例:OTHER
标注文件的每行内容是图像路径和标注信息。
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 关键信息抽取数据准备。
点云3D目标检测任务
PaddleX针对点云3D目标检测任务定义的数据集,名称是NuscenesPCDetDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── samples # 关键帧采样目录,目录名称不可改变
├── sweeps # 连续帧目录,目录名称不可改变
├── maps # 采样地图目录,目录名称不可改变
├── v1.0-trainval # 包含各类信息,如传感器、标注等信息,目录名称不可改变
├── gt_database_train_nsweeps10_withvelo # 真值库目录,目录名称不可改变
├── anno_info_train_nsweeps10_withvelo.pkl # 标注信息
├── bicycle # bicycle类别点云文件
│ ├── 20646_bicycle_4.bin
│ ├── ...
├── car
├── ...
数据集采用nuScenes格式进行组织和标注,更详细的数据准备说明可参考:CenterPoint 数据准备说明。
需要注意的是,nuScenes数据集根据nuscenes-devkit开发包进行相应的数据读取及训练集和验证集的划分。更详细的介绍请阅读nuScenes官网介绍
请大家参考上述规范准备数据,此外可以参考:示例数据集。
多目3D目标检测任务
PaddleX针对多目3D目标检测任务定义的数据集,名称是NuscenesMVDetDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── samples # 关键帧采样目录,目录名称不可改变
├── sweeps # 连续帧目录,目录名称不可改变
├── maps # 采样地图目录,目录名称不可改变
├── v1.0-trainval # 包含各类信息,如传感器、标注等信息,目录名称不可改变
├── nuscenes_annotation_train.pkl # 标识训练集,文件名称不可改变
├── nuscenes_annotation_val.pkl # 标识验证集,文件名称不可改变
数据集采用nuScenes格式进行组织和标注,更详细的数据准备说明可参考:PETR 数据准备说明。
需要注意的是,nuScenes数据集根据nuscenes-devkit开发包进行相应的数据读取及训练集和验证集的划分。更详细的介绍请阅读nuScenes官网介绍
请大家参考上述规范准备数据,此外可以参考:示例数据集
单目3D目标检测任务
PaddleX针对单目3D目标检测任务定义的数据集,名称是KittiDepthMonoDetDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── ImageSets # 标识目录,目录名称不可改变
| ├── train.txt # 标识训练集,文件名称不可改变,内容举例:000012
| └── val.txt # 标识验证集,文件名称不可改变,内容举例:000012
├── training # 训练、验证目录,目录名称不可改变
| ├── calib # 参数目录,目录名称不可改变
| ├── depth_2 # 深度目录,目录名称不可改变
| ├── image_2 # 图像目录,目录名称不可改变
| └── label_2 # 标注目录,目录名称不可改变
├── kitti_infos_train.pkl # 标识训练集,文件名称不可改变
├── kitti_infos_val.pkl # 标识验证集,文件名称不可改变
...
标注文件采用KITTI格式进行标注,calib、depth_2、image_2和label_2里的文件名称需要保持一致。
请大家参考上述规范准备数据,此外可以参考:示例数据集 和 CaDDN 数据准备说明。
长时序预测任务
PaddleX针对长时序预测任务定义的数据集,名称是TSDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── train.csv # 训练集标注文件,文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。
├── val.csv # 验证集标注文件,文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。
└── test.csv # 测试集标注文件(可选),文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。
请大家参考上述规范准备数据,此外可以参考: 示例数据集和TS数据准备。
时序异常检测任务
PaddleX针对时序异常检测任务定义的数据集,名称是TSDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── train.csv # 训练集标注文件,文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。训练是无异常的时序序列,可以不填写标签列,也可以标签列均为0。
├── val.csv # 验证集标注文件,文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。验证集为了评测指标,需要有标签列,1表示该时间是异常,0表示无异常。
└── test.csv # 测试集标注文件(可选),文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。
请大家参考上述规范准备数据,此外可以参考:示例数据集。
时序分类任务
PaddleX针对时序分类任务定义的数据集,名称是TSDataset,组织结构和标注格式如下。
dataset_dir # 数据集根目录,目录名称可以改变
├── train.csv # 训练集标注文件,文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。其中包含表示样本id的列,特征列,时间列以及类别标签列。
├── val.csv # 验证集标注文件,文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。其中包含表示样本id的列,特征列,时间列以及类别标签列。
└── test.csv # 测试集标注文件(可选),文件名称不可改变。表头是每列的列名称,每一行是某一个时间点采集的数据。
请大家参考上述规范准备数据,此外可以参考:示例数据集。