Detectron2 使用自定义数据加载器 | 五
本文是全系列中第3 / 15篇:Detectron2
- Detectron2 使用自定义数据集 | 四
- Detectron2 基准测试 | 十二
- Detectron2 使用自定义数据加载器 | 五
- Detectron2 与其他库的兼容性 | 十三
- Detectron2 使用模型 | 六
- Detectron2 API 之 checkpoint | 十四
- Detectron2 编写模型 | 七
- Detectron2 API 之 config | 十五
- Detectron2 开始训练 | 八
- Detectron2 安装 | 一
- Detectron2 进行评估 | 九
- Detectron2 入门 | 二
- Detectron2 配置 | 十
- Detectron2 扩展默认值 | 三
- 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
如何工作:
- 它采用注册数据集的名称(例如”coco_2017_train”), 并以轻量级规范格式加载
list [dict]
代表数据集项。这些数据集项尚未准备好由模型使用(例如,图像未加载到内存,尚未应用随机扩充等)。有关数据集格式和数据集注册的详细信息,请参见数据集(https://detectron2.readthedocs.io/tutorials/datasets.html)。 - 此列表中的每个字典都由一个函数(“映射器”)映射:
- 用户可以通过在中指定”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)。
- 映射器的作用是将数据集项目的轻量级规范表示转换为可供模型使用的格式(包括读取图像,执行随机数据增强并转换为割炬张量)如果要对数据执行自定义转换,则通常需要自定义映射器。
- 用户可以通过在中指定”mapper”参数来自定义此映射功能
- 映射器的输出被批处理(简单地放入列表中)。
- 此批处理的数据是数据加载器的输出。通常,它也是
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/