| |
| import argparse |
| import os.path as osp |
| from copy import deepcopy |
|
|
| from mmengine import DictAction |
|
|
| from mmdeploy.apis import build_task_processor |
| from mmdeploy.utils.config_utils import load_config |
| from mmdeploy.utils.timer import TimeCounter |
|
|
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser( |
| description='MMDeploy test (and eval) a backend.') |
| parser.add_argument('deploy_cfg', help='Deploy config path') |
| parser.add_argument('model_cfg', help='Model config path') |
| parser.add_argument( |
| '--model', type=str, nargs='+', help='Input model files.') |
| parser.add_argument( |
| '--device', help='device used for conversion', default='cpu') |
| parser.add_argument( |
| '--work-dir', |
| default='./work_dir', |
| help='the directory to save the file containing evaluation metrics') |
| parser.add_argument( |
| '--cfg-options', |
| nargs='+', |
| action=DictAction, |
| help='override some settings in the used config, the key-value pair ' |
| 'in xxx=yyy format will be merged into config file. If the value to ' |
| 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' |
| 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' |
| 'Note that the quotation marks are necessary and that no white space ' |
| 'is allowed.') |
| parser.add_argument('--show', action='store_true', help='show results') |
| parser.add_argument( |
| '--show-dir', help='directory where painted images will be saved') |
| parser.add_argument( |
| '--interval', |
| type=int, |
| default=1, |
| help='visualize per interval samples.') |
| parser.add_argument( |
| '--wait-time', |
| type=float, |
| default=2, |
| help='display time of every window. (second)') |
| parser.add_argument( |
| '--log2file', |
| type=str, |
| help='log evaluation results and speed to file', |
| default=None) |
| parser.add_argument( |
| '--speed-test', action='store_true', help='activate speed test') |
| parser.add_argument( |
| '--warmup', |
| type=int, |
| help='warmup before counting inference elapse, require setting ' |
| 'speed-test first', |
| default=10) |
| parser.add_argument( |
| '--log-interval', |
| type=int, |
| help='the interval between each log, require setting ' |
| 'speed-test first', |
| default=100) |
| parser.add_argument( |
| '--batch-size', |
| type=int, |
| default=1, |
| help='the batch size for test, would override `samples_per_gpu`' |
| 'in data config.') |
| parser.add_argument( |
| '--uri', |
| action='store_true', |
| default='192.168.1.1:60000', |
| help='Remote ipv4:port or ipv6:port for inference on edge device.') |
|
|
| args = parser.parse_args() |
| return args |
|
|
|
|
| def main(): |
| args = parse_args() |
| deploy_cfg_path = args.deploy_cfg |
| model_cfg_path = args.model_cfg |
|
|
| |
| deploy_cfg, model_cfg = load_config(deploy_cfg_path, model_cfg_path) |
|
|
| |
| if args.work_dir is not None: |
| |
| work_dir = args.work_dir |
| elif model_cfg.get('work_dir', None) is None: |
| |
| work_dir = osp.join('./work_dirs', |
| osp.splitext(osp.basename(args.config))[0]) |
|
|
| |
| if args.cfg_options is not None: |
| model_cfg.merge_from_dict(args.cfg_options) |
|
|
| task_processor = build_task_processor(model_cfg, deploy_cfg, args.device) |
|
|
| |
| test_dataloader = deepcopy(model_cfg['test_dataloader']) |
| if isinstance(test_dataloader, list): |
| dataset = [] |
| for loader in test_dataloader: |
| ds = task_processor.build_dataset(loader['dataset']) |
| dataset.append(ds) |
| loader['dataset'] = ds |
| loader['batch_size'] = args.batch_size |
| loader = task_processor.build_dataloader(loader) |
| dataloader = test_dataloader |
| else: |
| test_dataloader['batch_size'] = args.batch_size |
| dataset = task_processor.build_dataset(test_dataloader['dataset']) |
| test_dataloader['dataset'] = dataset |
| dataloader = task_processor.build_dataloader(test_dataloader) |
|
|
| |
| model = task_processor.build_backend_model( |
| args.model, |
| data_preprocessor_updater=task_processor.update_data_preprocessor) |
| destroy_model = model.destroy |
| is_device_cpu = (args.device == 'cpu') |
|
|
| runner = task_processor.build_test_runner( |
| model, |
| work_dir, |
| log_file=args.log2file, |
| show=args.show, |
| show_dir=args.show_dir, |
| wait_time=args.wait_time, |
| interval=args.interval, |
| dataloader=dataloader) |
|
|
| if args.speed_test: |
| with_sync = not is_device_cpu |
|
|
| with TimeCounter.activate( |
| warmup=args.warmup, |
| log_interval=args.log_interval, |
| with_sync=with_sync, |
| file=args.log2file, |
| batch_size=args.batch_size): |
| runner.test() |
|
|
| else: |
| runner.test() |
| |
| destroy_model() |
|
|
|
|
| if __name__ == '__main__': |
| main() |
|
|