mmdetection中dataloader和dataset——决定如何读取数据并输入网络中
1、dataset和dataloader的区别
dataset是决定如何读入训练数据,如何通过训练图片的路径来找到并读取这种图片,读取图片后要进行什么操作,这都是dataset控制的,每个训练的数据集,都会写一个自己的dataset,如coco.py ,voc.py等,用来展示如何读数取这个数据集的数据。dataloader:主要是把dataset读到的图片,按照一定顺序排起来,就像一条管道,一次输入一个batchsize的数据进入网络。
dataset的 输出是dataloader的输入。
2、dataset-voc.py
2.1 PASCALVOCDATASET类
继承了 CustomDataset类,CustomDataset类是每个数据集类都必须继承的,因为CustomDataset类里面包含了数据集类都一定要用到的操作,所以我们无论是初始化CocoDataset还是VocDataset等等,都一定会包含CustomData类中的所有方法。
2.2 getitem(idx) 的作用:
该函数控制dataset这个类怎么输出要训练的数据,dataset的输出其实就是__getitem__(idx) 的输出(类似nn.moudle类中forward函数)。
idx表示训练数据的索引,dataloader就按照这个自动生成的索引顺序来输出图片到网络中训练。getitem(idx)返回的图片数据输入到dataloader。
在__getitem__(idx)中就完成读入图片、读入标注、resize、归一化、padding等等
3、初始化dataset——build_dataset()
根据传入build_dataset()类中的数据集名字来初始化数据集对应,构建全局变量DATASETS。dataset主要由build_from_cfg()产生,根据传入的cfg里的数据集信息从dataset里面找到对应的数据集类别,然后初始化。
(比如cfg里面有pascalvoc就初始化pascalvoc,在小样本目标检测里面,如果是meta训练的话,判断cfg里是base数据集还是novel数据集,再初始化对应的数据集类别等)
4、创建data_loader
dataloader主要通让训练集按照一定顺序来读取,在训练过程中通过run方法来利用dataloader参与到训练中。这一部分在训练过程中再学习。
参考链接:https://blog.youkuaiyun.com/u014453898/article/details/107701094
参考链接:https://blog.youkuaiyun.com/u014453898/article/details/106714325