detectron2使用自定义数据集及数据加载

1、使用自定义数据集

数据集中列出了detectron2中内置支持的数据集。如果要使用自定义数据集,同时还重复使用detectron2的数据加载器,则需要:

1)注册您的数据集(即,告诉detectron2如何获取您的数据集)。

2)(可选)为您的数据集注册元数据。

接下来,我们详细解释以上两个概念。该Colab教程 对如何对自定义格式的数据集注册和训练标准数据集。

1.1、注册数据集

为了让detectron2知道如何获取名为“ my_dataset”的数据集,您将实现一个函数,该函数返回数据集中的项目,然后将此函数告知detectron2:

def my_dataset_function():
  ...
  return list[dict] in the following format

from detectron2.data import DatasetCatalog
DatasetCatalog.register("my_dataset", my_dataset_function)

在此,代码段将数据集“ my_dataset”与返回数据的函数相关联。如果多次调用,该函数必须返回相同的数据。注册将一直有效直到该过程退出。

该函数可以将数据从其原始格式处理为以下任意一种:

1、Detectron2的标准数据集字典,如下所述。它可以与detectron2中的许多其他内置功能一起使用,因此建议在足以完成任务时使用它。

2、您的自定义数据集字典。您还可以以自己的格式返回任意字典,例如为新任务添加额外的键。然后,您还需要在下游正确处理它们。请参阅下面的更多细节。

1.2、标准数据集字典

对于标准任务(实例检测,实例/语义/全景分割,关键点检测),我们将原始数据集加载到list[dict]具有类似于COCO json注释的规范中。这是我们对数据集的标准表示。

每个字典包含有关一个图像的信息。dict可能具有以下字段,并且必填字段根据数据加载器或任务的需要而有所不同(请参阅下文)。

  • file_name:图像文件的完整路径。如果图像具有此类exif信息,则将应用旋转和翻转。

  • height,width:整数。图像的形状。

  • image_id(str或int):标识此图像的唯一ID。在评估期间用于识别图像,但数据集可将其用于不同目的。

  • annotations(list [dict]):每个字典对应此图片中一个实例的注释。实例检测/细分或关键点检测任务需要。

annotations默认情况下,具有空图像的图像将从训练中删除,但可以使用添加DATALOADER.FILTER_EMPTY_ANNOTATIONS。

每个dict包含以下键bbox,bbox_mode并且category_id是必需的:

  • bbox (list [float]):4个数字的列表,代表实例的边界框。

  • bbox_mode(int):bbox的格式。它必须是structure.BoxMode的成员 。目前支持:BoxMode.XYXY_ABS,BoxMode.XYWH_ABS。

  • category_id(int):表示类别标签的[0,num_categories-1]范围内的整数。保留值num_categories表示“背景”类别(如果适用)。

  • segmentation (list [list [float]]或dict):实例的分段掩码。

    • 如果为list[list[float]],则表示一个多边形列表,该对象的每个连接组件一个。每个list[float]都是一个简单的多边形,格式为。Xs和Ys是以像素为单位的绝对坐标。[x1,y1,...,xn,yn]
    • 如果为dict,则表示COCO的RLE格式的按像素分割蒙版。字典应具有键“大小”和“计数”。您可以通过将uint8的0和1分割掩码转换为dict 。如果使用具有这种格式的默认数据加载器,则必须设置为。pycocotools.mask.encode(np.asarray(mask,order="F"))cfg.INPUT.MASK_FORMATbitmask
  • keypoints(list [float]):格式为[x1,y1,v1,…,xn,yn,vn]。v [i]表示此关键点的可见性。n必须等于关键点类别的数量。Xs和Ys是[0,1]中的相对坐标,还是绝对坐标,取决于“ bbox_mode”是否是相对的。

请注意,COCO格式的坐标注释是[0,H-1或W-1]范围内的整数。默认情况下,detectron2向绝对关键点坐标添加0.5,以将其从离散像素索引转换为浮点坐标。

  • iscrowd:0(默认)或1。是否将此实例标记为COCO的“人群区域”。如果您不知道这是什么意思,请不要包括此字段。

  • sem_seg_file_name:基本事实语义分段文件的完整路径。语义分割任务需要。它应该是像素值为整数标签的图像。

如今,很少使用快速R-CNN(带有预先计算的建议)。要训​​练快速R-CNN,需要以下额外的键:

  • proposal_boxes (数组):形状为(K,4)的2D numpy数组,表示该图像的K个预先计算的投标框。

  • proposal_objectness_logits (数组):形状为(K,)的numpy数组,对应于“ proposal_boxes”中提案的客观记录。

  • proposal_bbox_mode(int):预先计算的投标bbox的格式。它必须是structure.BoxMode的成员 。默认值为BoxMode.XYXY_ABS。

1.3、新任务的自定义数据集字典

在list[dict]数据集函数返回的中,字典也可以具有任意的自定义数据。这对于需要标准数据集字典不支持的额外信息的新任务很有用。在这种情况下,您需要确保下游代码可以正确处理您的数据。通常,这需要mapper为数据加载器编写新文件(请参阅使用自定义数据加载器)。

在设计自定义格式时,请注意,所有字典都存储在内存中(有时会序列化并带有多个副本)。为了节省内存,每个字典旨在包含有关每个样本的少量但足够的信息,例如文件名和注释。加载完整样本通常在数据加载器中进行。

对于在整个数据集中共享的属性,请使用Metadata(请参阅下文)。为避免额外的内存,请勿为每个样本重复保存此类信息。

1.4、数据集的“元数据”

每个数据集都与一些元数据相关联,可通过访问这些元数据 MetadataCatalog.get(dataset_name).some_metadata。元数据是一个键值映射,其中包含在整个数据集中共享的信息,通常用于解释数据集中的内容,例如,类的名称,类的颜色,文件的根目录等。此信息对于元数据的结构取决于相应下游代码的需求。

如果您通过来注册新的数据集DatasetCatalog.register,则可能还需要通过来添加其相应的元数据 ,以启用需要该元数据的所有功能。您可以这样操作(以元数据键“ thing_classes”为例):MetadataCatalog.get(dataset_name).some_key=some_value

from detectron2.data import MetadataCatalog MetadataCatalog.get("my_dataset").thing_classes = ["person", "dog"]

这是detectron2的内置功能所使用的元数据密钥的列表。如果添加自己的数据集而没有这些元数据,则某些功能可能对您不可用:

  • thing_classes(list [str]):由所有实例检测/分段任务使用。每个实例/事物类别的名称列表。如果加载COCO格式的数据集,它将由函数自动设置load_coco_json。

  • thing_colors(list [tuple(r,g,b)]):每个事物类别的预定义颜色(在[0,255]中)。用于可视化。如果未给出,则使用随机颜色。

  • stuff_classes(list [str]):用于语义和全景分割任务。每个物料类别的名称列表。

  • stuff_colors(list [tuple(r,g,b)]):每个填充类别的预定义颜色(在[0,255]中)。用于可视化。如果未给出,则使用随机颜色。

  • keypoint_names(list [str]):由关键点本地化使用。每个关键点的名称列表。

  • keypoint_flip_map(list [tuple [str]]):由关键点本地化任务使用。名称对列表,其中每对都是在增强过程中图像水平翻转时应该翻转的两个关键点。

  • keypoint_connection_rules:列表[tuple(str,str,(r,g,b))]。每个元组指定一对连接的关键点,以及在可视化时用于它们之间的线的颜色。

一些特定于某些数据集评估的其他元数据(例如COCO):

  • thing_dataset_id_to_contiguous_id(dict [int-> int]):由COCO格式的所有实例检测/分段任务使用。从数据集中的实例类ID到[0,#class)范围内的连续ID的映射。将由该功能自动设置load_coco_json。

  • stuff_dataset_id_to_contiguous_id(dict [int-> int]):在生成用于语义/全景分割的预测json文件时使用。从数据集中的语义细分类ID到[0,num_categories)中的连续ID的映射。它仅对评估有用。

  • json_file:COCO注释json文件。由COCO评估用于COCO格式的数据集。

  • panoptic_root,panoptic_json:由全景评估中使用。

  • evaluator_type:由内置的主要培训脚本用来选择评估者。不要在新的培训脚本中使用它。您可以直接在主脚本中为数据集提供DatasetEvaluator。

注意:有关“事物”和“材料”概念的背景知识,请参见 “看到材料:人与机器对材料的感知”。在detectron2中,术语“事物”用于实例级任务,而“东西”用于语义分割任务。两者都用于全景分割。

1.5、注册COCO格式数据集

如果您的数据集已经是COCO格式的json文件,则可以使用以下方法轻松注册该数据集及其关联的元数据:

from detectron2.data.datasets import register_coco_instances register_coco_instances("my_dataset", {}, "json_annotation.json", "path/to/image/dir")

如果您的数据集为COCO格式,但带有额外的自定义按实例注释,则load_coco_json 函数可能会很有用。

1.6、更新新数据集的配置

注册数据集后,您可以在中使用数据集的名称(例如,上例中的“ my_dataset”)cfg.DATASETS.{TRAIN,TEST}。您可能还需要更改其他配置以对新数据集进行训练或评估:

  • MODEL.ROI_HEADS.NUM_CLASSES和MODEL.RETINANET.NUM_CLASSES分别是R-CNN和RetinaNet模型的事物类别的数量。

  • MODEL.ROI_KEYPOINT_HEAD.NUM_KEYPOINTS设置关键点R-CNN的关键点数。您还需要设置关键点OKS 与TEST.KEYPOINT_OKS_SIGMAS评估。

  • MODEL.SEM_SEG_HEAD.NUM_CLASSES 设置语义FPN和Panoptic FPN的东西类的数量。

  • 如果您正在训练Fast R-CNN(带有预先计算的建议),则DATASETS.PROPOSAL_FILES_{TRAIN,TEST}需要匹配数据集。建议文件的格式在 此处记录。

新模型(例如TensorMask, PointRend)通常具有自己的相似配置,也需要更改。

2、使用自定义数据加载器

2.1、现有数据加载器的工作方式

Detectron2包含一个内置的数据加载管道。如果您需要编写自定义代码,最好了解它的工作原理。

Detectron2提供了两个函数build_detection_ {train,test} _loader ,它们从给定的配置创建默认的数据加载器。下面是如何build_detection_{train,test}_loader工作:

  1. 它采用已注册数据集的名称(例如“ coco_2017_train”),并list[dict]以轻量级规范格式加载表示数据集项的。这些数据集项尚未准备好由模型使用(例如,图像未加载到内存中,尚未应用随机扩充等)。有关数据集格式和数据集注册的详细信息可以在数据集中找到 。

  2. 此列表中的每个字典都由一个函数(“映射器”)映射:

  • 用户可以通过在中指定“ mapper”参数来自定义此映射功能 build_detection_{train,test}_loader。默认的映射器是DatasetMapper。
    • 该函数的输出格式可以是任意的,只要该数据加载器的使用者(通常是模型)可以接受即可。批处理后,默认映射器的输出遵循Use Models中记录的默认模型输入格式 。

    • 映射器的作用是将数据集项目的轻量级规范表示形式转换为可供模型使用的格式(包括例如读取图像,执行随机数据增强并转换为割炬张量)。如果要对数据执行自定义转换,则通常需要自定义映射器。

  1. 映射器的输出被批处理(简单地成一个列表)。

  2. 批处理的数据是数据加载器的输出。通常,它也是的输入 model.forward()。

2.2、编写自定义数据加载器

build_detection_{train,test}_loader(mapper=)在大多数自定义数据加载的用例中,使用不同的“映射器”即可。例如,如果您想将所有图像调整为固定大小以进行Mask R-CNN训练,请编写以下代码:

from detectron2.data import build_detection_train_loader
from detectron2.data import transforms as T
from detectron2.data import detection_utils as utils

def mapper(dataset_dict):
	# Implement a mapper, similar to the default DatasetMapper, but with your own customizations
	dataset_dict = copy.deepcopy(dataset_dict)  # it will be modified by code below
	image = utils.read_image(dataset_dict["file_name"], format="BGR")
	image, transforms = T.apply_transform_gens([T.Resize((800, 800))], image)
	dataset_dict["image"] = torch.as_tensor(image.transpose(2, 0, 1).astype("float32"))

	annos = [
		utils.transform_instance_annotations(obj, transforms, image.shape[:2])
		for obj in dataset_dict.pop("annotations")
		if obj.get("iscrowd", 0) == 0
	]
	instances = utils.annotations_to_instances(annos, image.shape[:2])
	dataset_dict["instances"] = utils.filter_empty_instances(instances)
	return dataset_dict

data_loader = build_detection_train_loader(cfg, mapper=mapper)
# use this dataloader instead of the default

有关详细信息,请参考detectron2.data的API文档。

如果您不仅要更改映射器(例如,编写不同的采样或批处理逻辑),还可以编写自己的数据加载器。数据加载器只是一个python迭代器,它产生模型接受的格式。您可以使用任何喜欢的工具来实现它。

2.3、使用自定义数据加载器

如果使用DefaultTrainer,则可以覆盖其build_{train,test}_loader方法以使用自己的数据加载器。有关 示例,请参见densitypose数据加载器。

如果您编写自己的训练循环,则可以轻松插入数据加载器。

detectron2配置安装,总目录:

1、coco数据集下载格式解析

2、win10下detectron2环境配置

3、windows10离线安装pycocotools

4、detectron2代码运行及数据集配置

5、detectron2使用自定义数据集及数据加载

6、detectron2模型使用、读写、训练及测试

7、detectron2配置与部署

你可能感兴趣的:(detectron2,深度学习,python,detectron2,自定义数据集,数据加载)