コード例 #1
0
def get_dataset(data_cfg):
    """
    Get dataset.
    :param data_cfg: Data config.
    :return: Object: instantiated dataset object of data_cfg['type']
    """
    if data_cfg['type'] == 'RepeatDataset':
        return RepeatDataset(get_dataset(data_cfg['dataset']),
                             data_cfg['times'])

    if isinstance(data_cfg['ann_file'], (list, tuple)):
        ann_files = data_cfg['ann_file']
        num_dset = len(ann_files)
    else:
        ann_files = [data_cfg['ann_file']]
        num_dset = 1

    if 'proposal_file' in data_cfg.keys():
        if isinstance(data_cfg['proposal_file'], (list, tuple)):
            proposal_files = data_cfg['proposal_file']
        else:
            proposal_files = [data_cfg['proposal_file']]
    else:
        proposal_files = [None] * num_dset
    assert len(proposal_files) == num_dset

    if isinstance(data_cfg['img_prefix'], (list, tuple)):
        img_prefixes = data_cfg['img_prefix']
    else:
        img_prefixes = [data_cfg['img_prefix']] * num_dset
    assert len(img_prefixes) == num_dset

    # generate dataset
    dsets = []
    for i in range(num_dset):
        data_info = copy.deepcopy(data_cfg)
        data_info['ann_file'] = ann_files[i]
        data_info['proposal_file'] = proposal_files[i]
        data_info['img_prefix'] = img_prefixes[i]
        dset = obj_from_dict(data_info, datasets)
        dsets.append(dset)
    if len(dsets) > 1:
        dset = ConcatDataset(dsets)
    else:
        dset = dsets[0]
    return dset
コード例 #2
0
def main():
    args = parse_args()

    if args.out is not None and not args.out.endswith(('.pkl', '.pickle')):
        raise ValueError('The output file must be a pkl file.')

    cfg = mmcv.Config.fromfile(args.config)
    # set cudnn_benchmark
    if cfg.get('cudnn_benchmark', False):
        torch.backends.cudnn.benchmark = True
    cfg.model.pretrained = None
    cfg.data.test.test_mode = True

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))
    assert args.gpus == 1
    model = build_detector(
        cfg.model, train_cfg=None, test_cfg=cfg.test_cfg)
    load_checkpoint(model, args.checkpoint)
    model = MMDataParallel(model, device_ids=[0])

    data_loader = build_dataloader(
        dataset,
        imgs_per_gpu=1,
        workers_per_gpu=0,
        num_gpus=1,
        dist=False,
        shuffle=False)
    if args.load_result:
        outputs = mmcv.load(args.out)
    else:
        outputs = single_test(model, data_loader, args.show, save_path=args.save_path)

    if args.out:
        if not args.load_result:
          print('writing results to {}'.format(args.out))
        
          mmcv.dump(outputs, args.out)
        eval_types = args.eval
        if eval_types:
            print('Starting evaluate {}'.format(' and '.join(eval_types)))
            if not isinstance(outputs[0], dict):
                result_file = args.out + '.json'
                results2json_videoseg(dataset, outputs, result_file)
                ytvos_eval(result_file, eval_types, dataset.ytvos)
            else:
                NotImplemented
コード例 #3
0
def _non_dist_train(model, dataset_names, cfg, validate=False, **kwargs):

    # prepare data loaders
    data_loaders = [
        build_dataloader(
            dataset,
            cfg.data.tasks_per_gpu,
            cfg.data.workers_per_gpu,
            cfg.gpus,
            dist=False,
            customized_sampler=not dataset.test_mode)
        for dataset in dataset_names
    ]

    # put model on gpus
    model = MMDataParallel(model, device_ids=range(cfg.gpus)).cuda()

    # build runner
    runner = Runner(model, batch_processors[cfg.batch_processor_type],
                    cfg.optimizer, cfg.work_dir, cfg.log_level)
    runner.register_training_hooks(cfg.lr_config, cfg.optimizer_config,
                                   cfg.checkpoint_config, cfg.log_config)

    # validate, if any
    if validate:
        hook_dataset = obj_from_dict(cfg.data.test, datasets)
        loader = build_dataloader(
            hook_dataset,
            cfg.data.tasks_per_gpu // cfg.data.tasks_per_gpu,
            max(1, cfg.data.workers_per_gpu // cfg.data.tasks_per_gpu),
            cfg.gpus,
            dist=False,
            customized_sampler=False,
            shuffle=False)
        runner.register_hook(
            getattr(sys.modules[__name__],
                    cfg.eval_hook['type'])(loader, **cfg.eval_hook['args']))

    # resume
    if cfg.resume_from:
        runner.resume(cfg.resume_from)
    elif cfg.load_from:
        runner.load_checkpoint(cfg.load_from)

    runner.run(data_loaders, cfg.workflow, cfg.total_epochs, **kwargs)
コード例 #4
0
def main():
    args = parse_args()

    if args.out is not None and not args.out.endswith(('.pkl', '.pickle')):
        raise ValueError('The output file must be a pkl file.')

    cfg = mmcv.Config.fromfile(args.config)
    # set cudnn_benchmark
    if cfg.get('cudnn_benchmark', False):
        torch.backends.cudnn.benchmark = True
    cfg.model.pretrained = None
    cfg.data.test.test_mode = True

    if args.ann_file is not None:
        cfg.data.test.ann_file = args.ann_file
    if args.img_prefix is not None:
        cfg.data.test.img_prefix = args.img_prefix

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))
    if args.gpus == 1:
        model = build_detector(cfg.model, train_cfg=None, test_cfg=cfg.test_cfg)
        load_checkpoint(model, args.checkpoint)
        model = MMDataParallel(model, device_ids=[0])

        data_loader = build_dataloader(
            dataset, imgs_per_gpu=1, workers_per_gpu=cfg.data.workers_per_gpu, num_gpus=1, dist=False, shuffle=False
        )
        outputs = single_test(model, data_loader, args.show)
    else:
        model_args = cfg.model.copy()
        model_args.update(train_cfg=None, test_cfg=cfg.test_cfg)
        model_type = getattr(detectors, model_args.pop('type'))
        outputs = parallel_test(
            model_type,
            model_args,
            args.checkpoint,
            dataset,
            _data_func,
            range(args.gpus),
            workers_per_gpu=args.proc_per_gpu
        )

    if args.out:
        print('writing results to {}'.format(args.out))
        mmcv.dump(outputs, args.out)
コード例 #5
0
ファイル: utils.py プロジェクト: amyZhoucc/readAIpaper
def get_dataset(data_cfg):
    if data_cfg['type'] == 'RepeatDataset':
        return RepeatDataset(
            get_dataset(data_cfg['dataset']), data_cfg['times'])
    #获得标记文件 annotations,eg:ann_file=data_root + 'annotations/instances_train2017.json'
    #判断是否是一个list,则说明有多个配置文件(有多个数据集共同训练),num_dset=num
    if isinstance(data_cfg['ann_file'], (list, tuple)):
        ann_files = data_cfg['ann_file']
        num_dset = len(ann_files)
    #如果不是一个list,就是一个string,就一个数据集,num_dset=1
    else:
        ann_files = [data_cfg['ann_file']]
        num_dset = 1

    #如果data_cfg存在proposal_file字段
    if 'proposal_file' in data_cfg.keys():
        if isinstance(data_cfg['proposal_file'], (list, tuple)):
            proposal_files = data_cfg['proposal_file']
        else:
            proposal_files = [data_cfg['proposal_file']]
    else:
        proposal_files = [None] * num_dset
    assert len(proposal_files) == num_dset
    #获得图片的前缀字段,默认传递的是一个list:["prefix1....","prefix2...."]
    #如果是多个数据集,就是一个list
    if isinstance(data_cfg['img_prefix'], (list, tuple)):
        img_prefixes = data_cfg['img_prefix']
    else:
        img_prefixes = [data_cfg['img_prefix']] * num_dset
    assert len(img_prefixes) == num_dset

    dsets = []
    for i in range(num_dset):
        #深度拷贝
        data_info = copy.deepcopy(data_cfg)
        data_info['ann_file'] = ann_files[i]
        data_info['proposal_file'] = proposal_files[i]
        data_info['img_prefix'] = img_prefixes[i]
        dset = obj_from_dict(data_info, datasets)
        dsets.append(dset)
    if len(dsets) > 1:
        dset = ConcatDataset(dsets)
    else:
        dset = dsets[0]
    return dset
コード例 #6
0
def get_dataset(data_cfg):
    if data_cfg['type'] == 'RepeatDataset':
        return RepeatDataset(get_dataset(data_cfg['dataset']),
                             data_cfg['times'])  # get repeat dataset

    if isinstance(data_cfg['ann_file'], (list, tuple)):
        ann_files = data_cfg['ann_file']
        num_dset = len(ann_files)
    else:
        ann_files = [data_cfg['ann_file']]
        num_dset = 1

    if 'proposal_file' in data_cfg.keys():  # if have proposal file,then get it
        if isinstance(data_cfg['proposal_file'], (list, tuple)):
            proposal_files = data_cfg['proposal_file']
        else:
            proposal_files = [data_cfg['proposal_file']]
    else:
        proposal_files = [None] * num_dset
    assert len(proposal_files) == num_dset

    if isinstance(data_cfg['img_prefix'],
                  (list, tuple)):  # setting image prefix
        img_prefixes = data_cfg['img_prefix']
    else:
        img_prefixes = [data_cfg['img_prefix']] * num_dset
    assert len(img_prefixes) == num_dset

    dsets = []
    for i in range(num_dset):
        data_info = copy.deepcopy(
            data_cfg)  # deep copy, generate a new object have same content.
        data_info['ann_file'] = ann_files[i]
        data_info['proposal_file'] = proposal_files[i]
        data_info['img_prefix'] = img_prefixes[i]
        dset = obj_from_dict(
            data_info, datasets
        )  # return a specific Dataset class e.g VOCDataset from__init__.py
        dsets.append(dset)
    if len(dsets) > 1:
        dset = ConcatDataset(dsets)
    else:
        dset = dsets[0]
    return dset
コード例 #7
0
def main():
    configs = [
        # '../../configs/kaist/mul_faster_rcnn_v16_fpn_add_kaist.py',
        '../../configs/kaist/cross_faster_rcnn_v16_fpn_cross_kaist.py',
    ]
    for config in configs:
        # load dataset
        cfg = mmcv.Config.fromfile(config)
        cfg.model.pretrained = None
        cfg.data.test.test_mode = True

        temp_file = '/media/' + getpass.getuser(
        ) + '/Data/DoubleCircle/temp/temp.txt'
        fo = open(temp_file, 'w+')

        str_write = cfg.work_dir.replace(
            '../..', ('/media/' + getpass.getuser() +
                      '/Data/DoubleCircle/project/mmdetection/mmdetection'))
        fo.write(str_write)
        fo.close()

        dataset = obj_from_dict(cfg.data.val, datasets, dict(test_mode=True))
        # load model
        checkpoint_file = osp.join(cfg.work_dir, 'epoch_1.pth')
        model = build_detector(cfg.model,
                               train_cfg=None,
                               test_cfg=cfg.test_cfg)
        load_checkpoint(model, checkpoint_file)
        model = MMDataParallel(model, device_ids=[0])
        # dataloader
        data_loader = build_dataloader(
            dataset,
            imgs_per_gpu=1,
            workers_per_gpu=cfg.data.workers_per_gpu,
            num_gpus=1,
            dist=False,
            shuffle=False)
        outputs = single_test(model, data_loader, False)
        if 'caltech' in config:
            eval_caltech_mr()
        if 'kaist' in config:
            eval_kaist_mr()
        if 'cvc' in config:
            eval_cvc_mr()
コード例 #8
0
def main():

    args = parse_args()

    if args.out is not None and not args.out.endswith(('.pkl', '.pickle')):
        raise ValueError('The output file must be a pkl file.')

    cfg = mmcv.Config.fromfile(args.config)

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))

    rgb_results = args.rgb  # "/home/lixun/Desktop/HAR/mmaction/work_dirs/predictions_hmdb51_split1/rgb.pkl"
    flow_results = args.flow  #  "/home/lixun/Desktop/HAR/mmaction/work_dirs/predictions_hmdb51_split1/flow.pkl"
    outputs_rgb = mmcv.load(rgb_results)
    outputs_flow = mmcv.load(flow_results)

    outputs = [
        outputs_rgb[i] + outputs_flow[i] for i in range(len(outputs_rgb))
    ]

    if args.out:
        print('writing results to {}'.format(args.out))
        mmcv.dump(outputs, args.out)

    gt_labels = []
    for i in range(len(dataset)):
        ann = dataset.get_ann_info(i)
        gt_labels.append(ann['label'])

    if args.use_softmax:
        print("Averaging score over {} clips with softmax".format(
            outputs[0].shape[0]))
        results = [softmax(res, dim=1).mean(axis=0) for res in outputs]
    else:
        print("Averaging score over {} clips without softmax (ie, raw)".format(
            outputs[0].shape[0]))
        results = [res.mean(axis=0) for res in outputs]
    top1, top5 = top_k_accuracy(results, gt_labels, k=(1, 5))
    mean_acc = mean_class_accuracy(results, gt_labels)

    print("Mean Class Accuracy = {:.02f}".format(mean_acc * 100))
    print("Top-1 Accuracy = {:.02f}".format(top1 * 100))
    print("Top-5 Accuracy = {:.02f}".format(top5 * 100))
コード例 #9
0
def main():
    args = parse_args()

    cfg = Config.fromfile(args.config)
    # set num_classes
    cfg.model.bbox_head['num_classes'] = len(
        load_classes(cfg.data_root + 'ocr.names')) + 1
    print('num_classes: %d' % (cfg.model.bbox_head['num_classes']))
    # update configs according to CLI args
    if args.work_dir is not None:
        cfg.work_dir = args.work_dir
    cfg.gpus = args.gpus
    if cfg.checkpoint_config is not None:
        # save mmdet version in checkpoints as meta data
        cfg.checkpoint_config.meta = dict(mmdet_version=__version__,
                                          config=cfg.text)

    # init distributed env first, since logger depends on the dist info.
    if args.launcher == 'none':
        distributed = False
    else:
        distributed = True
        init_dist(args.launcher, **cfg.dist_params)

    # init logger before other steps
    logger = get_root_logger(cfg.log_level)
    logger.info('Distributed training: {}'.format(distributed))

    # set random seeds
    if args.seed is not None:
        logger.info('Set random seed to {}'.format(args.seed))
        set_random_seed(args.seed)

    model = build_detector(cfg.model,
                           train_cfg=cfg.train_cfg,
                           test_cfg=cfg.test_cfg)
    train_dataset = obj_from_dict(cfg.data.train, datasets)
    train_detector(model,
                   train_dataset,
                   cfg,
                   distributed=distributed,
                   validate=args.validate,
                   logger=logger)
コード例 #10
0
ファイル: utils.py プロジェクト: wangshaobobetter/Seodore
def get_dataset(data_cfg):
    if data_cfg['type'] == 'RepeatDataset':
        return RepeatDataset(get_dataset(data_cfg['dataset']),
                             data_cfg['times'])

    if isinstance(data_cfg['ann_file'], (list, tuple)):
        ann_files = data_cfg['ann_file']
        num_dset = len(ann_files)
    else:
        ann_files = [data_cfg['ann_file']]
        num_dset = 1

    if 'proposal_file' in data_cfg.keys():
        if isinstance(data_cfg['proposal_file'], (list, tuple)):
            proposal_files = data_cfg['proposal_file']
        else:
            proposal_files = [data_cfg['proposal_file']]
    else:
        proposal_files = [None] * num_dset
    assert len(proposal_files) == num_dset

    if isinstance(data_cfg['img_prefix'], (list, tuple)):
        img_prefixes = data_cfg['img_prefix']
    else:
        img_prefixes = [data_cfg['img_prefix']] * num_dset
    assert len(img_prefixes) == num_dset

    dsets = []
    dataset_dicts = dict()

    for i in range(num_dset):
        data_info = copy.deepcopy(data_cfg)
        data_info['ann_file'] = ann_files[i]
        data_info['proposal_file'] = proposal_files[i]
        data_info['img_prefix'] = img_prefixes[i]
        dset = obj_from_dict(data_info, datasets)
        dataset_dicts.update(dset.get_anns())
        dsets.append(dset)
    if len(dsets) > 1:
        dset = ConcatDataset(dsets)
    else:
        dset = dsets[0]
    return dset, dataset_dicts
コード例 #11
0
def test_dist_eval_hook_epoch():
    with pytest.raises(TypeError):
        test_dataset = ExampleModel()
        data_loader = [
            DataLoader(test_dataset,
                       batch_size=1,
                       sampler=None,
                       num_worker=0,
                       shuffle=False)
        ]
        DistEvalHook(data_loader)

    test_dataset = ExampleDataset()
    test_dataset.evaluate = MagicMock(return_value=dict(test='success'))
    loader = DataLoader(test_dataset, batch_size=1)
    model = ExampleModel()
    data_loader = DataLoader(test_dataset,
                             batch_size=1,
                             sampler=None,
                             num_workers=0,
                             shuffle=False)
    optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)
    optimizer = obj_from_dict(optim_cfg, torch.optim,
                              dict(params=model.parameters()))

    # test DistEvalHook
    with tempfile.TemporaryDirectory() as tmpdir:
        if use_mmcv_hook:
            p = patch('mmcv.engine.multi_gpu_test', multi_gpu_test)
            p.start()
        eval_hook = DistEvalHook(data_loader, by_epoch=True, interval=2)
        runner = mmcv.runner.EpochBasedRunner(model=model,
                                              optimizer=optimizer,
                                              work_dir=tmpdir,
                                              logger=logging.getLogger(),
                                              max_epochs=2)
        runner.register_hook(eval_hook)
        runner.run([loader], [('train', 1)])
        test_dataset.evaluate.assert_called_with([torch.tensor([1])],
                                                 logger=runner.logger)
        if use_mmcv_hook:
            p.stop()
コード例 #12
0
ファイル: utils.py プロジェクト: open-mmIab/mmdetection
def get_dataset(data_cfg):
    if data_cfg["type"] == "RepeatDataset":
        return RepeatDataset(
            get_dataset(data_cfg["dataset"]), data_cfg["times"]
        )

    if isinstance(data_cfg["ann_file"], (list, tuple)):
        ann_files = data_cfg["ann_file"]
        num_dset = len(ann_files)
    else:
        ann_files = [data_cfg["ann_file"]]
        num_dset = 1

    if "proposal_file" in data_cfg.keys():
        if isinstance(data_cfg["proposal_file"], (list, tuple)):
            proposal_files = data_cfg["proposal_file"]
        else:
            proposal_files = [data_cfg["proposal_file"]]
    else:
        proposal_files = [None] * num_dset
    assert len(proposal_files) == num_dset

    if isinstance(data_cfg["img_prefix"], (list, tuple)):
        img_prefixes = data_cfg["img_prefix"]
    else:
        img_prefixes = [data_cfg["img_prefix"]] * num_dset
    assert len(img_prefixes) == num_dset

    dsets = []
    for i in range(num_dset):
        data_info = copy.deepcopy(data_cfg)
        data_info["ann_file"] = ann_files[i]
        data_info["proposal_file"] = proposal_files[i]
        data_info["img_prefix"] = img_prefixes[i]
        dset = obj_from_dict(data_info, datasets)
        dsets.append(dset)
    if len(dsets) > 1:
        dset = ConcatDataset(dsets)
    else:
        dset = dsets[0]
    return dset
コード例 #13
0
ファイル: utils.py プロジェクト: yaozy15/mmaction
def get_untrimmed_dataset(data_cfg):
    if isinstance(data_cfg['ann_file'], (list, tuple)):
        ann_files = data_cfg['ann_file']
        num_dset = len(ann_files)
    else:
        ann_files = [data_cfg['ann_file']]
        num_dset = 1

    if 'proposal_file' in data_cfg.keys():
        if isinstance(data_cfg['proposal_file'], (list, tuple)):
            proposal_files = data_cfg['proposal_file']
        else:
            proposal_files = [data_cfg['proposal_file']]
    else:
        proposal_files = [None] * num_dset
    assert len(proposal_files) == num_dset

    if isinstance(data_cfg['img_prefix'], (list, tuple)):
        img_prefixes = data_cfg['img_prefix']
    else:
        img_prefixes = [data_cfg['img_prefix']]
    assert len(img_prefixes) == num_dset

    dsets = []
    for i in range(num_dset):
        data_info = copy.deepcopy(data_cfg)
        data_info['ann_file'] = ann_files[i]
        data_info['proposal_file'] = proposal_files[i]
        data_info['img_prefix'] = img_prefixes[i]
        dset = obj_from_dict(data_info, datasets)
        dsets.append(dset)

    if len(dsets) > 1:
        raise ValueError("Not implemented yet")
    else:
        dset = dsets[0]

    return dset
コード例 #14
0
def main():
    args = parse_args()

    cfg = mmcv.Config.fromfile(args.config)
    cfg.model.pretrained = None
    cfg.data.test.test_mode = True
    # change nms_iou
    if args.nms_iou != 0:
        cfg.test_cfg['rcnn']['nms']['iou_thr'] = args.nms_iou
    if args.max_per_img != 0:
        cfg.test_cfg['rcnn']['max_per_img'] = args.max_per_img

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))
    if args.gpus == 1:
        model = build_detector(cfg.model, train_cfg=None, test_cfg=cfg.test_cfg)
        load_checkpoint(model, args.checkpoint)
        model = MMDataParallel(model, device_ids=[0])

        data_loader = build_dataloader(
            dataset,
            imgs_per_gpu=1,
            workers_per_gpu=cfg.data.workers_per_gpu,
            num_gpus=1,
            dist=False,
            shuffle=False)
        outputs = single_test(model, data_loader, args.gtdir, args.outdir, cfg.label_vocab, cfg.kitti_ap_hook_cfg['eval_cpg_path'])
    else:
        model_args = cfg.model.copy()
        model_args.update(train_cfg=None, test_cfg=cfg.test_cfg)
        model_type = getattr(detectors, model_args.pop('type'))
        outputs = parallel_test(
            model_type,
            model_args,
            args.checkpoint,
            dataset,
            _data_func,
            range(args.gpus),
            workers_per_gpu=args.proc_per_gpu)
コード例 #15
0
def main():
    args = parse_args()

    if args.out is not None and not args.out.endswith(('.pkl', '.pickle')):
        raise ValueError('The output file must be a pkl file.')

    cfg = mmcv.Config.fromfile(args.config)
    cfg.model.pretrained = None
    cfg.data.test.test_mode = True

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))
    if args.gpus == 1:
        model = build_detector(cfg.model,
                               train_cfg=None,
                               test_cfg=cfg.test_cfg)
        load_checkpoint(model, args.checkpoint)
        model = MMDataParallel(model, device_ids=[0])

        data_loader = build_dataloader(
            dataset,
            imgs_per_gpu=1,
            workers_per_gpu=cfg.data.workers_per_gpu,
            num_gpus=1,
            dist=False,
            shuffle=False)
        outputs = single_test(model, data_loader, args.show)
    else:
        model_args = cfg.model.copy()
        model_args.update(train_cfg=None, test_cfg=cfg.test_cfg)
        model_type = getattr(detectors, model_args.pop('type'))
        outputs = parallel_test(model_type,
                                model_args,
                                args.checkpoint,
                                dataset,
                                _data_func,
                                range(args.gpus),
                                workers_per_gpu=args.proc_per_gpu)
コード例 #16
0
def test_iter_eval_hook():
    with pytest.raises(TypeError):
        test_dataset = ExampleModel()
        data_loader = [
            DataLoader(test_dataset,
                       batch_size=1,
                       sampler=None,
                       num_worker=0,
                       shuffle=False)
        ]
        EvalHook(data_loader)

    test_dataset = ExampleDataset()
    test_dataset.pre_eval = MagicMock(return_value=[torch.tensor([1])])
    test_dataset.evaluate = MagicMock(return_value=dict(test='success'))
    loader = DataLoader(test_dataset, batch_size=1)
    model = ExampleModel()
    data_loader = DataLoader(test_dataset,
                             batch_size=1,
                             sampler=None,
                             num_workers=0,
                             shuffle=False)
    optim_cfg = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005)
    optimizer = obj_from_dict(optim_cfg, torch.optim,
                              dict(params=model.parameters()))

    # test EvalHook
    with tempfile.TemporaryDirectory() as tmpdir:
        eval_hook = EvalHook(data_loader, by_epoch=False, efficient_test=True)
        runner = mmcv.runner.IterBasedRunner(model=model,
                                             optimizer=optimizer,
                                             work_dir=tmpdir,
                                             logger=logging.getLogger())
        runner.register_hook(eval_hook)
        runner.run([loader], [('train', 1)], 1)
        test_dataset.evaluate.assert_called_with([torch.tensor([1])],
                                                 logger=runner.logger)
コード例 #17
0
def main():

    args = parse_args()

    # === config ===
    cfg = Config.fromfile(args.config)
    if cfg.get('cudnn_benchmark', False):
        torch.backends.cudnn.benchmark = True
    cfg.model.pretrained = None
    cfg.data.test.test_mode = True

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))
    loader = build_dataloader(
        dataset,
        cfg.data.tasks_per_gpu // cfg.data.tasks_per_gpu,
        max(1, cfg.data.workers_per_gpu // cfg.data.tasks_per_gpu),
        args.gpus,
        dist=False,
        customized_sampler=False,
        shuffle=False)
    model = build_model(cfg.model,
                        train_cfg=cfg.train_cfg,
                        test_cfg=cfg.test_cfg)
    model = MMDataParallel(model, device_ids=range(args.gpus)).cuda()
    load_checkpoint(model, args.checkpoint)
    model.eval()

    results = []
    prog_bar = mmcv.ProgressBar(len(loader))
    for data in loader:
        with torch.no_grad():
            result = model(return_loss=False, **data)
        results.append(result)
        prog_bar.update()

    topk = (1, 3, 5, 10) if not args.topk else args.topk
    evaluate(results, eval=args.eval, topk=topk)
コード例 #18
0
def build_optimizer(model, optimizer_cfg):
    """Build optimizer from configs.

    Args:
        model (:obj:`nn.Module`): The model with parameters to be optimized.
        optimizer_cfg (dict): The config dict of the optimizer.
            Positional fields are:
                - type: class name of the optimizer.
                - lr: base learning rate.
            Optional fields are:
                - any arguments of the corresponding optimizer type, e.g.,
                  weight_decay, momentum, etc.
                - paramwise_options: a dict with 3 accepted fileds
                  (bias_lr_mult, bias_decay_mult, norm_decay_mult).
                  `bias_lr_mult` and `bias_decay_mult` will be multiplied to
                  the lr and weight decay respectively for all bias parameters
                  (except for the normalization layers), and
                  `norm_decay_mult` will be multiplied to the weight decay
                  for all weight and bias parameters of normalization layers.

    Returns:
        torch.optim.Optimizer: The initialized optimizer.
    """
    if hasattr(model, 'module'):
        model = model.module

    optimizer_cfg = optimizer_cfg.copy()
    paramwise_options = optimizer_cfg.pop('paramwise_options', None)
    # if no paramwise option is specified, just use the global setting
    if paramwise_options is None:
        return obj_from_dict(optimizer_cfg, torch.optim,
                             dict(params=model.parameters()))
    else:
        assert isinstance(paramwise_options, dict)
        # get base lr and weight decay
        base_lr = optimizer_cfg['lr']
        base_wd = optimizer_cfg.get('weight_decay', None)
        # weight_decay must be explicitly specified if mult is specified
        if ('bias_decay_mult' in paramwise_options
                or 'norm_decay_mult' in paramwise_options):
            assert base_wd is not None
        # get param-wise options
        bias_lr_mult = paramwise_options.get('bias_lr_mult', 1.)
        bias_decay_mult = paramwise_options.get('bias_decay_mult', 1.)
        norm_decay_mult = paramwise_options.get('norm_decay_mult', 1.)
        # set param-wise lr and weight decay
        params = []

        ##
        if paramwise_options['nofreeze'] != "all":
            print("freeze some layer")
            for name, param in model.named_parameters():
                if name.split(".")[0] != paramwise_options['nofreeze']:
                    param.requires_grad = False
                    print(name)
        ##

        for name, param in model.named_parameters():
            param_group = {'params': [param]}
            if not param.requires_grad:
                # FP16 training needs to copy gradient/weight between master
                # weight copy and model weight, it is convenient to keep all
                # parameters here to align with model.parameters()
                params.append(param_group)
                continue

            # for norm layers, overwrite the weight decay of weight and bias
            # TODO: obtain the norm layer prefixes dynamically
            if re.search(r'(bn|gn)(\d+)?.(weight|bias)', name):
                if base_wd is not None:
                    param_group['weight_decay'] = base_wd * norm_decay_mult
            # for other layers, overwrite both lr and weight decay of bias
            elif name.endswith('.bias'):
                param_group['lr'] = base_lr * bias_lr_mult
                if base_wd is not None:
                    param_group['weight_decay'] = base_wd * bias_decay_mult
            # otherwise use the global settings

            params.append(param_group)

        optimizer_cls = getattr(torch.optim, optimizer_cfg.pop('type'))
        return optimizer_cls(params, **optimizer_cfg)
コード例 #19
0
def build_optimizer(model, optimizer_cfg, mod=False):
    """Build optimizer from configs.

    Args:
        model (:obj:`nn.Module`): The model with parameters to be optimized.
        optimizer_cfg (dict): The config dict of the optimizer.
            Positional fields are:
                - type: class name of the optimizer.
                - lr: base learning rate.
            Optional fields are:
                - any arguments of the corresponding optimizer type, e.g.,
                  weight_decay, momentum, etc.
                - paramwise_options: a dict with 3 accepted fileds
                  (bias_lr_mult, bias_decay_mult, norm_decay_mult).
                  `bias_lr_mult` and `bias_decay_mult` will be multiplied to
                  the lr and weight decay respectively for all bias parameters
                  (except for the normalization layers), and
                  `norm_decay_mult` will be multiplied to the weight decay
                  for all weight and bias parameters of normalization layers.

    Returns:
        torch.optim.Optimizer: The initialized optimizer.

    Example:
        >>> model = torch.nn.modules.Conv1d(1, 1, 1)
        >>> optimizer_cfg = dict(type='SGD', lr=0.01, momentum=0.9,
        >>>                      weight_decay=0.0001)
        >>> optimizer = build_optimizer(model, optimizer_cfg)
    """
    if hasattr(model, 'module'):
        model = model.module

    optimizer_cfg = optimizer_cfg.copy()
    paramwise_options = optimizer_cfg.pop('paramwise_options', None)
    # if no paramwise option is specified, just use the global setting
    # if mod:
    #     base_lr = optimizer_cfg['lr']
    #     ft_lr = base_lr #/ 10.
    #     # frozen_params_list = [model.backbone.parameters(),
    #     #                model.neck.parameters(),
    #     #                model.rpn_head.parameters(),
    #     #                model.bbox_roi_extractor.parameters(),
    #     #                model.bbox_head.shared_fcs.parameters()]
    #     params = [{'params':model.backbone.parameters(), 'lr':ft_lr},
    #               {'params':model.neck.parameters(), 'lr':ft_lr},
    #               {'params':model.rpn_head.parameters(), 'lr':ft_lr},
    #               {'params':model.bbox_roi_extractor.parameters(), 'lr':ft_lr},
    #               {'params':model.bbox_head.shared_fcs.parameters(), 'lr':base_lr},
    #               {'params':model.bbox_head.fc_cls.parameters(), 'lr':base_lr},
    #               {'params':model.bbox_head.fc_reg.parameters(), 'lr':base_lr}
    #                 ]
    #     # for frozen_params in frozen_params_list:
    #     #     for p in frozen_params:
    #     #         p.requires_grad = False
    #     # params = [{'params':model.bbox_head.fc_cls.parameters(), 'lr':base_lr},
    #     #           {'params':model.bbox_head.fc_reg.parameters(), 'lr':base_lr}]
    #     optimizer_cls = getattr(torch.optim, optimizer_cfg.pop('type'))
    #     return optimizer_cls(params, **optimizer_cfg)

    if paramwise_options is None:
        return obj_from_dict(optimizer_cfg, torch.optim,
                             dict(params=model.parameters()))
    else:
        assert isinstance(paramwise_options, dict)
        # get base lr and weight decay
        base_lr = optimizer_cfg['lr']
        base_wd = optimizer_cfg.get('weight_decay', None)
        # weight_decay must be explicitly specified if mult is specified
        if ('bias_decay_mult' in paramwise_options
                or 'norm_decay_mult' in paramwise_options):
            assert base_wd is not None
        # get param-wise options
        bias_lr_mult = paramwise_options.get('bias_lr_mult', 1.)
        bias_decay_mult = paramwise_options.get('bias_decay_mult', 1.)
        norm_decay_mult = paramwise_options.get('norm_decay_mult', 1.)
        # set param-wise lr and weight decay
        params = []
        for name, param in model.named_parameters():
            param_group = {'params': [param]}
            if not param.requires_grad:
                # FP16 training needs to copy gradient/weight between master
                # weight copy and model weight, it is convenient to keep all
                # parameters here to align with model.parameters()
                params.append(param_group)
                continue

            # for norm layers, overwrite the weight decay of weight and bias
            # TODO: obtain the norm layer prefixes dynamically
            if re.search(r'(bn|gn)(\d+)?.(weight|bias)', name):
                if base_wd is not None:
                    param_group['weight_decay'] = base_wd * norm_decay_mult
            # for other layers, overwrite both lr and weight decay of bias
            elif name.endswith('.bias'):
                param_group['lr'] = base_lr * bias_lr_mult
                if base_wd is not None:
                    param_group['weight_decay'] = base_wd * bias_decay_mult
            # otherwise use the global settings

            params.append(param_group)

        optimizer_cls = getattr(torch.optim, optimizer_cfg.pop('type'))
        return optimizer_cls(params, **optimizer_cfg)
コード例 #20
0
def build_optimizer_bak(model, optimizer_cfg):
    """Build optimizer from configs.

    Args:
        model (:obj:`nn.Module`): The model with parameters to be optimized.
        optimizer_cfg (dict): The config dict of the optimizer.
            Positional fields are:
                - type: class name of the optimizer.
                - lr: base learning rate.
            Optional fields are:
                - any arguments of the corresponding optimizer type, e.g.,
                  weight_decay, momentum, etc.
                - paramwise_options: a dict with 3 accepted fileds
                  (bias_lr_mult, bias_decay_mult, norm_decay_mult).
                  `bias_lr_mult` and `bias_decay_mult` will be multiplied to
                  the lr and weight decay respectively for all bias parameters
                  (except for the normalization layers), and
                  `norm_decay_mult` will be multiplied to the weight decay
                  for all weight and bias parameters of normalization layers.

    Returns:
        torch.optim.Optimizer: The initialized optimizer.

    Example:
        >>> model = torch.nn.modules.Conv1d(1, 1, 1)
        >>> optimizer_cfg = dict(type='SGD', lr=0.01, momentum=0.9,
        >>>                      weight_decay=0.0001)
        >>> optimizer = build_optimizer(model, optimizer_cfg)
    """
    if hasattr(model, 'module'):
        model = model.module

    optimizer_cfg = optimizer_cfg.copy()
    paramwise_options = optimizer_cfg.pop('paramwise_options', None)
    ft_lr = optimizer_cfg.pop('ft_lr', None)
    # if no paramwise option is specified, just use the global setting
    if paramwise_options is None:
        if ft_lr is None:
            return obj_from_dict(optimizer_cfg, torch.optim,
                                 dict(params=model.parameters()))
        else:
            assert isinstance(ft_lr, dict)
            base_lr = optimizer_cfg['lr']
            frozen_params = ft_lr.frozen
            base_params = ft_lr.base
            ft_params = ft_lr.ft
            params = []
            if frozen_params is not None:
                for name in frozen_params:
                    ps = getattr(model, name).parameters()
                    for p in ps:
                        p.requires_grad = False
                    # param_group = {'params': ps}
                    # params.append(param_group)
            if base_params is not None:
                for name in base_params:
                    if isinstance(name, dict):
                        ps = getattr(model, name.parent)
                        # print("Get {} as parent".format(name.parent))
                        for child in name.children:
                            # print("Get {}.{} as child".format(name.parent,child))
                            ps_child = getattr(ps, child).parameters()
                            # print("ps_child", ps_child)
                            for param in ps_child:
                                param.requires_grad = True
                            param_group = {'params': ps_child, 'lr': base_lr}
                            params.append(param_group)
                    else:
                        ps = getattr(model, name).parameters()
                        for p in ps:
                            p.requires_grad = True
                        param_group = {'params': ps, 'lr': base_lr}
                        params.append(param_group)
            if ft_params is not None:
                ft_lr = base_lr / 10.
                for name in ft_params:
                    if isinstance(name, dict):
                        ps = getattr(model, name.parent)
                        # print("Get {} as parent".format(name.parent))
                        for child in name.children:
                            # print("Get {}.{} as child".format(name.parent,child))
                            ps_child = getattr(ps, child).parameters()
                            # print("ps_child", ps_child)
                            for param in ps_child:
                                param.requires_grad = True
                            param_group = {'params': ps_child, 'lr': ft_lr}
                            params.append(param_group)
                    else:
                        ps = getattr(model, name).parameters()
                        for p in ps:
                            p.requires_grad = True
                        param_group = {'params': ps, 'lr': ft_lr}
                        params.append(param_group)
            optimizer_cls = getattr(torch.optim, optimizer_cfg.pop('type'))
            return optimizer_cls(params, **optimizer_cfg)
    else:
        assert isinstance(paramwise_options, dict)
        # get base lr and weight decay
        base_lr = optimizer_cfg['lr']
        base_wd = optimizer_cfg.get('weight_decay', None)
        # weight_decay must be explicitly specified if mult is specified
        if ('bias_decay_mult' in paramwise_options
                or 'norm_decay_mult' in paramwise_options):
            assert base_wd is not None
        # get param-wise options
        bias_lr_mult = paramwise_options.get('bias_lr_mult', 1.)
        bias_decay_mult = paramwise_options.get('bias_decay_mult', 1.)
        norm_decay_mult = paramwise_options.get('norm_decay_mult', 1.)
        # set param-wise lr and weight decay
        params = []
        for name, param in model.named_parameters():
            param_group = {'params': [param]}
            if not param.requires_grad:
                # FP16 training needs to copy gradient/weight between master
                # weight copy and model weight, it is convenient to keep all
                # parameters here to align with model.parameters()
                params.append(param_group)
                continue

            # for norm layers, overwrite the weight decay of weight and bias
            # TODO: obtain the norm layer prefixes dynamically
            if re.search(r'(bn|gn)(\d+)?.(weight|bias)', name):
                if base_wd is not None:
                    param_group['weight_decay'] = base_wd * norm_decay_mult
            # for other layers, overwrite both lr and weight decay of bias
            elif name.endswith('.bias'):
                param_group['lr'] = base_lr * bias_lr_mult
                if base_wd is not None:
                    param_group['weight_decay'] = base_wd * bias_decay_mult
            # otherwise use the global settings

            params.append(param_group)

        optimizer_cls = getattr(torch.optim, optimizer_cfg.pop('type'))
        return optimizer_cls(params, **optimizer_cfg)
コード例 #21
0
def main():
    args = parse_args()

    if args.out is not None and not args.out.endswith(('.pkl', '.pickle')):
        raise ValueError('The output file must be a pkl file.')

    cfg = mmcv.Config.fromfile(args.config)
    # set cudnn_benchmark
    if cfg.get('cudnn_benchmark', False):
        torch.backends.cudnn.benchmark = True
    cfg.model.pretrained = None
    cfg.data.test.test_mode = True

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))
    if args.gpus == 1:
        model = build_detector(cfg.model,
                               train_cfg=None,
                               test_cfg=cfg.test_cfg)
        load_checkpoint(model, args.checkpoint)
        model = MMDataParallel(model, device_ids=[0])

        data_loader = build_dataloader(
            dataset,
            imgs_per_gpu=1,
            workers_per_gpu=cfg.data.workers_per_gpu,
            num_gpus=1,
            dist=False,
            shuffle=False)
        outputs = single_test(model, data_loader, args.show)
    else:
        model_args = cfg.model.copy()
        model_args.update(train_cfg=None, test_cfg=cfg.test_cfg)
        model_type = getattr(detectors, model_args.pop('type'))
        outputs = parallel_test(model_type,
                                model_args,
                                args.checkpoint,
                                dataset,
                                _data_func,
                                range(args.gpus),
                                workers_per_gpu=args.proc_per_gpu)

    if args.out:
        print('writing results to {}'.format(args.out))
        mmcv.dump(outputs, args.out)
        eval_types = args.eval
        if eval_types:
            print('Starting evaluate {}'.format(' and '.join(eval_types)))
            if eval_types == ['proposal_fast']:
                result_file = args.out
                coco_eval(result_file, eval_types, dataset.coco)
            else:
                if not isinstance(outputs[0], dict):
                    result_file = args.out + '.json'
                    results2json(dataset, outputs, result_file)
                    coco_eval(result_file, eval_types, dataset.coco)
                else:
                    for name in outputs[0]:
                        print('\nEvaluating {}'.format(name))
                        outputs_ = [out[name] for out in outputs]
                        result_file = args.out + '.{}.json'.format(name)
                        results2json(dataset, outputs_, result_file)
                        coco_eval(result_file, eval_types, dataset.coco)
コード例 #22
0
def main():
    args = parse_args()

    if args.out is not None and not args.out.endswith(('.pkl', '.pickle')):
        raise ValueError('The output file must be a pkl file.')

    cfg = mmcv.Config.fromfile(args.config)
    # set cudnn_benchmark
    if cfg.get('cudnn_benchmark', False):
        torch.backends.cudnn.benchmark = True
    cfg.data.test.test_mode = True

    if cfg.data.test.oversample == 'three_crop':
        cfg.model.spatial_temporal_module.spatial_size = 8

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))
    if args.gpus == 1:
        model = build_recognizer(cfg.model,
                                 train_cfg=None,
                                 test_cfg=cfg.test_cfg)
        load_checkpoint(model, args.checkpoint, strict=True)
        model = MMDataParallel(model, device_ids=[0])
        a = dataset[1]

        data_loader = build_dataloader(
            dataset,
            imgs_per_gpu=1,
            workers_per_gpu=cfg.data.workers_per_gpu,
            num_gpus=1,
            dist=False,
            shuffle=False)
        outputs = single_test(model, data_loader)
    else:
        model_args = cfg.model.copy()
        model_args.update(train_cfg=None, test_cfg=cfg.test_cfg)
        model_type = getattr(recognizers, model_args.pop('type'))
        outputs = parallel_test(model_type,
                                model_args,
                                args.checkpoint,
                                dataset,
                                _data_func,
                                range(args.gpus),
                                workers_per_gpu=args.proc_per_gpu)

    if args.out:
        print('writing results to {}'.format(args.out))
        mmcv.dump(outputs, args.out)

    gt_labels = []
    for i in range(len(dataset)):
        ann = dataset.get_ann_info(i)
        gt_labels.append(ann['label'])

    if args.use_softmax:
        print("Averaging score over {} clips with softmax".format(
            outputs[0].shape[0]))
        results = [softmax(res, dim=1).mean(axis=0) for res in outputs]
    else:
        print("Averaging score over {} clips without softmax (ie, raw)".format(
            outputs[0].shape[0]))
        results = [res.mean(axis=0) for res in outputs]

    import datetime

    currentDT = datetime.datetime.now()

    with open('data/nturgbd/nturgbd_val_split_generalization_rawframes.txt'
              ) as f:
        video_names = [l.strip().split(' ')[0] for l in f.readlines()]

    with open(
            osp.join(args.checkpoint + '.result_%s.pkl' %
                     currentDT.strftime("%Y-%m-%d_%H:%M:%S")), 'wb') as f:
        pickle.dump([results, gt_labels, video_names], f)
    top1, top5 = top_k_accuracy(results, gt_labels, k=(1, 5))
    mean_acc = mean_class_accuracy(results, gt_labels)
    print("Mean Class Accuracy = {:.02f}".format(mean_acc * 100))
    print("Top-1 Accuracy = {:.02f}".format(top1 * 100))
    print("Top-5 Accuracy = {:.02f}".format(top5 * 100))
コード例 #23
0
def test_pix2pix():

    model_cfg = dict(type='Pix2Pix',
                     generator=dict(type='UnetGenerator',
                                    in_channels=3,
                                    out_channels=3,
                                    num_down=8,
                                    base_channels=64,
                                    norm_cfg=dict(type='BN'),
                                    use_dropout=True,
                                    init_cfg=dict(type='normal', gain=0.02)),
                     discriminator=dict(type='PatchDiscriminator',
                                        in_channels=6,
                                        base_channels=64,
                                        num_conv=3,
                                        norm_cfg=dict(type='BN'),
                                        init_cfg=dict(type='normal',
                                                      gain=0.02)),
                     gan_loss=dict(type='GANLoss',
                                   gan_type='vanilla',
                                   real_label_val=1.0,
                                   fake_label_val=0,
                                   loss_weight=1.0),
                     pixel_loss=dict(type='L1Loss',
                                     loss_weight=100.0,
                                     reduction='mean'))

    train_cfg = None
    test_cfg = None

    # build synthesizer
    synthesizer = build_model(model_cfg,
                              train_cfg=train_cfg,
                              test_cfg=test_cfg)

    # test checking gan loss cannot be None
    with pytest.raises(AssertionError):
        bad_model_cfg = copy.deepcopy(model_cfg)
        bad_model_cfg['gan_loss'] = None
        _ = build_model(bad_model_cfg, train_cfg=train_cfg, test_cfg=test_cfg)

    # test attributes
    assert synthesizer.__class__.__name__ == 'Pix2Pix'
    assert isinstance(synthesizer.generator, UnetGenerator)
    assert isinstance(synthesizer.discriminator, PatchDiscriminator)
    assert isinstance(synthesizer.gan_loss, GANLoss)
    assert isinstance(synthesizer.pixel_loss, L1Loss)
    assert synthesizer.train_cfg is None
    assert synthesizer.test_cfg is None

    # prepare data
    inputs = torch.rand(1, 3, 256, 256)
    targets = torch.rand(1, 3, 256, 256)
    data_batch = {'img_a': inputs, 'img_b': targets}
    img_meta = {}
    img_meta['img_a_path'] = 'img_a_path'
    img_meta['img_b_path'] = 'img_b_path'
    data_batch['meta'] = [img_meta]

    # prepare optimizer
    optim_cfg = dict(type='Adam', lr=2e-4, betas=(0.5, 0.999))
    optimizer = {
        'generator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(synthesizer, 'generator').parameters())),
        'discriminator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(synthesizer, 'discriminator').parameters()))
    }

    # test forward_dummy
    with torch.no_grad():
        output = synthesizer.forward_dummy(data_batch['img_a'])
    assert torch.is_tensor(output)
    assert output.size() == (1, 3, 256, 256)

    # test forward_test
    with torch.no_grad():
        outputs = synthesizer(inputs, targets, [img_meta], test_mode=True)
    assert torch.equal(outputs['real_a'], data_batch['img_a'])
    assert torch.equal(outputs['real_b'], data_batch['img_b'])
    assert torch.is_tensor(outputs['fake_b'])
    assert outputs['fake_b'].size() == (1, 3, 256, 256)

    # val_step
    with torch.no_grad():
        outputs = synthesizer.val_step(data_batch)
    assert torch.equal(outputs['real_a'], data_batch['img_a'])
    assert torch.equal(outputs['real_b'], data_batch['img_b'])
    assert torch.is_tensor(outputs['fake_b'])
    assert outputs['fake_b'].size() == (1, 3, 256, 256)

    # test forward_train
    outputs = synthesizer(inputs, targets, [img_meta], test_mode=False)
    assert torch.equal(outputs['real_a'], data_batch['img_a'])
    assert torch.equal(outputs['real_b'], data_batch['img_b'])
    assert torch.is_tensor(outputs['fake_b'])
    assert outputs['fake_b'].size() == (1, 3, 256, 256)

    # test train_step
    outputs = synthesizer.train_step(data_batch, optimizer)
    assert isinstance(outputs, dict)
    assert isinstance(outputs['log_vars'], dict)
    assert isinstance(outputs['results'], dict)
    for v in [
            'loss_gan_d_fake', 'loss_gan_d_real', 'loss_gan_g', 'loss_pixel'
    ]:
        assert isinstance(outputs['log_vars'][v], float)
    assert outputs['num_samples'] == 1
    assert torch.equal(outputs['results']['real_a'], data_batch['img_a'])
    assert torch.equal(outputs['results']['real_b'], data_batch['img_b'])
    assert torch.is_tensor(outputs['results']['fake_b'])
    assert outputs['results']['fake_b'].size() == (1, 3, 256, 256)

    # test train_step and forward_test (gpu)
    if torch.cuda.is_available():
        synthesizer = synthesizer.cuda()
        optimizer = {
            'generator':
            obj_from_dict(
                optim_cfg, torch.optim,
                dict(params=getattr(synthesizer, 'generator').parameters())),
            'discriminator':
            obj_from_dict(
                optim_cfg, torch.optim,
                dict(
                    params=getattr(synthesizer, 'discriminator').parameters()))
        }
        data_batch_cuda = copy.deepcopy(data_batch)
        data_batch_cuda['img_a'] = inputs.cuda()
        data_batch_cuda['img_b'] = targets.cuda()
        data_batch_cuda['meta'] = [DC(img_meta, cpu_only=True).data]

        # forward_test
        with torch.no_grad():
            outputs = synthesizer(data_batch_cuda['img_a'],
                                  data_batch_cuda['img_b'],
                                  data_batch_cuda['meta'],
                                  test_mode=True)
        assert torch.equal(outputs['real_a'], data_batch_cuda['img_a'].cpu())
        assert torch.equal(outputs['real_b'], data_batch_cuda['img_b'].cpu())
        assert torch.is_tensor(outputs['fake_b'])
        assert outputs['fake_b'].size() == (1, 3, 256, 256)

        # val_step
        with torch.no_grad():
            outputs = synthesizer.val_step(data_batch_cuda)
        assert torch.equal(outputs['real_a'], data_batch_cuda['img_a'].cpu())
        assert torch.equal(outputs['real_b'], data_batch_cuda['img_b'].cpu())
        assert torch.is_tensor(outputs['fake_b'])
        assert outputs['fake_b'].size() == (1, 3, 256, 256)

        # test forward_train
        outputs = synthesizer(data_batch_cuda['img_a'],
                              data_batch_cuda['img_b'],
                              data_batch_cuda['meta'],
                              test_mode=False)
        assert torch.equal(outputs['real_a'], data_batch_cuda['img_a'])
        assert torch.equal(outputs['real_b'], data_batch_cuda['img_b'])
        assert torch.is_tensor(outputs['fake_b'])
        assert outputs['fake_b'].size() == (1, 3, 256, 256)

        # train_step
        outputs = synthesizer.train_step(data_batch_cuda, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        assert isinstance(outputs['results'], dict)
        for v in [
                'loss_gan_d_fake', 'loss_gan_d_real', 'loss_gan_g',
                'loss_pixel'
        ]:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['real_a'],
                           data_batch_cuda['img_a'].cpu())
        assert torch.equal(outputs['results']['real_b'],
                           data_batch_cuda['img_b'].cpu())
        assert torch.is_tensor(outputs['results']['fake_b'])
        assert outputs['results']['fake_b'].size() == (1, 3, 256, 256)

    # test disc_steps and disc_init_steps
    data_batch['img_a'] = inputs.cpu()
    data_batch['img_b'] = targets.cpu()
    train_cfg = dict(disc_steps=2, disc_init_steps=2)
    synthesizer = build_model(model_cfg,
                              train_cfg=train_cfg,
                              test_cfg=test_cfg)
    optimizer = {
        'generator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(synthesizer, 'generator').parameters())),
        'discriminator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(synthesizer, 'discriminator').parameters()))
    }

    # iter 0, 1
    for i in range(2):
        assert synthesizer.step_counter == i
        outputs = synthesizer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        assert isinstance(outputs['results'], dict)
        assert outputs['log_vars'].get('loss_gan_g') is None
        assert outputs['log_vars'].get('loss_pixel') is None
        for v in ['loss_gan_d_fake', 'loss_gan_d_real']:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['real_a'], data_batch['img_a'])
        assert torch.equal(outputs['results']['real_b'], data_batch['img_b'])
        assert torch.is_tensor(outputs['results']['fake_b'])
        assert outputs['results']['fake_b'].size() == (1, 3, 256, 256)
        assert synthesizer.step_counter == i + 1

    # iter 2, 3, 4, 5
    for i in range(2, 6):
        assert synthesizer.step_counter == i
        outputs = synthesizer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        assert isinstance(outputs['results'], dict)
        log_check_list = [
            'loss_gan_d_fake', 'loss_gan_d_real', 'loss_gan_g', 'loss_pixel'
        ]
        if i % 2 == 1:
            assert outputs['log_vars'].get('loss_gan_g') is None
            assert outputs['log_vars'].get('loss_pixel') is None
            log_check_list.remove('loss_gan_g')
            log_check_list.remove('loss_pixel')
        for v in log_check_list:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['real_a'], data_batch['img_a'])
        assert torch.equal(outputs['results']['real_b'], data_batch['img_b'])
        assert torch.is_tensor(outputs['results']['fake_b'])
        assert outputs['results']['fake_b'].size() == (1, 3, 256, 256)
        assert synthesizer.step_counter == i + 1

    # test without pixel loss
    model_cfg_ = copy.deepcopy(model_cfg)
    model_cfg_.pop('pixel_loss')
    synthesizer = build_model(model_cfg_, train_cfg=None, test_cfg=None)
    optimizer = {
        'generator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(synthesizer, 'generator').parameters())),
        'discriminator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(synthesizer, 'discriminator').parameters()))
    }
    data_batch['img_a'] = inputs.cpu()
    data_batch['img_b'] = targets.cpu()
    outputs = synthesizer.train_step(data_batch, optimizer)
    assert isinstance(outputs, dict)
    assert isinstance(outputs['log_vars'], dict)
    assert isinstance(outputs['results'], dict)
    assert outputs['log_vars'].get('loss_pixel') is None
    for v in ['loss_gan_d_fake', 'loss_gan_d_real', 'loss_gan_g']:
        assert isinstance(outputs['log_vars'][v], float)
    assert outputs['num_samples'] == 1
    assert torch.equal(outputs['results']['real_a'], data_batch['img_a'])
    assert torch.equal(outputs['results']['real_b'], data_batch['img_b'])
    assert torch.is_tensor(outputs['results']['fake_b'])
    assert outputs['results']['fake_b'].size() == (1, 3, 256, 256)

    # test b2a translation
    data_batch['img_a'] = inputs.cpu()
    data_batch['img_b'] = targets.cpu()
    train_cfg = dict(direction='b2a')
    synthesizer = build_model(model_cfg,
                              train_cfg=train_cfg,
                              test_cfg=test_cfg)
    optimizer = {
        'generator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(synthesizer, 'generator').parameters())),
        'discriminator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(synthesizer, 'discriminator').parameters()))
    }
    assert synthesizer.step_counter == 0
    outputs = synthesizer.train_step(data_batch, optimizer)
    assert isinstance(outputs, dict)
    assert isinstance(outputs['log_vars'], dict)
    assert isinstance(outputs['results'], dict)
    for v in [
            'loss_gan_d_fake', 'loss_gan_d_real', 'loss_gan_g', 'loss_pixel'
    ]:
        assert isinstance(outputs['log_vars'][v], float)
    assert outputs['num_samples'] == 1
    assert torch.equal(outputs['results']['real_a'], data_batch['img_b'])
    assert torch.equal(outputs['results']['real_b'], data_batch['img_a'])
    assert torch.is_tensor(outputs['results']['fake_b'])
    assert outputs['results']['fake_b'].size() == (1, 3, 256, 256)
    assert synthesizer.step_counter == 1

    # test save image
    # show input
    train_cfg = None
    test_cfg = dict(show_input=True)
    synthesizer = build_model(model_cfg,
                              train_cfg=train_cfg,
                              test_cfg=test_cfg)
    with patch.object(mmcv, 'imwrite', return_value=True):
        # test save path not None Assertion
        with pytest.raises(AssertionError):
            with torch.no_grad():
                _ = synthesizer(inputs,
                                targets, [img_meta],
                                test_mode=True,
                                save_image=True)
        # iteration is None
        with torch.no_grad():
            outputs = synthesizer(inputs,
                                  targets, [img_meta],
                                  test_mode=True,
                                  save_image=True,
                                  save_path='save_path')
        assert torch.equal(outputs['real_a'], data_batch['img_a'])
        assert torch.equal(outputs['real_b'], data_batch['img_b'])
        assert torch.is_tensor(outputs['fake_b'])
        assert outputs['fake_b'].size() == (1, 3, 256, 256)
        assert outputs['saved_flag']
        # iteration is not None
        with torch.no_grad():
            outputs = synthesizer(inputs,
                                  targets, [img_meta],
                                  test_mode=True,
                                  save_image=True,
                                  save_path='save_path',
                                  iteration=1000)
        assert torch.equal(outputs['real_a'], data_batch['img_a'])
        assert torch.equal(outputs['real_b'], data_batch['img_b'])
        assert torch.is_tensor(outputs['fake_b'])
        assert outputs['fake_b'].size() == (1, 3, 256, 256)
        assert outputs['saved_flag']

    # not show input
    train_cfg = None
    test_cfg = dict(show_input=False)
    synthesizer = build_model(model_cfg,
                              train_cfg=train_cfg,
                              test_cfg=test_cfg)
    with patch.object(mmcv, 'imwrite', return_value=True):
        # test save path not None Assertion
        with pytest.raises(AssertionError):
            with torch.no_grad():
                _ = synthesizer(inputs,
                                targets, [img_meta],
                                test_mode=True,
                                save_image=True)
        # iteration is None
        with torch.no_grad():
            outputs = synthesizer(inputs,
                                  targets, [img_meta],
                                  test_mode=True,
                                  save_image=True,
                                  save_path='save_path')
        assert torch.equal(outputs['real_a'], data_batch['img_a'])
        assert torch.equal(outputs['real_b'], data_batch['img_b'])
        assert torch.is_tensor(outputs['fake_b'])
        assert outputs['fake_b'].size() == (1, 3, 256, 256)
        assert outputs['saved_flag']
        # iteration is not None
        with torch.no_grad():
            outputs = synthesizer(inputs,
                                  targets, [img_meta],
                                  test_mode=True,
                                  save_image=True,
                                  save_path='save_path',
                                  iteration=1000)
        assert torch.equal(outputs['real_a'], data_batch['img_a'])
        assert torch.equal(outputs['real_b'], data_batch['img_b'])
        assert torch.is_tensor(outputs['fake_b'])
        assert outputs['fake_b'].size() == (1, 3, 256, 256)
        assert outputs['saved_flag']
コード例 #24
0
ファイル: test_recognizer.py プロジェクト: volpepe/mmaction
def main():
    args = parse_args()

    if args.out is not None and not args.out.endswith(('.pkl', '.pickle')):
        raise ValueError('The output file must be a pkl file.')

    cfg = mmcv.Config.fromfile(args.config)
    # set cudnn_benchmark
    if cfg.get('cudnn_benchmark', False):
        torch.backends.cudnn.benchmark = True
    cfg.data.test.test_mode = True

    # pass arg of fcn testing
    if args.fcn_testing:
        cfg.model.update({'fcn_testing': True})
        cfg.model['cls_head'].update({'fcn_testing': True})

    # for regular testing
    if cfg.data.test.oversample == 'three_crop':
        cfg.model.spatial_temporal_module.spatial_size = 8

    dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))

    if args.launcher == 'none':
        raise NotImplementedError("By default, we use distributed testing, so that launcher should be pytorch")
    else:
        distributed = True
        init_dist(args.launcher, **cfg.dist_params)

    model = build_recognizer(cfg.model, train_cfg=None, test_cfg=cfg.test_cfg)
    data_loader = build_dataloader(
        dataset,
        imgs_per_gpu=1,
        workers_per_gpu=1,
        dist=distributed,
        shuffle=False)

    load_checkpoint(model, args.checkpoint, map_location='cpu')
    model = MMDistributedDataParallel(model.cuda())
    outputs = multi_test(model, data_loader)

    rank, _ = get_dist_info()
    if args.out and rank == 0:
        print('writing results to {}'.format(args.out))
        mmcv.dump(outputs, args.out)

        gt_labels = []
        for i in range(len(dataset)):
            ann = dataset.get_ann_info(i)
            gt_labels.append(ann['label'])

        if args.use_softmax:
            print("Averaging score over {} clips with softmax".format(outputs[0].shape[0]))
            results = [softmax(res, dim=1).mean(axis=0) for res in outputs]
        else:
            print("Averaging score over {} clips without softmax (ie, raw)".format(outputs[0].shape[0]))
            results = [res.mean(axis=0) for res in outputs]
        top1, top5 = top_k_accuracy(results, gt_labels, k=(1,5))
        mean_acc = mean_class_accuracy(results, gt_labels)
        print("Mean Class Accuracy = {:.02f}".format(mean_acc * 100))
        print("Top-1 Accuracy = {:.02f}".format(top1 * 100))
        print("Top-5 Accuracy = {:.02f}".format(top5 * 100))
コード例 #25
0
def test_real_basicvsr():

    model_cfg = dict(
        type='RealBasicVSR',
        generator=dict(type='RealBasicVSRNet'),
        discriminator=dict(type='UNetDiscriminatorWithSpectralNorm',
                           in_channels=3,
                           mid_channels=64,
                           skip_connection=True),
        pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'),
        cleaning_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'),
        gan_loss=dict(type='GANLoss',
                      gan_type='vanilla',
                      loss_weight=1e-1,
                      real_label_val=1.0,
                      fake_label_val=0),
        is_use_sharpened_gt_in_pixel=True,
        is_use_sharpened_gt_in_percep=True,
        is_use_sharpened_gt_in_gan=True,
        is_use_ema=True,
    )

    train_cfg = None
    test_cfg = None

    # build restorer
    restorer = build_model(model_cfg, train_cfg=train_cfg, test_cfg=test_cfg)

    # test attributes
    assert restorer.__class__.__name__ == 'RealBasicVSR'
    assert isinstance(restorer.generator, RealBasicVSRNet)
    assert isinstance(restorer.discriminator,
                      UNetDiscriminatorWithSpectralNorm)
    assert isinstance(restorer.pixel_loss, L1Loss)
    assert isinstance(restorer.gan_loss, GANLoss)

    # prepare data
    inputs = torch.rand(1, 5, 3, 64, 64)
    targets = torch.rand(1, 5, 3, 256, 256)
    data_batch = {'lq': inputs, 'gt': targets, 'gt_unsharp': targets}

    # prepare optimizer
    optim_cfg = dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))
    optimizer = {
        'generator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(restorer, 'generator').parameters())),
        'discriminator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(restorer, 'discriminator').parameters()))
    }

    # no forward train in GAN models, raise ValueError
    with pytest.raises(ValueError):
        restorer(**data_batch, test_mode=False)

    # test train_step
    with patch.object(restorer,
                      'perceptual_loss',
                      return_value=(torch.tensor(1.0), torch.tensor(2.0))):
        outputs = restorer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        for v in [
                'loss_perceptual', 'loss_gan', 'loss_d_real', 'loss_d_fake',
                'loss_pix', 'loss_clean'
        ]:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['lq'], data_batch['lq'])
        assert torch.equal(outputs['results']['gt'], data_batch['gt'])
        assert torch.is_tensor(outputs['results']['output'])
        assert outputs['results']['output'].size() == (5, 3, 256, 256)

    # test train_step (gpu)
    if torch.cuda.is_available():
        restorer = restorer.cuda()
        optimizer = {
            'generator':
            obj_from_dict(
                optim_cfg, torch.optim,
                dict(params=getattr(restorer, 'generator').parameters())),
            'discriminator':
            obj_from_dict(
                optim_cfg, torch.optim,
                dict(params=getattr(restorer, 'discriminator').parameters()))
        }
        data_batch = {
            'lq': inputs.cuda(),
            'gt': targets.cuda(),
            'gt_unsharp': targets.cuda()
        }

        # train_step
        with patch.object(restorer,
                          'perceptual_loss',
                          return_value=(torch.tensor(1.0).cuda(),
                                        torch.tensor(2.0).cuda())):
            outputs = restorer.train_step(data_batch, optimizer)
            assert isinstance(outputs, dict)
            assert isinstance(outputs['log_vars'], dict)
            for v in [
                    'loss_perceptual', 'loss_gan', 'loss_d_real',
                    'loss_d_fake', 'loss_pix', 'loss_clean'
            ]:
                assert isinstance(outputs['log_vars'][v], float)
            assert outputs['num_samples'] == 1
            assert torch.equal(outputs['results']['lq'],
                               data_batch['lq'].cpu())
            assert torch.equal(outputs['results']['gt'],
                               data_batch['gt'].cpu())
            assert torch.is_tensor(outputs['results']['output'])
            assert outputs['results']['output'].size() == (5, 3, 256, 256)

    # test disc_steps and disc_init_steps and start_iter
    data_batch = {
        'lq': inputs.cpu(),
        'gt': targets.cpu(),
        'gt_unsharp': targets.cpu()
    }
    train_cfg = dict(disc_steps=2, disc_init_steps=2, start_iter=0)
    restorer = build_model(model_cfg, train_cfg=train_cfg, test_cfg=test_cfg)
    with patch.object(restorer,
                      'perceptual_loss',
                      return_value=(torch.tensor(1.0), torch.tensor(2.0))):
        outputs = restorer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        for v in ['loss_d_real', 'loss_d_fake']:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['lq'], data_batch['lq'])
        assert torch.equal(outputs['results']['gt'], data_batch['gt'])
        assert torch.is_tensor(outputs['results']['output'])
        assert outputs['results']['output'].size() == (5, 3, 256, 256)

    # test without pixel loss and perceptual loss
    model_cfg_ = model_cfg.copy()
    model_cfg_.pop('pixel_loss')
    restorer = build_model(model_cfg_, train_cfg=None, test_cfg=None)

    outputs = restorer.train_step(data_batch, optimizer)
    assert isinstance(outputs, dict)
    assert isinstance(outputs['log_vars'], dict)
    for v in ['loss_gan', 'loss_d_real', 'loss_d_fake']:
        assert isinstance(outputs['log_vars'][v], float)
    assert outputs['num_samples'] == 1
    assert torch.equal(outputs['results']['lq'], data_batch['lq'])
    assert torch.equal(outputs['results']['gt'], data_batch['gt'])
    assert torch.is_tensor(outputs['results']['output'])
    assert outputs['results']['output'].size() == (5, 3, 256, 256)

    # test train_step w/o loss_percep
    restorer = build_model(model_cfg, train_cfg=None, test_cfg=None)
    with patch.object(restorer,
                      'perceptual_loss',
                      return_value=(None, torch.tensor(2.0))):
        outputs = restorer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        for v in [
                'loss_style', 'loss_gan', 'loss_d_real', 'loss_d_fake',
                'loss_pix', 'loss_clean'
        ]:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['lq'], data_batch['lq'])
        assert torch.equal(outputs['results']['gt'], data_batch['gt'])
        assert torch.is_tensor(outputs['results']['output'])
        assert outputs['results']['output'].size() == (5, 3, 256, 256)

    # test train_step w/o loss_style
    restorer = build_model(model_cfg, train_cfg=None, test_cfg=None)
    with patch.object(restorer,
                      'perceptual_loss',
                      return_value=(torch.tensor(2.0), None)):
        outputs = restorer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        for v in [
                'loss_perceptual', 'loss_gan', 'loss_d_real', 'loss_d_fake',
                'loss_pix', 'loss_clean'
        ]:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['lq'], data_batch['lq'])
        assert torch.equal(outputs['results']['gt'], data_batch['gt'])
        assert torch.is_tensor(outputs['results']['output'])
        assert outputs['results']['output'].size() == (5, 3, 256, 256)
コード例 #26
0
def test_real_esrgan():

    model_cfg = dict(
        type='RealESRGAN',
        generator=dict(
            type='MSRResNet',
            in_channels=3,
            out_channels=3,
            mid_channels=4,
            num_blocks=1,
            upscale_factor=4),
        discriminator=dict(type='ModifiedVGG', in_channels=3, mid_channels=2),
        pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'),
        gan_loss=dict(
            type='GANLoss',
            gan_type='vanilla',
            loss_weight=1e-1,
            real_label_val=1.0,
            fake_label_val=0),
        is_use_sharpened_gt_in_pixel=True,
        is_use_sharpened_gt_in_percep=True,
        is_use_sharpened_gt_in_gan=True,
        is_use_ema=True,
    )

    train_cfg = None
    test_cfg = None

    # build restorer
    restorer = build_model(model_cfg, train_cfg=train_cfg, test_cfg=test_cfg)

    # test attributes
    assert restorer.__class__.__name__ == 'RealESRGAN'
    assert isinstance(restorer.generator, MSRResNet)
    assert isinstance(restorer.discriminator, ModifiedVGG)
    assert isinstance(restorer.pixel_loss, L1Loss)
    assert isinstance(restorer.gan_loss, GANLoss)

    # prepare data
    inputs = torch.rand(1, 3, 32, 32)
    targets = torch.rand(1, 3, 128, 128)
    data_batch = {'lq': inputs, 'gt': targets, 'gt_unsharp': targets}

    # prepare optimizer
    optim_cfg = dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))
    optimizer = {
        'generator':
        obj_from_dict(optim_cfg, torch.optim,
                      dict(
                          params=getattr(restorer, 'generator').parameters())),
        'discriminator':
        obj_from_dict(
            optim_cfg, torch.optim,
            dict(params=getattr(restorer, 'discriminator').parameters()))
    }

    # no forward train in GAN models, raise ValueError
    with pytest.raises(ValueError):
        restorer(**data_batch, test_mode=False)

    # test forward_test
    data_batch.pop('gt_unsharp')
    with torch.no_grad():
        outputs = restorer(**data_batch, test_mode=True)
    assert torch.equal(outputs['lq'], data_batch['lq'])
    assert torch.is_tensor(outputs['output'])
    assert outputs['output'].size() == (1, 3, 128, 128)

    # test forward_dummy
    with torch.no_grad():
        output = restorer.forward_dummy(data_batch['lq'])
    assert torch.is_tensor(output)
    assert output.size() == (1, 3, 128, 128)

    # val_step
    with torch.no_grad():
        outputs = restorer.val_step(data_batch)
    data_batch['gt_unsharp'] = targets
    assert torch.equal(outputs['lq'], data_batch['lq'])
    assert torch.is_tensor(outputs['output'])
    assert outputs['output'].size() == (1, 3, 128, 128)

    # test train_step
    with patch.object(
            restorer,
            'perceptual_loss',
            return_value=(torch.tensor(1.0), torch.tensor(2.0))):
        outputs = restorer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        for v in [
                'loss_perceptual', 'loss_gan', 'loss_d_real', 'loss_d_fake',
                'loss_pix'
        ]:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['lq'], data_batch['lq'])
        assert torch.equal(outputs['results']['gt'], data_batch['gt'])
        assert torch.is_tensor(outputs['results']['output'])
        assert outputs['results']['output'].size() == (1, 3, 128, 128)

    # test train_step and forward_test (gpu)
    if torch.cuda.is_available():
        restorer = restorer.cuda()
        optimizer = {
            'generator':
            obj_from_dict(
                optim_cfg, torch.optim,
                dict(params=getattr(restorer, 'generator').parameters())),
            'discriminator':
            obj_from_dict(
                optim_cfg, torch.optim,
                dict(params=getattr(restorer, 'discriminator').parameters()))
        }
        data_batch = {
            'lq': inputs.cuda(),
            'gt': targets.cuda(),
            'gt_unsharp': targets.cuda()
        }

        # forward_test
        data_batch.pop('gt_unsharp')
        with torch.no_grad():
            outputs = restorer(**data_batch, test_mode=True)
        assert torch.equal(outputs['lq'], data_batch['lq'].cpu())
        assert torch.is_tensor(outputs['output'])
        assert outputs['output'].size() == (1, 3, 128, 128)

        # val_step
        with torch.no_grad():
            outputs = restorer.val_step(data_batch)
        data_batch['gt_unsharp'] = targets.cuda()
        assert torch.equal(outputs['lq'], data_batch['lq'].cpu())
        assert torch.is_tensor(outputs['output'])
        assert outputs['output'].size() == (1, 3, 128, 128)

        # train_step
        with patch.object(
                restorer,
                'perceptual_loss',
                return_value=(torch.tensor(1.0).cuda(),
                              torch.tensor(2.0).cuda())):
            outputs = restorer.train_step(data_batch, optimizer)
            assert isinstance(outputs, dict)
            assert isinstance(outputs['log_vars'], dict)
            for v in [
                    'loss_perceptual', 'loss_gan', 'loss_d_real',
                    'loss_d_fake', 'loss_pix'
            ]:
                assert isinstance(outputs['log_vars'][v], float)
            assert outputs['num_samples'] == 1
            assert torch.equal(outputs['results']['lq'],
                               data_batch['lq'].cpu())
            assert torch.equal(outputs['results']['gt'],
                               data_batch['gt'].cpu())
            assert torch.is_tensor(outputs['results']['output'])
            assert outputs['results']['output'].size() == (1, 3, 128, 128)

    # test disc_steps and disc_init_steps and start_iter
    data_batch = {
        'lq': inputs.cpu(),
        'gt': targets.cpu(),
        'gt_unsharp': targets.cpu()
    }
    train_cfg = dict(disc_steps=2, disc_init_steps=2, start_iter=0)
    restorer = build_model(model_cfg, train_cfg=train_cfg, test_cfg=test_cfg)
    with patch.object(
            restorer,
            'perceptual_loss',
            return_value=(torch.tensor(1.0), torch.tensor(2.0))):
        outputs = restorer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        for v in ['loss_d_real', 'loss_d_fake']:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['lq'], data_batch['lq'])
        assert torch.equal(outputs['results']['gt'], data_batch['gt'])
        assert torch.is_tensor(outputs['results']['output'])
        assert outputs['results']['output'].size() == (1, 3, 128, 128)

    # test no discriminator (testing mode)
    model_cfg_ = model_cfg.copy()
    model_cfg_.pop('discriminator')
    restorer = build_model(model_cfg_, train_cfg=train_cfg, test_cfg=test_cfg)
    data_batch.pop('gt_unsharp')
    with torch.no_grad():
        outputs = restorer(**data_batch, test_mode=True)
    data_batch['gt_unsharp'] = targets.cpu()
    assert torch.equal(outputs['lq'], data_batch['lq'])
    assert torch.is_tensor(outputs['output'])
    assert outputs['output'].size() == (1, 3, 128, 128)

    # test without pixel loss and perceptual loss
    model_cfg_ = model_cfg.copy()
    model_cfg_.pop('pixel_loss')
    restorer = build_model(model_cfg_, train_cfg=None, test_cfg=None)

    outputs = restorer.train_step(data_batch, optimizer)
    assert isinstance(outputs, dict)
    assert isinstance(outputs['log_vars'], dict)
    for v in ['loss_gan', 'loss_d_real', 'loss_d_fake']:
        assert isinstance(outputs['log_vars'][v], float)
    assert outputs['num_samples'] == 1
    assert torch.equal(outputs['results']['lq'], data_batch['lq'])
    assert torch.equal(outputs['results']['gt'], data_batch['gt'])
    assert torch.is_tensor(outputs['results']['output'])
    assert outputs['results']['output'].size() == (1, 3, 128, 128)

    # test train_step w/o loss_percep
    restorer = build_model(model_cfg, train_cfg=None, test_cfg=None)
    with patch.object(
            restorer, 'perceptual_loss',
            return_value=(None, torch.tensor(2.0))):
        outputs = restorer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        for v in [
                'loss_style', 'loss_gan', 'loss_d_real', 'loss_d_fake',
                'loss_pix'
        ]:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['lq'], data_batch['lq'])
        assert torch.equal(outputs['results']['gt'], data_batch['gt'])
        assert torch.is_tensor(outputs['results']['output'])
        assert outputs['results']['output'].size() == (1, 3, 128, 128)

    # test train_step w/o loss_style
    restorer = build_model(model_cfg, train_cfg=None, test_cfg=None)
    with patch.object(
            restorer, 'perceptual_loss',
            return_value=(torch.tensor(2.0), None)):
        outputs = restorer.train_step(data_batch, optimizer)
        assert isinstance(outputs, dict)
        assert isinstance(outputs['log_vars'], dict)
        for v in [
                'loss_perceptual', 'loss_gan', 'loss_d_real', 'loss_d_fake',
                'loss_pix'
        ]:
            assert isinstance(outputs['log_vars'][v], float)
        assert outputs['num_samples'] == 1
        assert torch.equal(outputs['results']['lq'], data_batch['lq'])
        assert torch.equal(outputs['results']['gt'], data_batch['gt'])
        assert torch.is_tensor(outputs['results']['output'])
        assert outputs['results']['output'].size() == (1, 3, 128, 128)
コード例 #27
0
ファイル: utils.py プロジェクト: wennieWN/mmdet_SA-SSD
def get_dataset(data_cfg):

    if isinstance(data_cfg['ann_file'], (list, tuple)):
        ann_files = data_cfg['ann_file']
        num_dset = len(ann_files)
    else:
        ann_files = [data_cfg['ann_file']]
        num_dset = 1

    if isinstance(data_cfg['img_prefix'], (list, tuple)):
        img_prefixes = data_cfg['img_prefix']
    else:
        img_prefixes = [data_cfg['img_prefix']] * num_dset
    assert len(img_prefixes) == num_dset

    if 'generator' in data_cfg.keys() and data_cfg['generator'] is not None:
        generator = obj_from_dict(data_cfg['generator'], voxel_generator)               # 生成VOXEL
    else:
        generator = None

    if 'augmentor' in data_cfg.keys() and data_cfg['augmentor'] is not None:
        augmentor = obj_from_dict(data_cfg['augmentor'], point_augmentor)
    else:
        augmentor = None

    if 'anchor_generator' in data_cfg.keys() and data_cfg['anchor_generator'] is not None:      # Anchor
        anchor_generator = {cls: obj_from_dict(cfg, anchor3d_generator) for cls, cfg in data_cfg['anchor_generator'].items()}
    else:
        anchor_generator = None

    dsets = []
    for i in range(num_dset):
        data_info = copy.deepcopy(data_cfg)
        data_info['ann_file'] = ann_files[i]
        data_info['img_prefix'] = img_prefixes[i]
        if generator is not None:
            data_info['generator'] = generator
        if anchor_generator is not None:
            data_info['anchor_generator'] = anchor_generator
        if augmentor is not None:
            data_info['augmentor'] = augmentor
        dset = obj_from_dict(data_info, datasets)
        dsets.append(dset)
    if len(dsets) > 1:
        dset = ConcatDataset(dsets)
    else:
        dset = dsets[0]
    return dset

# def example_convert_to_torch(example, device=None) -> dict:
#     example_torch = {}
#     torch_names = [
#         'img', 'voxels','coordinates',\
#         # 'anchors_mask','anchors',\
#         #'gt_labels','gt_bboxes','gt_bboxes_ignore',\
#         'num_points', 'right', 'grid'
#     ]
#     for k, v in example.items():
#         if k in torch_names:
#             example_torch[k] = to_tensor(v)
#         else:
#             example_torch[k] = v
#
#     return example_torch

# def merge_second_batch(batch_list, samples_per_gpu=1, to_torch=True):
#     example_merged = defaultdict(list)
#     for example in batch_list:
#         for k, v in example.items():
#             example_merged[k].append(v)
#     ret = {}
#
#     for key, elems in example_merged.items():
#         if key in [
#             'voxels', 'num_points',
#         ]:
#             ret[key] = np.concatenate(elems, axis=0)
#         elif key == 'coordinates':
#             coors = []
#             for i, coor in enumerate(elems):
#                 coor_pad = np.pad(
#                     coor, ((0, 0), (1, 0)),
#                     mode='constant',
#                     constant_values=i)
#                 coors.append(coor_pad)
#             ret[key] = np.concatenate(coors, axis=0)
#         elif key in [
#             'img_meta', 'img_shape', 'calib', 'sample_idx', 'gt_labels', 'gt_bboxes','gt_bboxes_ignore'
#         ]:
#             ret[key] = elems
#         else:
#             ret[key] = np.stack(elems, axis=0)
#
#     if to_torch:
#         ret = example_convert_to_torch(ret)
#     return ret
コード例 #28
0
ファイル: builder.py プロジェクト: zzmcdc/mmdetection
def _build_module(cfg, parrent=None, default_args=None):
    return cfg if isinstance(cfg, nn.Module) else obj_from_dict(
        cfg, parrent, default_args)
コード例 #29
0
def test_flat_and_anneal():
    from mmcv import Config
    import numpy as np

    model = resnet18()
    base_lr = 1e-4
    optimizer_cfg = dict(type="Adam", lr=base_lr, weight_decay=0)
    optimizer = obj_from_dict(optimizer_cfg, torch.optim, dict(params=model.parameters()))

    # learning policy
    total_epochs = 80
    epoch_len = 500
    total_iters = epoch_len * total_epochs // 2
    # poly, step, linear, exp, cosine
    lr_cfg = Config(
        dict(
            # anneal_method="cosine",
            # anneal_method="linear",
            # anneal_method="poly",
            # anneal_method="exp",
            anneal_method="step",
            warmup_method="linear",
            step_gamma=0.1,
            warmup_factor=0.1,
            warmup_iters=800,
            poly_power=5,
            target_lr_factor=0.0,
            steps=[0.5, 0.75, 0.9],
            anneal_point=0.72,
        )
    )

    # scheduler = build_scheduler(lr_config, optimizer, epoch_length)
    scheduler = flat_and_anneal_lr_scheduler(
        optimizer=optimizer,
        total_iters=total_iters,
        warmup_method=lr_cfg.warmup_method,
        warmup_factor=lr_cfg.warmup_factor,
        warmup_iters=lr_cfg.warmup_iters,
        anneal_method=lr_cfg.anneal_method,
        anneal_point=lr_cfg.anneal_point,
        target_lr_factor=lr_cfg.target_lr_factor,
        poly_power=lr_cfg.poly_power,
        step_gamma=lr_cfg.step_gamma,
        steps=lr_cfg.steps,
    )
    print("start lr: {}".format(scheduler.get_lr()))
    steps = []
    lrs = []

    epoch_lrs = []
    global_step = 0

    start_epoch = 0
    for epoch in range(start_epoch):
        for batch in range(epoch_len):
            scheduler.step()  # when no state_dict availble
            global_step += 1

    for epoch in range(start_epoch, total_epochs):
        # if global_step >= lr_config['warmup_iters']:
        #     scheduler.step(epoch)
        # print(type(scheduler.get_lr()[0]))
        # import pdb;pdb.set_trace()
        epoch_lrs.append([epoch, scheduler.get_lr()[0]])  # only get the first lr (maybe a group of lrs)
        for batch in range(epoch_len):
            # if global_step < lr_config['warmup_iters']:
            #     scheduler.step(global_step)
            cur_lr = scheduler.get_lr()[0]
            if global_step == 0 or (len(lrs) >= 1 and cur_lr != lrs[-1]):
                print("epoch {}, batch: {}, global_step:{} lr: {}".format(epoch, batch, global_step, cur_lr))
            steps.append(global_step)
            lrs.append(cur_lr)
            global_step += 1
            scheduler.step()  # usually after optimizer.step()
    # print(epoch_lrs)
    # import pdb;pdb.set_trace()
    # epoch_lrs.append([total_epochs, scheduler.get_lr()[0]])

    epoch_lrs = np.asarray(epoch_lrs, dtype=np.float32)
    for i in range(len(epoch_lrs)):
        print("{:02d} {}".format(int(epoch_lrs[i][0]), epoch_lrs[i][1]))

    plt.figure(dpi=100)
    plt.suptitle("{}".format(dict(lr_cfg)), size=4)
    plt.subplot(1, 2, 1)
    plt.plot(steps, lrs, "-.")
    # plt.show()
    plt.subplot(1, 2, 2)
    # print(epoch_lrs.dtype)
    plt.plot(epoch_lrs[:, 0], epoch_lrs[:, 1], "-.")
    plt.show()
コード例 #30
0
ファイル: train.py プロジェクト: Anonymous-Pi-NAS/Pi-NAS
def build_optimizer(model, optimizer_cfg):
    """Build optimizer from configs.

    Args:
        model (:obj:`nn.Module`): The model with parameters to be optimized.
        optimizer_cfg (dict): The config dict of the optimizer.
            Positional fields are:
                - type: class name of the optimizer.
                - lr: base learning rate.
            Optional fields are:
                - any arguments of the corresponding optimizer type, e.g.,
                  weight_decay, momentum, etc.
                - paramwise_options: a dict with regular expression as keys
                  to match parameter names and a dict containing options as
                  values. Options include 6 fields: lr, lr_mult, momentum,
                  momentum_mult, weight_decay, weight_decay_mult.

    Returns:
        torch.optim.Optimizer: The initialized optimizer.

    Example:
        >>> model = torch.nn.modules.Conv1d(1, 1, 1)
        >>> paramwise_options = {
        >>>     '(bn|gn)(\d+)?.(weight|bias)': dict(weight_decay_mult=0.1),
        >>>     '\Ahead.': dict(lr_mult=10, momentum=0)}
        >>> optimizer_cfg = dict(type='SGD', lr=0.01, momentum=0.9,
        >>>                      weight_decay=0.0001,
        >>>                      paramwise_options=paramwise_options)
        >>> optimizer = build_optimizer(model, optimizer_cfg)
    """
    if hasattr(model, 'module'):
        model = model.module

    optimizer_cfg = optimizer_cfg.copy()
    paramwise_options = optimizer_cfg.pop('paramwise_options', None)
    # if no paramwise option is specified, just use the global setting
    if paramwise_options is None:
        return obj_from_dict(optimizer_cfg, optimizers,
                             dict(params=model.parameters()))
    else:
        assert isinstance(paramwise_options, dict)
        params = []
        for name, param in model.named_parameters():
            param_group = {'params': [param]}
            if not param.requires_grad:
                params.append(param_group)
                continue

            for regexp, options in paramwise_options.items():
                if re.search(regexp, name):
                    for key, value in options.items():
                        if key.endswith('_mult'):  # is a multiplier
                            key = key[:-5]
                            assert key in optimizer_cfg, \
                                "{} not in optimizer_cfg".format(key)
                            value = optimizer_cfg[key] * value
                        param_group[key] = value
                        if not dist.is_initialized() or dist.get_rank() == 0:
                            print_log('paramwise_options -- {}: {}={}'.format(
                                name, key, value))

            # otherwise use the global settings
            params.append(param_group)

        optimizer_cls = getattr(optimizers, optimizer_cfg.pop('type'))
        return optimizer_cls(params, **optimizer_cfg)