Detectron2 使用自定义数据集 | 四

作者|facebookresearch
编译|Flin
来源|Github

使用自定义数据集

如果你要使用自定义数据集,同时还要重用detectron2的数据加载器,
你将需要

  1. 注册你的数据集(即,告诉detectron2如何获取你的数据集)。
  2. (可选)为你的数据集注册元数据。

接下来,我们详细解释上述两个概念。

该Colab Notebook 有如何在自定义格式的数据集注册和训练工作的例子。
Colab Notebook:(https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5)

注册数据集

为了让detectron2知道如何获取名为"my_dataset"的数据集,你将实现
一个函数,该函数返回数据集中的项目,然后将其告知detectron2
功能:

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

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

在此,代码段将数据集"my_dataset"与返回数据的函数相关联。在该过程存在之前,注册将一直有效。

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

  1. Detectron2的标准数据集字典。它可以与detectron2中的许多其他内置功能一起使用,因此建议在足以完成任务时使用它。
  2. 你的自定义数据集字典。你还可以以自己的格式返回任意字典,例如为新任务添加额外的键。然后,你还需要在下游正确处理它们。请参阅下面的更多细节。。
标准数据集字典

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

每个字典包含有关一个图像的信息。该词典可能具有以下字段。这些字段通常是可选的,某些功能可能能够根据需要从其他字段推断某些字段,例如数据加载器将从"file_name"加载图像,并从"sem_seg_file_name"加载"sem_seg"。

  • file_name:图像文件的完整路径。如果图像具有此类exif信息,则将应用旋转和翻转。
  • sem_seg_file_name:基本事实语义分割文件的完整路径。
  • sem_seg:2Dtorch.Tensor中的语义分割基础事实。数组中的值表示
  • 类别标签从0开始。
  • height,width:整数。图像的形状。
  • image_id(str或int):标识此图像的唯一ID。在评估期间用于识别图像,但数据集可将其用于不同目的。
  • annotations(list [dict]):每个字典对应此图片中一个实例的注释。annotations默认情况下,具有空图像的图像将从训练中删除,但可以使用添加DATALOADER.FILTER_EMPTY_ANNOTATIONS。每个字典可能包含以下键:
  • bbox(list [float]):4个数字的列表,代表实例的边界框。
  • bbox_mode(int):bbox的格式。
  • 它必须是structures.BoxMode((https://detectron2.readthedocs.io/modules/structures.html#detectron2.structures.BoxMode) 的成员。目前支持:BoxMode.XYXY_ABS,BoxMode.XYWH_ABS
  • category_id(int):表示类别标签的[0,num_categories)范围内的整数。保留值num_categories以表示"背景"类别(如果适用)。
  • segmentation(list [list [float]]或dict):
    • 如果为list [list [float]],则表示多边形列表,每个连接的组件一个对象。每个list [float]是一个简单的多边形,格式为[[x1,y1,...,xn,yn]`。X和Y可以是[0,1]中的相对坐标,也可以是绝对坐标,这取决于"bbox_mode"是否是相对的。
    • 如果为dict,则表示COCO RLE格式的每个像素的分割蒙版。字典应该有键"大小"和"计数"。你可以将0和1的uint8分段掩码转换为RLE格式为pycocotools.mask.encode(np.asarray(mask,order ="F")))
  • keypoints(list [float]):格式为[x1,y1,v1,...,xn,yn,vn]。v [i]表示此关键点的可见性(http://cocodataset.org/#format-data)。n必须等于关键点类别的数量。 X和Y可以是[0,1]中的相对坐标,也可以是绝对坐标,取决于"bbox_mode"是否是相对的。

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

  • iscrowd:0或1。是否将此实例标记为COCO的crowd region。如果你不知道这是什么意思,请不要包括此字段。

快速R-CNN样式训练使用以下键,这在今天是罕见的。

  • proposal_boxes(数组):形状为(K,4)的2D numpy数组,表示该图像的K个预先计算的proposal box。
  • proposal_objectness_logits(array):形状为(K,)的numpy数组,对应于"proposal_boxes"中proposals的客观记录。
  • proposal_bbox_mode(int):预先计算的proposal bbox的格式。它必须是structure.BoxMode(https://detectron2.readthedocs.io/modules/structures.html#detectron2.structures.BoxMode) 的成员 。默认值为BoxMode.XYXY_ABS。

如果你的数据集已经是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(https://detectron2.readthedocs.io/modules/data.html#detectron2.data.datasets.load_coco_json)函数。

自定义数据集字典

在你的数据集函数返回的list [dict]中,字典也可以具有任意的自定义数据。
当你执行新任务并且需要不支持的其他信息时,这可能会很有用
根据标准数据集字典。在这种情况下,你需要确保下游代码可以处理你的数据
正确地。通常,这需要为数据加载器编写一个新的"映射器"(请参阅​​使用自定义数据加载器(https://detectron2.readthedocs.io/tutorials/data_loading.html)

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

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

数据集的"元数据"

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

如果你通过DatasetCatalog.register注册新的数据集,则可能还需要通过MetadataCatalog.get(dataset_name).set(name, value)来添加其相应的元数据 ,以启用需要元数据的任何功能。你可以这样做(以元数据字段"thing_classes"为例):

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:list [tuple(str,str,(r,g,b))]。列表[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(https://detectron2.readthedocs.io/modules/evaluation.html#detectron2.evaluation.DatasetEvaluator)。

注意:有关"thing"和"stuff"概念的背景知识,请参见
关于看到的东西:人与机器对材料的感知(http://persci.mit.edu/pub_pdfs/adelson_spie_01.pdf)。在detectron2中,术语"thing"用于实例级任务,"stuff"用于语义分割任务。两者都用于全景分割。

更新新数据集的配置

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

  • MODEL.ROI_HEADS.NUM_CLASSESMODEL.RETINANET.NUM_CLASSES是事物类的数量,适用于R-CNN和RetinaNet模型。
  • MODEL.ROI_KEYPOINT_HEAD.NUM_KEYPOINTS设置关键点R-CNN的关键点数量。你还需要设置Keypoint OKS(http://cocodataset.org/#keypoints-eval)与TEST.KEYPOINT_OKS_SIGMAS一起进行评估。
  • MODEL.SEM_SEG_HEAD.NUM_CLASSES设置语义FPN和Panoptic FPN的东西类的数量。
  • 如果你要训练快速R-CNN(包含预先计算的建议), DATASETS.PROPOSAL_FILES_ {TRAIN,TEST}需要匹配数据。proposal文件的格式已记录在案,此处(https://detectron2.readthedocs.io/modules/data.html#detectron2.data.load_proposals_into_dataset)。

原文链接:https://detectron2.readthedocs.io/tutorials/datasets.html

欢迎关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官方文档:
http://sklearn123.com/

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

你可能感兴趣的:(Detectron2 使用自定义数据集 | 四)