PyTorch读取目标检测数据集
数据集介绍
一般的目标检测数据集由两部分组成,图片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读取目标检测数据集相关推荐
- COCO目标检测数据集的读取方法与Python工具脚本
COCO (Common Objects in COntext) 是一个大型的图像数据集,提供了目标检测.分割.看图说话等多个任务的标签.COCO的标注文件是用json格式编写的,初次接触时需要花十来 ...
- 如何利用python将NWPU VHR-10目标检测遥感数据集的格式转换成VOC目标检测数据集的格式
VOC目标检测数据集的格式 其中图片存放在JPEGImages文件夹中,标注是xml文件,存储在Annotations文件中 关于train集和val集的txt划分存放在ImageSets文件夹下面的 ...
- 目标检测数据集The Object Detection Dataset
目标检测数据集The Object Detection Dataset 在目标检测领域,没有像MNIST或Fashion MNIST这样的小数据集.为了快速测试模型,我们将组装一个小数据集.首先,我们 ...
- 使用yolov5训练自己的目标检测数据集
使用yolov5训练自己的目标检测数据集 yolov4出来后不久,又出现了yolov5,没有论文.虽然作者没有放上和yolov4的直接测试对比,但在COCO数据集的测试效果还是很可观的.很多人考虑到Y ...
- 数据集:Udacity Self-Driving 目标检测数据集
转载自:http://blog.csdn.net/jesse_mx/article/details/72599220 前言 之前,博主为了得到更好的车载视频目标检测效果(偏工程实际,非刷榜),使用SS ...
- 【yolo5】目标检测数据集制作
目录 1.先验知识 2. VOC和COCO数据集: 2.1 VOC形式及其数据结构XML特点(好像可以使用py库中工具直接进行清洗) 2.1.1 VOC数据集的组织结构如下所示 2.1.2 XML的操 ...
- TensorFlow Object Detection API 技术手册(5)——制作自己的目标检测数据集
TensorFlow Object Detection API 技术手册(5)--制作自己的目标检测数据集 (一)收集图片 (二)安装图像打标工具labelImg (三)将XML文件转化为CSV文件 ...
- Udacity Self-Driving 目标检测数据集简介与使用
前言 之前,博主为了得到更好的车载视频目标检测效果(偏工程实际,非刷榜),使用SSD框架训练过KITTI数据集,几次训练下来,结果不太理想.自己分析,原因较多,其中很重要的一条就是KITTI数据集不够 ...
- SAR目标检测数据集汇总
SAR目标检测数据集汇总 文章目录 SAR目标检测数据集汇总 1. MSTAR (1996) 2. OpenSARShip2.0 (2017) 3. SSDD / SSDD+ (2020) 4. AI ...
- 目标检测数据集MSCOCO简介
简介 介绍一下目标检测领域另外一个比较有名的数据集 MS COCO (Microsoft COCO: Common Objects in Context) . MSCOCO 数据集是微软构建的一个数据 ...
最新文章
- 死鱼——--摘自《项目百态:深入理解软件项目行为模式 》
- 谁是谢源?广西理科探花、清华电子系学霸、阿里AI芯片带头大哥、新晋ACM Fellow...
- linux命令shutdown
- linux 管道和重定向
- python3抓取图片_通过Python3 爬虫抓取漫画图片
- find command基本使用
- win7/8/10安装过程中将动态磁盘转为basic
- c语言速算24源代码,C语言源程序代码-速算24
- python面向对象(其二)
- 【Django 2021年最新版教程28】前端模板中 时间日期星期格式化
- html5中的function,js中function函数的使用方法
- Linux 程序 动态库 静态库依赖关系
- Lightbox滚轮缩放功能
- 向量叉积和点积混合运算_叉乘点乘混合运算公式
- 星号99乘法表c语言,用Python打印九九乘法表与金字塔(*)星号
- 用户路径分析之利器“桑基图”
- html页眉页脚独立,word中怎样单独页面设置页眉
- python可以编程手机版_手机最强Python编程神器,在手机上运行Python
- main函数中的argc和argv是什么意思?
- 运行adb 命令提示more than one device/emulator