dataloader为模型提供数据,通常是从dataset中处理少量模型需要的信息,然后将它们传入模型。dataloader就是简单的Python迭代器,用于产生model能够接收的数据格式。
1、detectron2中现有的dataloader如何工作
两个函数:build_detection_{train,test}loader
函数作用:从给定的配置文件里面创建默认的data loader
函数工作流程:
1、从注册的数据集中load list[dict]数据,数据用轻量的格式表示。但是现在数据不是被输入内存,不是输入模型中。
2、list中的每一个dict都由mapper函数处理:
(1)mapper函数可以通过具体化build_detection{train,test}_loader中的mapper来自定义这个函数,默认的mapper函数是DatasetMapper
(2)loader的输出格式随意,只要模型接受即可。loader对数据批处理以后,默认输出使用model中记录的默认模型输入格式
(3)loader的作用就是将从数据集中获取的轻量级格式变换为model需要的数据格式。
3、mapper输出以后直接成为一个batch(简单存在list)
4、成为batch以后的数据直接输入到model.forward
2、自定义dataloader
build_detection_{train,test}_loader(mapper=)重写mapper函数
比如重写mapper中把所有图片都rezise成固定大小:
import detectron2.data.transforms as T
from detectron2.data import DatasetMapper # the default mapper
dataloader = build_detection_train_loader(cfg,
mapper=DatasetMapper(cfg, is_train=True, augmentations=[
T.Resize((800, 800))
]))
# use this dataloader instead of the default
如果默认mapper函数里面没有需要的功能,可以参考一下函数来写:
from detectron2.data import detection_utils as utils
# Show how to implement a minimal mapper, similar to the default DatasetMapper
def mapper(dataset_dict):
dataset_dict = copy.deepcopy(dataset_dict) # it will be modified by code below
# can use other ways to read image
image = utils.read_image(dataset_dict["file_name"], format="BGR")
# See "Data Augmentation" tutorial for details usage
auginput = T.AugInput(image)
transform = T.Resize((800, 800))(auginput)
image = torch.from_numpy(auginput.image.transpose(2, 0, 1))
annos = [
utils.transform_instance_annotations(annotation, [transform], image.shape[1:])
for annotation in dataset_dict.pop("annotations")
]
return {
# create the format that the model expects
"image": image,
"instances": utils.annotations_to_instances(annos, image.shape[1:])
}
dataloader = build_detection_train_loader(cfg, mapper=mapper)
如果不止想要改mapper,只用build_detection_train_loader来改是不够的,那就需要重写dataloader。可以参见API documentation of detectron2.data
参考链接:detectron2——dataloader