现有的数据读取器是怎么工作的呢?
Detectron2包含一个建好的数据读取管道,很容易明白其工作原理,也方便自己重写一个数据读取器。
Detectron2提供两个函数,build_detection_{train,test}_loader
从给定的config文件中创建数据读取器,下面是它的原理:
-
输入数据集名称,如"coco_2017_train",以一个轻量级的,标准的统一接口将数据读取为list[dict]。此时数据实际上还没有开始被模型使用,图片还没有读到内存中,随机的数据增强也没做。可以从之前的dataset教程中查看数据集的相关使用。
-
list中的每个字典对象都是mapper函数映射而来。
- 用户可以通过指定build_detection_{train,test}_loader中的mapper参数来标准化mapping函数,,默认的mapper是DatasetMapper。
- 输出格式没有限制,只要能被数据消费者使用,这里的消费者一般指模型。
- mapper的作用是将每一个轻量、标准的数据表示方式转化成模型可以识别的格式,比如,读取图像,随机做增强。默认mapper的输出解释如下:
-
mapper的输出是batch形式,通常是一个list。
-
一个batch的数据是数据读取器的输出,典型的,是model.forward()的输入。
写数据读取器
在现有数据读取器上实现一个新的mapper通常是我们需要的。
如果你想做些不一样的,比如用自己的数据或者不同的batch逻辑,可以自己写数据读取器。数据读取器是一个简单的迭代器,只要组织成模型需要的输入形式,可以使用任何你喜欢的工具。
使用一般的数据读取器
如果用的是DefaultTrainer,可以重写build_{train,test}__loader方法来使用自己的数据读取器。参见densepose的例子。
如果自己写训练逻辑,可以简单的使用自己的数据读取器。