import argparse import torch import mmcv from mmcv.torchpack import load_checkpoint, parallel_test, obj_from_dict from mmdet import datasets from mmdet.core import scatter, MMDataParallel, results2json, coco_eval from mmdet.datasets.loader import collate, build_dataloader from mmdet.models import build_detector, detectors def single_test(model, data_loader, show=False): model.eval() results = [] prog_bar = mmcv.ProgressBar(len(data_loader.dataset)) for i, data in enumerate(data_loader): with torch.no_grad(): result = model(**data, return_loss=False, rescale=not show) results.append(result) if show: model.module.show_result(data, result, data_loader.dataset.img_norm_cfg) batch_size = data['img'][0].size(0) for _ in range(batch_size): prog_bar.update() return results def _data_func(data, device_id): data = scatter(collate([data], samples_per_gpu=1), [device_id])[0] return dict(**data, return_loss=False, rescale=True) def parse_args(): parser = argparse.ArgumentParser(description='MMDet test detector') parser.add_argument('config', help='test config file path') parser.add_argument('checkpoint', help='checkpoint file') parser.add_argument('--gpus', default=1, type=int) parser.add_argument('--out', help='output result file') parser.add_argument( '--eval', type=str, nargs='+', choices=['proposal', 'bbox', 'segm', 'keypoints'], help='eval types') parser.add_argument('--show', action='store_true', help='show results') args = parser.parse_args() return args args = parse_args() def main(): 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)) if args.out: mmcv.dump(outputs, args.out) if args.eval: json_file = args.out + '.json' results2json(dataset, outputs, json_file) coco_eval(json_file, args.eval, dataset.coco) if __name__ == '__main__': main()