如果你要使用自定义的数据集,同时还要重写detectron2的数据加载器, 你将需要
注册你的数据集(即告诉detectron2如何获取你的数据集)。
(可选)为你的数据集注册元数据。
接下来,我们详细解释上述两个概念。
该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"与返回数据的函数相关联。在该过程存在之前,注册将一直有效。
该函数可以将数据从其原始格式处理为以下任意一种格式:
Detectron2的标准数据集字典。它可以与detectron2中的许多内置功能一起使用,因此建议使用它。
你的自定义数据集字典。你还可以以自己的格式返回任意字典格式,例如为新任务添加额外的键,然后你还需要在下游正确处理它们。请参阅下面的更多细节。。
对于标准任务(实例检测,实例/语义/全景分割,关键点检测),我们将原始数据集加载到具有类似于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_CLASSES
和MODEL.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」,每日朋友圈更新一篇高质量博文(无广告)。
↓扫描二维码添加小编↓