欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

detectron2使用自定义的数据集

程序员文章站 2023-12-24 20:43:33
...

如果你要使用自定义的数据集,同时还要重写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 DatasetCatalogDatasetCatalog.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:语义分割GT的路径。

  • sem_seg:2Dtorch.Tensor中的语义分割GT。数组中的值表示类别标签从0开始。

  • height,width:整数。图像的尺寸。

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

  • annotations(list [dict]):每个字典对应此图片中一个实例的注释。annotations默认情况下,具有空图像的图像将从训练中删除,但可以使用添加DATALOADER.FILTER_EMPTY_ANNOTATIONS。每个字典可能包含以下键:

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

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

    • 如果为list [list [float]],则表示多边形列表,每个组件连接一个对象。如果是list [float],则表示为一个简单的多边形,格式为[[x1,y1,...,xn,yn]`。X和Y可以是[0,1]中的相对坐标,也可以是绝对坐标,这取决于"bbox_mode"是否是相对的。

    • 如果为dict,则表示COCO RLE格式中每个像素的segmentation mask。字典应该有键"大小"和"计数"。你可以将0和1的uint8分段掩码转换为RLE格式为pycocotools.mask.encode(np.asarray(mask,order ="F")))

    • 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):

    • keypoints(list [float]):格式为[x1,y1,v1,...,xn,yn,vn]。v [i]表示此关键点的可见性(http://cocodataset.org/#format-data)。n必须等于关键点类别的数量。X和Y可以是[0,1]中的相对坐标,也可以是绝对坐标,取决于"bbox_mode"是否是相对的。

按照Fast R-CNN风格训练则使用以下键。

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

  • proposal_objectness_logits(array):形状为(K,)的numpy数组,对应于"proposal_boxes"中proposals的objectness logits。

  • 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_instancesregister_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]数据集中,字典也可以具有任意的自定义数据。当你执行新任务并且需要sklearn不支持的其他信息时,这可能需要自定义数据集字典。在这种情况下,你需要确保下游代码可以处理你的数据,这需要为数据加载器编写一个新的"映射器"(请参阅使用自定义数据加载器(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 MetadataCatalogMetadataCatalog.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设置关键点的数量。你还需要设置Keypoint OKS(http://cocodataset.org/#keypoints-eval)与TEST.KEYPOINT_OKS_SIGMAS一起进行评估。

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

  • 如果你要训练Fast 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/

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文(无广告)。

扫描二维码添加小编↓

detectron2使用自定义的数据集

上一篇:

下一篇: