# Copyright (c) OpenMMLab. All rights reserved. """Deploy demo for mmdeploy. This script help user to run mmdeploy demo after convert the checkpoint to backends. Usage: python deploy_demo.py img \ config \ checkpoint \ [--deploy-cfg DEPLOY_CFG] \ [--device DEVICE] \ [--out-dir OUT_DIR] \ [--show] \ [--score-thr SCORE_THR] Example: python deploy_demo.py \ ${MMYOLO_PATH}/data/cat/images \ ./yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \ ./end2end.engine \ --deploy-cfg ./detection_tensorrt-fp16_dynamic-192x192-960x960.py \ --out-dir ${MMYOLO_PATH}/work_dirs/deploy_predict_out \ --device cuda:0 \ --score-thr 0.5 """ import argparse import os import torch from mmengine import ProgressBar from mmyolo.utils.misc import get_file_list try: from mmdeploy.apis.utils import build_task_processor from mmdeploy.utils import get_input_shape, load_config except ImportError: raise ImportError( 'mmdeploy is not installed, please see ' 'https://mmdeploy.readthedocs.io/en/1.x/01-how-to-build/build_from_source.html' # noqa ) def parse_args(): parser = argparse.ArgumentParser(description='For mmdeploy predict') parser.add_argument( 'img', help='Image path, include image file, dir and URL.') parser.add_argument('config', help='model config root') parser.add_argument('checkpoint', help='checkpoint backend model path') parser.add_argument('--deploy-cfg', help='deploy config path') parser.add_argument( '--device', default='cuda:0', help='device used for conversion') parser.add_argument( '--out-dir', default='./output', help='Path to output file') parser.add_argument( '--show', action='store_true', help='Show the detection results') parser.add_argument( '--score-thr', type=float, default=0.3, help='Bbox score threshold') args = parser.parse_args() return args # TODO Still need to refactor to not building dataset. def main(): args = parse_args() if not os.path.exists(args.out_dir) and not args.show: os.mkdir(args.out_dir) # read deploy_cfg and config deploy_cfg, model_cfg = load_config(args.deploy_cfg, args.config) # build task and backend model task_processor = build_task_processor(model_cfg, deploy_cfg, args.device) model = task_processor.build_backend_model([args.checkpoint]) # get model input shape input_shape = get_input_shape(deploy_cfg) # get file list files, source_type = get_file_list(args.img) # start detector inference progress_bar = ProgressBar(len(files)) for file in files: # process input image model_inputs, _ = task_processor.create_input(file, input_shape) # do model inference with torch.no_grad(): result = model.test_step(model_inputs) if source_type['is_dir']: filename = os.path.relpath(file, args.img).replace('/', '_') else: filename = os.path.basename(file) out_file = None if args.show else os.path.join(args.out_dir, filename) # filter score result = result[0] result.pred_instances = result.pred_instances[ result.pred_instances.scores > args.score_thr] # visualize results task_processor.visualize( image=file, model=model, result=result, show_result=args.show, window_name=os.path.basename(filename), output_file=out_file) progress_bar.update() print('All done!') if __name__ == '__main__': main()