Detectron2 中data的部分和maskrcnn_benchmark中的不太一样。
首先,为了实现数据集的调用与实现的分离,在catalog.py
中实现了DataCatalog
和MetadataCatalog
两个类,分别存储了各种数据的属性,调用接口等。其中由DataCatalog.get(dataset_name')
返回数据列表,并由comom.py
中实现的DatasetFromList
生成data.Dataset
。
DataCatalog
和MetadataCatalog
两个类使用了类属性存储数据集属性与数据,用于创建data.Dataset
,在整个detectron2中可以作为全局变量使用。
其中DataCatalog
中维护了一个_REGISTERED
类属性,是一个dict{dataset_name:func}
,用以支持字符串访问并获得数据集的数据,例如可以通过DatasetCatalog.get('coco_2017_train')
调用dataset/register_coco.py
文件中的load_coco_json()
函数地址。
MetadataCatalog
类维护了一个'_NAME_TO_META类属性,是一个
list[Metadata]。 其中
Metadata实例中存储了数据集的一些属性,所有数据集的公用属性有
class_names,
dataset_id_to_contiguous_id和
stuff_class_names,分别是类别名称,原数据集类别标签到训练用连续标签的映射和相对于目标的环境标签。 并不是所有数据集都有以上三种属性,而且每个数据集会有其他属性,例如coco数据集中会用到
image_root和
json_file`等其他属性。
总之,DataCatalog
和MetadataCatalog
两个类实现了torch.utils.data.Dataset
的创建与具体数据集读取的分,提供了使用字符串创建Dataset
和DataLoader
的方法。
具体Dataset
从DatasetFromLists
创建,然后经过MapDataset
和Sampler
等得到DataLoader
。