1. 磐创AI-开放猫官方网站首页
  2. 系列教程
  3. Detectron2

Detectron2 使用自定义数据加载器 | 五

本文是全系列中第3 / 15篇:Detectron2

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

使用自定义数据加载器

现有Dataloader的工作方式

Detectron2包含一个内置的数据加载管道。如果你需要编写自定义代码,最好了解它的工作原理。

Detectron2提供了两个函数 build_detection_{train,test}_loader (https://detectron2.readthedocs.io/modules/data.html#detectron2.data.build_detection_train_loader) , 它们从给定的配置创建默认的数据加载器。下面是build_detection_{train,test}_loader如何工作:

  1. 它采用注册数据集的名称(例如”coco_2017_train”), 并以轻量级规范格式加载list [dict]代表数据集项。这些数据集项尚未准备好由模型使用(例如,图像未加载到内存,尚未应用随机扩充等)。有关数据集格式和数据集注册的详细信息,请参见数据集(https://detectron2.readthedocs.io/tutorials/datasets.html)。
  2. 此列表中的每个字典都由一个函数(“映射器”)映射:
    • 用户可以通过在中指定”mapper”参数来自定义此映射功能
      build_detection_ {train,test} _loader。默认的映射器是DatasetMapper(https://detectron2.readthedocs.io/modules/data.html#detectron2.data.DatasetMapper)。
    • 该函数的输出格式可以是任意的,只要此数据加载器的使用者(通常是模型)可以接受即可。批处理后,默认映射器的输出遵循文档中记录的默认模型输入格式使用模型(https://detectron2.readthedocs.io/tutorials/models.html#model-input-format)。
    • 映射器的作用是将数据集项目的轻量级规范表示转换为可供模型使用的格式(包括读取图像,执行随机数据增强并转换为割炬张量)如果要对数据执行自定义转换,则通常需要自定义映射器。
  3. 映射器的输出被批处理(简单地放入列表中)。
  4. 此批处理的数据是数据加载器的输出。通常,它也是
    model.forward()

编写自定义数据加载器

在大多数情况下,将不同的”映射器”与build_detection_ {train,test} _loader(mapper =)配合使用自定义数据加载。例如,如果你想将所有图像调整为固定大小以进行Mask R-CNN训练,请编写以下代码:

from detectron2.data import build_detection_train_loader
from detectron2.data import transforms as T
from detectron2.data import detection_utils as utils

def mapper(dataset_dict):
    dataset_dict = copy.deepcopy(dataset_dict)  # 它将被下面的代码修改
    image = utils.read_image(dataset_dict["file_name"], format="BGR")
    image, transforms = T.apply_transform_gens([T.Resize((800, 800))], image)
    dataset_dict["image"] = torch.as_tensor(image.transpose(2, 0, 1).astype("float32"))

    annos = [
        utils.transform_instance_annotations(obj, transforms, image.shape[:2])
        for obj in dataset_dict.pop("annotations")
        if obj.get("iscrowd", 0) == 0
    ]
    instances = utils.annotations_to_instances(annos, image.shape[:2])
    dataset_dict["instances"] = utils.filter_empty_instances(instances)
    return dataset_dict

data_loader = build_detection_train_loader(cfg, mapper=mapper)
#使用此数据加载器代替默认设置

有关详细信息,请参见detectron2.data的API文档(https://detectron2.readthedocs.io/modules/data.html)

如果你不仅要更改映射器(例如,编写不同的采样或批处理逻辑),还可以编写自己的数据加载器。数据加载器只是一个python迭代器,它产生模型接受的格式(https://detectron2.readthedocs.io/tutorials/models.html)。你可以使用任何喜欢的工具来实现它。

使用自定义数据加载器

如果使用DefaultTrainer(https://detectron2.readthedocs.io/modules/engine.html#detectron2.engine.defaults.DefaultTrainer),则可以覆盖其build_{train,test}__loader方法以使用自己的数据加载器。有关 示例,请参见densitypose数据加载器(https://github.com/facebookresearch/detectron2/blob/master/projects/DensePose/train_net.py)。

如果你编写自己的训练循环, 则可以轻松插入数据加载器。

原文链接:https://detectron2.readthedocs.io/tutorials/data_loading.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%e5%8a%a0%e8%bd%bd%e5%99%a8-%e4%ba%94/

发表评论

登录后才能评论

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息