数据集介绍
一般的目标检测数据集由两部分组成,图片images
和标签annotations
。由少样本目标检测数据集FSOD为例。
FSOD数据集组成
图片部分就不多介绍了,重点来看一下标记部分annotation
,对于图片的标记数据一般用json
格式保存。
上面的图片是FSOD测试集的标记数据,以字典的形式保存,Keys分别为:
images: Values是一个列表,长度即测试集图片的数量。列表中的每个元素对应一个图片的数据, 例如id, file_name, width, height
type: Values是“instances”
annotations: Values是一个列表,长度即测试集图片的数量。列表中的每个元素对应一个图片的标记数据,例如 ignore, image_id, segmentation, bbox, area, category_id, is_crowed, id
categories: Values是一个列表,长度即数据集类别的数量。列表中的每个元素对应一个类别的数据,例如 supercategory, id, name
代码部分
Class: JsonDataset
这个类用来表示一张图片的标记数据
初始化函数
构造这个类只需要数据集的名称,如"fsod"。
def __init__(self, name):
# DATASETS是我们预先写好的字典,保存各种数据集的相关路径
assert name in DATASETS.keys(), \
'Unknown dataset name: {}'.format(name)
assert os.path.exists(DATASETS[name][IM_DIR]), \
'Image directory \'{}\' not found'.format(DATASETS[name][IM_DIR])
assert os.path.exists(DATASETS[name][ANN_FN]), \
'Annotation file \'{}\' not found'.format(DATASETS[name][ANN_FN])
logger.debug('Creating: {}'.format(name))
self.name = name
self.image_directory = DATASETS[name][IM_DIR]
self.image_prefix = (
'' if IM_PREFIX not in DATASETS[name] else DATASETS[name][IM_PREFIX]
)
# 根据标记文件路径构造COCO类
self.COCO = COCO(DATASETS[name][ANN_FN])
self.debug_timer = Timer()
# Set up dataset classes
# 获取所有的类别id
category_ids = self.COCO.getCatIds()
# 根据类别id获取所有类别的名称
categories = [c['name'] for c in self.COCO.loadCats(category_ids)]
# 类别名称与id的相互映射
self.category_to_id_map = dict(zip(categories, category_ids))
self.id_to_category_map = dict(zip(category_ids, categories))
self.classes