Detectron2 使用自定义数据集 | 四
本文是全系列中第1 / 15篇:Detectron2
- Detectron2 使用自定义数据集 | 四
- Detectron2 基准测试 | 十二
- Detectron2 使用自定义数据加载器 | 五
- Detectron2 与其他库的兼容性 | 十三
- Detectron2 使用模型 | 六
- Detectron2 API 之 checkpoint | 十四
- Detectron2 编写模型 | 七
- Detectron2 API 之 config | 十五
- Detectron2 开始训练 | 八
- Detectron2 安装 | 一
- Detectron2 进行评估 | 九
- Detectron2 入门 | 二
- Detectron2 配置 | 十
- Detectron2 扩展默认值 | 三
- Detectron2 部署 | 十一
作者|facebookresearch
编译|Flin
来源|Github
使用自定义数据集
如果你要使用自定义数据集,同时还要重用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 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_CLASSES
和MODEL.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
原创文章,作者:磐石,如若转载,请注明出处:https://panchuang.net/2020/05/31/detectron2-%e4%bd%bf%e7%94%a8%e8%87%aa%e5%ae%9a%e4%b9%89%e6%95%b0%e6%8d%ae%e9%9b%86-%e5%9b%9b/