数据集介绍

一般的目标检测数据集由两部分组成,图片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 = nameself.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# 获取所有的类别idcategory_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 = ['__background__'] + categoriesself.num_classes = len(self.classes)# 类别id与其索引的映射self.json_category_id_to_contiguous_id = {v: i + 1for i, v in enumerate(self.COCO.getCatIds())}# 类别索引与其id的映射self.contiguous_category_id_to_json_id = {v: kfor k, v in self.json_category_id_to_contiguous_id.items()}

构造roidb数据结构

roidb简介

在检测任务中,我们希望参加训练的每条数据entry里面包括:

图片路径image
该图片所有对象框的坐标boxes
该图片所有boxes的类别gt_classes
该图片所有boxes的得分gt_overlaps等等这些信息。

为了方便的组合这些信息,我们用字典的形式构造entry,所有entry构成的列表就是roidb

roidb的结构

roidb[image_index]包含的key value
id 该图片的id,字符串
boxes box位置信息,box_num*4的np.array
gt_overlaps 所有box在不同类别的得分,box_num*class_num的np.array
gt_classes 所有box的真实类别,box_num长度的list
flipped 是否翻转
image 该图片的路径,字符串
width 图片的宽
height 图片的高
max_overlaps 每个box在所有类别的得分最大值,即gt_overlaps行最大值,长度box_num的列表
max_classes 每个box得分最高所对应的类,长度box_num的列表

roidb构造过程

def get_roidb(): 根据图片的标记数据annotation构造数据结构roidb

def get_roidb(self, gt=False, crowd_filter_thresh=0,):assert gt is True or crowd_filter_thresh == 0, \'Crowd filter threshold must be 0 if ground-truth annotations ' \'are not included.'# 获取所有图片id并排序image_ids = self.COCO.getImgIds()image_ids.sort()# 根据图片id返回图片信息,格式如下所示:# {'id': 2019000089872, 'file_name': 'part_1/n03715892/n03715892_10790.jpg', 'width': 375, 'height': 500}if cfg.DEBUG:roidb = copy.deepcopy(self.COCO.loadImgs(image_ids))[:100]else:roidb = copy.deepcopy(self.COCO.loadImgs(image_ids))# 填充roidb还缺少的元素构成完整的roidb结构,暂用空值代替for entry in roidb:self._prep_roidb_entry(entry)if gt:# Include ground-truth object annotations# 如果已经读取过标注文件会有缓存文件cache_filepath = os.path.join(self.cache_path, self.name+'_gt_roidb.pkl')if os.path.exists(cache_filepath) and not cfg.DEBUG:self.debug_timer.tic()self._add_gt_from_cache(roidb, cache_filepath)logger.debug('_add_gt_from_cache took {:.3f}s'.format(self.debug_timer.toc(average=False)))else:self.debug_timer.tic()for entry in roidb:# 根据标记数据补充roidb中相应的值self._add_gt_annotations(entry)logger.debug('_add_gt_annotations took {:.3f}s'.format(self.debug_timer.toc(average=False)))if not cfg.DEBUG:with open(cache_filepath, 'wb') as fp:pickle.dump(roidb, fp, pickle.HIGHEST_PROTOCOL)logger.info('Cache ground truth roidb to %s', cache_filepath)# 计算max_overlaps: 某张图片每个box所有类别的得分最大值#     max_classes:  某张图片每个box得分最高对应的类_add_class_assignments(roidb)  return roidb

少样本目标检测roidb的构造

上面构造的roidb数据,其中每个entry都表示一张图片的数据。但在少样本的检测任务中,需要将每张图片中的一个类别作为一个item,这些item构成new_roidb

new_roidb[image_cls_id]包含的key value
id 该图片的id,字符串
boxes 该图片上某一类别box位置信息
gt_overlaps 所有box在不同类别的得分,box_num*class_num的np.array
gt_classes 该图片某一类别box的真实类别
flipped 是否翻转
image 该图片的路径,字符串
width 图片的宽
height 图片的高
max_overlaps 每个box在所有类别的得分最大值,即gt_overlaps行最大值,长度box_num的列表
max_classes 每个box得分最高所对应的类,长度box_num的列表
target_cls 当前的类别,int
index 当前item的索引,int

从标记数据中构造roidb数据类型之后,需要对其进行一些简单的修改以便能够更好地适应训练,如数据增强、添加回归目标,删除一些不可用的数据等。

def combined_roidb_for_training(dataset_names, proposal_files):def get_roidb(dataset_name, proposal_file):ds = JsonDataset(dataset_name)roidb = ds.get_roidb(gt=True,proposal_file=proposal_file,crowd_filter_thresh=cfg.TRAIN.CROWD_FILTER_THRESH)# 数据增强:水平翻转图片if cfg.TRAIN.USE_FLIPPED:logger.info('Appending horizontally-flipped training examples...')extend_with_flipped_entries(roidb, ds)logger.info('Loaded dataset: {:s}'.format(ds.name))return roidbif isinstance(dataset_names, six.string_types):dataset_names = (dataset_names, )if isinstance(proposal_files, six.string_types):proposal_files = (proposal_files, )if len(proposal_files) == 0:proposal_files = (None, ) * len(dataset_names)assert len(dataset_names) == len(proposal_files)roidbs = [get_roidb(*args) for args in zip(dataset_names, proposal_files)]# 第一个数据集对应的roidboriginal_roidb = roidbs[0]# new dataset split according to class roidb = []for item in original_roidb:gt_classes = list(set(item['gt_classes']))all_cls = np.array(item['gt_classes'])# 遍历一张图上的不同类别# 对每个类别对象建立一个entryfor cls in gt_classes:item_new = item.copy()target_idx = np.where(all_cls == cls)[0] #item_new['id'] = item_new['id'] * 1000 + int(cls)item_new['target_cls'] = int(cls)item_new['boxes'] = item_new['boxes'][target_idx]item_new['max_classes'] = item_new['max_classes'][target_idx]item_new['gt_classes'] = item_new['gt_classes'][target_idx]item_new['is_crowd'] = item_new['is_crowd'][target_idx]item_new['segms'] = item_new['segms'][:target_idx.shape[0]]item_new['seg_areas'] = item_new['seg_areas'][target_idx]item_new['max_overlaps'] = item_new['max_overlaps'][target_idx]item_new['box_to_gt_ind_map'] = np.array(range(item_new['gt_classes'].shape[0]))item_new['gt_overlaps'] = item_new['gt_overlaps'][target_idx]roidb.append(item_new)for r in roidbs[1:]:roidb.extend(r)# 移除没有可用roi的entryroidb = filter_for_training(roidb)if cfg.TRAIN.ASPECT_GROUPING or cfg.TRAIN.ASPECT_CROPPING:logger.info('Computing image aspect ratios and ordering the ratios...')# 将图片按横纵比进行排序,裁剪较大的图片ratio_list, ratio_index, cls_list, id_list = rank_for_training(roidb)logger.info('done')else:ratio_list, ratio_index, cls_list, id_list = None, None, None, Nonelogger.info('Computing bounding-box regression targets...')add_bbox_regression_targets(roidb)logger.info('done')_compute_and_log_stats(roidb)print(len(roidb))return roidb, ratio_list, ratio_index, cls_list, id_list

在few-shot目标检测任务中,

roidb数据构造完成后,通过DataLoader 生成参与训练的数据形式。

dataset = RoiDataLoader(roidb,cfg.MODEL.NUM_CLASSES,info_list,ratio_list,training=True)dataloader = torch.utils.data.DataLoader(dataset,batch_sampler=batchSampler,num_workers=0,#num_workers=cfg.DATA_LOADER.NUM_THREADS,collate_fn=collate_minibatch)dataiterator = iter(dataloader)

参考材料:https://github.com/fanq15/FSOD-code
https://blog.csdn.net/qq_34809033/article/details/83215698

PyTorch读取目标检测数据集相关推荐

  1. COCO目标检测数据集的读取方法与Python工具脚本

    COCO (Common Objects in COntext) 是一个大型的图像数据集,提供了目标检测.分割.看图说话等多个任务的标签.COCO的标注文件是用json格式编写的,初次接触时需要花十来 ...

  2. 如何利用python将NWPU VHR-10目标检测遥感数据集的格式转换成VOC目标检测数据集的格式

    VOC目标检测数据集的格式 其中图片存放在JPEGImages文件夹中,标注是xml文件,存储在Annotations文件中 关于train集和val集的txt划分存放在ImageSets文件夹下面的 ...

  3. 目标检测数据集The Object Detection Dataset

    目标检测数据集The Object Detection Dataset 在目标检测领域,没有像MNIST或Fashion MNIST这样的小数据集.为了快速测试模型,我们将组装一个小数据集.首先,我们 ...

  4. 使用yolov5训练自己的目标检测数据集

    使用yolov5训练自己的目标检测数据集 yolov4出来后不久,又出现了yolov5,没有论文.虽然作者没有放上和yolov4的直接测试对比,但在COCO数据集的测试效果还是很可观的.很多人考虑到Y ...

  5. 数据集:Udacity Self-Driving 目标检测数据集

    转载自:http://blog.csdn.net/jesse_mx/article/details/72599220 前言 之前,博主为了得到更好的车载视频目标检测效果(偏工程实际,非刷榜),使用SS ...

  6. 【yolo5】目标检测数据集制作

    目录 1.先验知识 2. VOC和COCO数据集: 2.1 VOC形式及其数据结构XML特点(好像可以使用py库中工具直接进行清洗) 2.1.1 VOC数据集的组织结构如下所示 2.1.2 XML的操 ...

  7. TensorFlow Object Detection API 技术手册(5)——制作自己的目标检测数据集

    TensorFlow Object Detection API 技术手册(5)--制作自己的目标检测数据集 (一)收集图片 (二)安装图像打标工具labelImg (三)将XML文件转化为CSV文件 ...

  8. Udacity Self-Driving 目标检测数据集简介与使用

    前言 之前,博主为了得到更好的车载视频目标检测效果(偏工程实际,非刷榜),使用SSD框架训练过KITTI数据集,几次训练下来,结果不太理想.自己分析,原因较多,其中很重要的一条就是KITTI数据集不够 ...

  9. SAR目标检测数据集汇总

    SAR目标检测数据集汇总 文章目录 SAR目标检测数据集汇总 1. MSTAR (1996) 2. OpenSARShip2.0 (2017) 3. SSDD / SSDD+ (2020) 4. AI ...

  10. 目标检测数据集MSCOCO简介

    简介 介绍一下目标检测领域另外一个比较有名的数据集 MS COCO (Microsoft COCO: Common Objects in Context) . MSCOCO 数据集是微软构建的一个数据 ...

最新文章

  1. 死鱼——--摘自《项目百态:深入理解软件项目行为模式 》
  2. 谁是谢源?广西理科探花、清华电子系学霸、阿里AI芯片带头大哥、新晋ACM Fellow...
  3. linux命令shutdown
  4. linux 管道和重定向
  5. python3抓取图片_通过Python3 爬虫抓取漫画图片
  6. find command基本使用
  7. win7/8/10安装过程中将动态磁盘转为basic
  8. c语言速算24源代码,C语言源程序代码-速算24
  9. python面向对象(其二)
  10. 【Django 2021年最新版教程28】前端模板中 时间日期星期格式化
  11. html5中的function,js中function函数的使用方法
  12. Linux 程序 动态库 静态库依赖关系
  13. Lightbox滚轮缩放功能
  14. 向量叉积和点积混合运算_叉乘点乘混合运算公式
  15. 星号99乘法表c语言,用Python打印九九乘法表与金字塔(*)星号
  16. 用户路径分析之利器“桑基图”
  17. html页眉页脚独立,word中怎样单独页面设置页眉
  18. python可以编程手机版_手机最强Python编程神器,在手机上运行Python
  19. main函数中的argc和argv是什么意思?
  20. 运行adb 命令提示more than one device/emulator

热门文章

  1. 几种常用App原型设计工具详解
  2. spider.php使用方法,phpspider爬虫框架的使用
  3. 实时高清车牌识别算法
  4. vue-pdf查看pdf文件及打印乱码问题处理
  5. ExDirectUI 5.0 项目重构正式启动
  6. matlab如何进行图像读取,matlab如何读取图像
  7. UML工具Visual Paradigm入门:业务流程建模 (BPM) 教程
  8. COMSOL空气反应 模型框架
  9. 模2除法——用非常直观的例子解释
  10. iOS动态库和静态库的运用