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
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
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)
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)
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
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
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()
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))
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)
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
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()
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
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
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)
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)
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)
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)
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)
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)
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)
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)
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))
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']
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))
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)
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)
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
def _build_module(cfg, parrent=None, default_args=None): return cfg if isinstance(cfg, nn.Module) else obj_from_dict( cfg, parrent, default_args)
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()
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)