- 一、数据集介绍
- 二、数据集格式
- 三、数据集切分
最近参加了阿里云天池小样本商标检测挑战赛,做了不少数据集处理的事情,在此做个整理。
一、数据集介绍数据集下载地址:https://tianchi.aliyun.com/competition/entrance/531948/information
这里有四个文件,两个train和两个test,round1是初赛文件,round2是复赛文件。round1和round2文件的格式完全相同。
test文件夹是测试用的,没有truth bboxs的标注文档,所以只有比赛时候有用,对我们来讲是用不到的,毕竟只有图片没有标注也没法用。所以只有train可以用,那么其实我们只需要处理 round1_train 和 round2_train 这两个文件夹就可以了。
因为这两个文件夹格式完全相同,所以我们只需要看其中一个就行。
二、数据集格式
fewshotlogodetection_round1_train_202204/train 下面有两个文件:annotations和images。
images文件夹下存放的是50个logo类别的图片,annotations文件夹下是一个 coco格式的标注文件 instances_train2017.json,其内容如下:
{
"info": "spytensor created",
"license": [
"license"
],
"images": [
{
"height": 650,
"width": 650,
"id": 0,
"file_name": "0218a27cab43f45df80e26195da5599b.jpg"
},
... id = 0 - 2475
],
"annotations": [
{
"id": 0,
"image_id": 0,
"category_id": 18,
"segmentation": [[ ... segmentation是做分割用的,这里用不到]],
"bbox": [340, 235, 272, 51],
"iscrowd": 0,
"area": 14196
},
... ... id = 0 - 5160
],
"categories": [
{
"id": 1,
"name": "冰墩墩"
},
...
{
"id": 50,
"name": "Schwarzkopf/施华蔻"
}
]
}
通过json文件可以看到,该数据集中共有2476张图片,5161个标注框,50个类别。
需要注意的是 categories 的id 是从1开始的,而不是从0开始的。
bbox 的数据是 [x,y,w,h]
三、数据集切分可以发现,原始的数据集只有train,没有valid,所以我们需要把train按照 4:1 切分为训练集和验证集。
代码:
"""
将原始train数据集按照4:1切分为训练集和验证集,其中训练集1980张图片,验证集496张图片。
"""""
import json
import os
import shutil
# 原始数据路径
data_path = "dataset/fewshotlogodetection_round1_train_202204/train"
annoations_path = os.path.join(data_path, "annotations/instances_train2017.json")
images_path = os.path.join(data_path, "images")
# 切分后的新数据集路径
train_dict = {"info": "spytensor created",
"license": ["license"],
"images": [],
"annotations": [],
"categories": []
}
val_dict = {"info": "spytensor created",
"license": ["license"],
"images": [],
"annotations": [],
"categories": []
}
fewshotlogo_path = "COCO"
split_annoations_path = os.path.join(fewshotlogo_path, "annotations")
train_annoations_path = os.path.join(split_annoations_path, "instances_train2017.json")
val_annoations_path = os.path.join(split_annoations_path, "instances_val2017.json")
train_path = os.path.join(fewshotlogo_path, "train2017")
val_path = os.path.join(fewshotlogo_path, "val2017")
# 创建新文件夹
isExists = os.path.exists(fewshotlogo_path)
if isExists:
shutil.rmtree(fewshotlogo_path)
os.mkdir(fewshotlogo_path)
os.mkdir(split_annoations_path)
os.mkdir(train_path)
os.mkdir(val_path)
# 数据集分割:产生1980个训练数据,496个验证数据
with open(annoations_path, 'r', encoding='utf-8') as f:
annoations_dict = json.load(f)
images_list = annoations_dict["images"]
annotations_list = annoations_dict["annotations"]
for i in range(len(images_list)):
# val set
if i % 5 == 0:
val_dict["images"].append(images_list[i])
shutil.copy(os.path.join(images_path, images_list[i]["file_name"]), val_path)
val_dict["annotations"].append(annotations_list[i])
# train set
else:
train_dict["images"].append(images_list[i])
shutil.copy(os.path.join(images_path, images_list[i]["file_name"]), train_path)
train_dict["annotations"].append(annotations_list[i])
train_dict["categories"] = annoations_dict["categories"]
val_dict["categories"] = annoations_dict["categories"]
assert len(train_dict["images"]) == 1980, "数据集分割错误"
assert len(val_dict["images"]) == 496, "数据集分割错误"
# 写入json文件
with open(train_annoations_path, 'w',encoding='utf-8') as f:
json.dump(train_dict, f,indent=4,ensure_ascii=False)
with open(val_annoations_path, 'w',encoding='utf-8') as f:
json.dump(val_dict, f,indent=4,ensure_ascii=False)
print("数据集分割完成")
运行之后产生了一个COCO文件夹,这是一个与coco数据集格式完全相同的数据集,包括命名也完全相同。意味着这个数据集不需要做任何改动就可以用于很多开源代码的训练,因为几乎所有网络都会用coco数据集训练以验证其性能。
COCO文件夹格式如下:



