Пример #1
0
 def _get_dataloader(net, test_dataset, data_shape, batch_size,
                     num_workers, num_devices, args):
     """Get dataloader."""
     if args.meta_arch == 'yolo3':
         width, height = data_shape, data_shape
         val_batchify_fn = Tuple(Stack(), Pad(pad_val=-1))
         test_loader = gluon.data.DataLoader(
             test_dataset.transform(
                 YOLO3DefaultValTransform(width, height)),
             batch_size,
             False,
             batchify_fn=val_batchify_fn,
             last_batch='keep',
             num_workers=num_workers)
         return test_loader
     elif args.meta_arch == 'faster_rcnn':
         """Get faster rcnn dataloader."""
         test_bfn = Tuple(*[Append() for _ in range(3)])
         short = net.short[-1] if isinstance(net.short,
                                             (tuple,
                                              list)) else net.short
         # validation use 1 sample per device
         test_loader = gluon.data.DataLoader(
             test_dataset.transform(
                 FasterRCNNDefaultValTransform(short, net.max_size)),
             num_devices,
             False,
             batchify_fn=test_bfn,
             last_batch='keep',
             num_workers=args.num_workers)
         return test_loader
     else:
         raise NotImplementedError('%s not implemented.' %
                                   args.meta_arch)
Пример #2
0
def get_dataloader(net, val_dataset, batch_size, num_workers):
    """Get dataloader."""
    val_bfn = batchify.Tuple(*[batchify.Append() for _ in range(3)])
    val_loader = mx.gluon.data.DataLoader(
        val_dataset.transform(FasterRCNNDefaultValTransform(net.short, net.max_size)),
        batch_size, False, batchify_fn=val_bfn, last_batch='keep', num_workers=num_workers)
    return val_loader
Пример #3
0
def get_dataloader(net, train_dataset, val_dataset, batch_size, num_workers):
    """Get dataloader."""
    train_bfn = batchify.Tuple(*[batchify.Append() for _ in range(5)])
    val_bfn = batchify.Tuple(*[batchify.Append() for _ in range(3)])
    dtype = 'float16' if cfg.GENERAL.FP16 else 'float32'
    train_dataset = train_dataset.transform(
        FasterRCNNDefaultTrainTransform(net.short,
                                        net.max_size,
                                        net,
                                        dtype=dtype))
    val_dataset = val_dataset.transform(
        FasterRCNNDefaultValTransform(net.short, net.max_size, dtype=dtype))
    train_loader = mx.gluon.data.DataLoader(train_dataset,
                                            batch_size,
                                            True,
                                            batchify_fn=train_bfn,
                                            last_batch='rollover',
                                            num_workers=num_workers,
                                            thread_pool=True)
    val_loader = mx.gluon.data.DataLoader(val_dataset,
                                          batch_size,
                                          False,
                                          batchify_fn=val_bfn,
                                          last_batch='keep',
                                          num_workers=num_workers,
                                          thread_pool=True)
    return train_loader, val_loader
def get_dataloader(net, train_dataset, val_dataset, short, max_size, batch_size, num_workers):
    """Get dataloader."""
    train_bfn = batchify.Tuple(*[batchify.Append() for _ in range(5)])
    train_loader = mx.gluon.data.DataLoader(
        train_dataset.transform(FasterRCNNDefaultTrainTransform(short, max_size, net)),
        batch_size, True, batchify_fn=train_bfn, last_batch='rollover', num_workers=num_workers)
    val_bfn = batchify.Tuple(*[batchify.Append() for _ in range(3)])
    val_loader = mx.gluon.data.DataLoader(
        val_dataset.transform(FasterRCNNDefaultValTransform(short, max_size)),
        batch_size, False, batchify_fn=val_bfn, last_batch='keep', num_workers=num_workers)
    return train_loader, val_loader
Пример #5
0
def get_frcnn_data_loader(val_dataset, net):
    """ load data in batches for frcnn model """

    batch_size = BATCH_SIZE
    val_bfn = batchify.Tuple(*[batchify.Append() for _ in range(3)])
    val_loader = mx.gluon.data.DataLoader(val_dataset.transform(
        FasterRCNNDefaultValTransform(net.short, net.max_size)),
                                          batch_size,
                                          False,
                                          batchify_fn=val_bfn,
                                          last_batch='keep',
                                          num_workers=0)
    return val_loader
Пример #6
0
def get_loader(net, train_dataset, val_dataset, batch_size, args):
    train_transform = FasterRCNNDefaultTrainTransform(net.short, net.max_size, net,
                                                      ashape=net.ashape, multi_stage=args.use_fpn)
    # return images, labels, rpn_cls_targets, rpn_box_targets, rpn_box_masks
    train_batchify_fn = batchify.Tuple(*[batchify.Append() for _ in range(5)])
    train_loader = mx.gluon.data.DataLoader(train_dataset.transform(train_transform),
        batch_size, shuffle=True, batchify_fn=train_batchify_fn, last_batch='rollover')

    short = net.short[-1] if isinstance(net.short, (tuple, list)) else net.short
    val_transform = FasterRCNNDefaultValTransform(short, net.max_size)
    # return to x, y, im_scale
    val_batchify_fn = batchify.Tuple(*[batchify.Append() for _ in range(3)])
    val_loader = mx.gluon.data.DataLoader(val_dataset.transform(val_transform), batch_size, shuffle=False,
                            batchify_fn=val_batchify_fn, last_batch='keep')
    """
    train_loader:
    每个batch为([data1, data2,...], [label, label2,...], [rpn_cls_targets1, rpn_cls_targets2, ...],
    [rpn_box_targets1, rpn_box_targets2, ...], [rpn_box_masks1, rpn_box_masks2, ...])
    
    for data, label, rpn_cls_targets, rpn_box_targets, rpn_box_masks in zip(*train_loader):
        rpn_cls_targets: (1, N)   rpn_box_targets: (1, N, 4)   rpn_box_masks: (1, N, 4)
    
    val_loader:
    每个batch为([data1, data2,...], [label, label2,...], [im_scale1, im_scale2, ...])
    for data, label, im_scale in zip(*val_loader):
        im_scale: (1, 1) 
        但是还没搞清楚im_scale是什么东西 T_T
    
    cls_preds, box_preds, roi, samples, matches, rpn_score, rpn_box, anchors = net(data, gt_box)
    cls_targets, box_targets, box_masks = net.target_generator(roi, samples, matches, gt_label, gt_box)
            
    data:  (1, 3, h, w)
    label: (1, num_obj, 6)
            
    # rpn
    roi: (1, 128, 4)
    samples: (1, 128)
    matches: (1, 128)
            
    rpn_cls_targets: (1, N)                  rpn_score:  (1, N, 1)
    rpn_box_targets: (1, N, 4)               rpn_box:  (1, N, 4)
    rpn_box_masks:   (1, N, 4)
    
    # rcnn
    cls_targets:   (1, 128)                   cls_preds: (1, 128, num_cls + 1)
    box_targets:   (1, 128, num_cls, 4)       box_preds: (1, 128, num_cls, 4)
    rcnn box mask: (1, 128, num_cls, 4)
    """
    return train_loader, val_loader
def get_data_loader(net, train_dataset, val_dataset, batch_size=1):
    """
        get PASCAL-VOC train&val dataloader
     
    :return: 
    """
    train_bfn = batchify.Tuple(*[batchify.Append() for _ in range(5)])

    train_loader = mx.gluon.data.DataLoader(
        train_dataset.transform(FasterRCNNDefaultTrainTransform(net.short, net.max_size, net)),
        batch_size=1, shuffle=True, batchify_fn=train_bfn, last_batch='rollover')
    val_bfn = batchify.Tuple(*[batchify.Append() for _ in range(3)])
    val_loader = mx.gluon.data.DataLoader(
        val_dataset.transform(FasterRCNNDefaultValTransform(net.short, net.max_size)),
        batch_size, False, batchify_fn=val_bfn, last_batch='keep')
    return (train_loader, val_loader)
Пример #8
0
    def __init__(self,
                 root=os.path.join('~', '.mxnet', 'datasets', 'visualgenome'),
                 split='train'):
        super(VGRelation, self).__init__(root)
        self._root = os.path.expanduser(root)
        self._img_path = os.path.join(self._root, 'VG_100K', '{}')

        if split == 'train':
            self._dict_path = os.path.join(self._root,
                                           'rel_annotations_train.json')
        elif split == 'val':
            self._dict_path = os.path.join(self._root,
                                           'rel_annotations_val.json')
        else:
            raise NotImplementedError
        with open(self._dict_path) as f:
            tmp = f.read()
            self._dict = json.loads(tmp)

        self._predicates_path = os.path.join(self._root, 'predicates.json')
        with open(self._predicates_path, 'r') as f:
            tmp = f.read()
            self.rel_classes = json.loads(tmp)
        self.num_rel_classes = len(self.rel_classes) + 1

        self._objects_path = os.path.join(self._root, 'objects.json')
        with open(self._objects_path, 'r') as f:
            tmp = f.read()
            self.obj_classes = json.loads(tmp)
        self.num_obj_classes = len(self.obj_classes)

        if split == 'val':
            self.img_transform = FasterRCNNDefaultValTransform(short=600,
                                                               max_size=1000)
        else:
            self.img_transform = FasterRCNNDefaultTrainTransform(short=600,
                                                                 max_size=1000)
        self.split = split
Пример #9
0
def DogDataLoader(net,
                  root='./stanford_dog_dataset',
                  preload_label=True,
                  batch_size=1,
                  shuffle=True,
                  num_workers=0):
    # dataset
    train_dataset = DogDetection(root=root,
                                 splits='train',
                                 preload_label=preload_label)
    val_dataset = DogDetection(root=root,
                               splits='test',
                               preload_label=preload_label)

    val_metric = VOC07MApMetric(iou_thresh=0.5,
                                class_names=val_dataset.classes)

    train_batchify = batchify.Tuple(*[batchify.Append() for _ in range(5)])
    val_batchify = batchify.Tuple(*[batchify.Append() for _ in range(3)])

    train_dataloader = gluon.data.DataLoader(train_dataset.transform(
        FasterRCNNDefaultTrainTransform(net.short, net.max_size, net)),
                                             batch_size=batch_size,
                                             shuffle=True,
                                             batchify_fn=train_batchify,
                                             last_batch='rollover',
                                             num_workers=num_workers)
    val_dataloader = gluon.data.DataLoader(val_dataset.transform(
        FasterRCNNDefaultValTransform(net.short, net.max_size)),
                                           batch_size=batch_size,
                                           shuffle=False,
                                           batchify_fn=val_batchify,
                                           last_batch='keep',
                                           num_workers=num_workers)

    return train_dataloader, val_dataloader, val_metric
    def get_voc_iterator(rank, num_workers, net, num_shards):
        data_dir = "data-%d" % rank
        try:
            s3_client = boto3.client('s3')
            for file in [
                    'VOCtrainval_06-Nov-2007.tar', 'VOCtest_06-Nov-2007.tar',
                    'VOCtrainval_11-May-2012.tar'
            ]:
                s3_client.download_file(args.s3bucket, f'voc_tars/{file}',
                                        f'/opt/ml/code/{file}')
                with tarfile.open(filename) as tar:
                    tar.extractall(path=path)
        except:
            print('downloading from source')
            download_voc(data_dir)

        input_shape = (1, 256, 256, 3)
        batch_size = args.batch_size

        # might want to replace with mx.io.ImageDetRecordIter, this means you need data in RecordIO format
        #         train_iter = mx.io.MNISTIter(
        #             image="%s/train-images-idx3-ubyte" % data_dir,
        #             label="%s/train-labels-idx1-ubyte" % data_dir,
        #             input_shape=input_shape,
        #             batch_size=batch_size,
        #             shuffle=True,
        #             flat=False,
        #             num_parts=hvd.size(),
        #             part_index=hvd.rank()
        #         )

        train_dataset = gdata.VOCDetection(
            root=f'/opt/ml/code/data-{rank}/VOCdevkit/',
            splits=[(2007, 'trainval'), (2012, 'trainval')])
        val_dataset = gdata.VOCDetection(
            root=f'/opt/ml/code/data-{rank}/VOCdevkit/',
            splits=[(2007, 'test')])
        val_metric = VOC07MApMetric(iou_thresh=0.5,
                                    class_names=val_dataset.classes)
        im_aspect_ratio = [1.] * len(train_dataset)
        train_bfn = FasterRCNNTrainBatchify(net)
        train_sampler = gluoncv.nn.sampler.SplitSortedBucketSampler(
            im_aspect_ratio,
            batch_size,
            num_parts=hvd.size() if args.horovod else 1,
            part_index=hvd.rank() if args.horovod else 0,
            shuffle=True)
        # had issue with multi_stage=True
        train_iter = mx.gluon.data.DataLoader(train_dataset.transform(
            FasterRCNNDefaultTrainTransform(net.short,
                                            net.max_size,
                                            net,
                                            ashape=net.ashape,
                                            multi_stage=False)),
                                              batch_sampler=train_sampler,
                                              batchify_fn=train_bfn,
                                              num_workers=num_workers)

        val_bfn = Tuple(*[Append() for _ in range(3)])
        short = net.short[-1] if isinstance(net.short,
                                            (tuple, list)) else net.short
        # validation use 1 sample per device
        val_iter = mx.gluon.data.DataLoader(val_dataset.transform(
            FasterRCNNDefaultValTransform(short, net.max_size)),
                                            num_shards,
                                            False,
                                            batchify_fn=val_bfn,
                                            last_batch='keep',
                                            num_workers=num_workers)

        return train_iter, val_iter
Пример #11
0
        num_parts=1,
        part_index=0,
        shuffle=True)
    train_loader = mx.gluon.data.DataLoader(
        train_dataset.transform(
            FasterRCNNDefaultTrainTransform(
                net.short,
                net.max_size,
                net,
                ashape=net.ashape,
                multi_stage=cfg["model"]["use_fpn"])),
        batch_sampler=train_sampler,
        batchify_fn=train_bfn,
        num_workers=cfg["dataset"]["num_workers"],
    )

    val_bfn = Tuple(*[Append() for _ in range(3)])
    # short是列表或元组,是为了在训练过程中增加图片大小抖动这一数据增强方式
    short = net.short[-1] if isinstance(net.short,
                                        (tuple, list)) else net.short
    val_loader = mx.gluon.data.DataLoader(
        val_dataset.transform(
            FasterRCNNDefaultValTransform(short, net.max_size)),
        batch_size=len(ctx),  # 每张卡一张图片
        shuffle=False,
        batchify_fn=val_bfn,
        last_batch='keep',
        num_workers=cfg["dataset"]["num_workers"])

    train(net, train_loader, val_loader, eval_metric, ctx, cfg)