以PASCAL VOC为训练数据集
数据读取流程
- 指定VOC数据集根目录
- 根据VOC目录,获取’ImageSets/Main/trainval.txt,trainval里面是各个图片的文件名称(不带后缀)
001337
001341
001343
001345
001346
001348
001350
001352
001360
001361
001362
001364
001365
001371
- 在
__getitem__
中,获取每一张图片对应的原图,所有的标注框,每个标注框对应的分类id,和是否为困难样本
主要逻辑是,根据trainval的图片id,也就是图片名称,到图片目录下Annotations和JPEGImages目录下,分别解析xml文件和读取图片文件
bbox:
[[ 31. 262. 294. 499.]
[ 35. 0. 298. 234.]]
label:
[18 18]
difficult:
[0 0]
数据读取对应的代码
源码主要分为两个类,
- 一个是Dataset类,负责加载和解析VOC数据
- 一个是DataLoader类,负责通过Dataset批量加载数据
Dataset
主要完成以下工作
- 数据加载,和标注信息解析
- 图片缩放
- 图片归一化,mean和std归一化处理
#opt是配置项,配置数据目录,格式为VOC数据格式
dataset = Dataset(opt)
- 首先通过调用VOCBboxDataset的get_example方法,解析各个图片的标注信息
class Dataset:
def __init__(self, opt):
self.opt = opt
self.db = VOCBboxDataset(opt.voc_data_dir)
self.tsf = Transform(opt.min_size, opt.max_size)
def __getitem__(self, idx):
#traceback.print_stack()
ori_img, bbox, label, difficult, id_ = self.db.get_example(idx)
img, bbox, label, scale = self.tsf((ori_img, bbox, label))
# TODO: check whose stride is negative to fix this instead copy all
# some of the strides of a given numpy array are negative.
return img.copy(), bbox.copy(), label.copy(