# Tutorial 8: Pytorch to ONNX (Experimental) - [Tutorial 8: Pytorch to ONNX (Experimental)](#tutorial-8-pytorch-to-onnx-experimental) - [How to convert models from Pytorch to ONNX](#how-to-convert-models-from-pytorch-to-onnx) - [Prerequisite](#prerequisite) - [Usage](#usage) - [Description of all arguments](#description-of-all-arguments) - [How to evaluate the exported models](#how-to-evaluate-the-exported-models) - [Prerequisite](#prerequisite-1) - [Usage](#usage-1) - [Description of all arguments](#description-of-all-arguments-1) - [Results and Models](#results-and-models) - [List of supported models exportable to ONNX](#list-of-supported-models-exportable-to-onnx) - [The Parameters of Non-Maximum Suppression in ONNX Export](#the-parameters-of-non-maximum-suppression-in-onnx-export) - [Reminders](#reminders) - [FAQs](#faqs) ## How to convert models from Pytorch to ONNX ### Prerequisite 1. Install the prerequisites following [get_started.md/Prepare environment](../get_started.md). 2. Build custom operators for ONNX Runtime and install MMCV manually following [How to build custom operators for ONNX Runtime](https://github.com/open-mmlab/mmcv/blob/master/docs/deployment/onnxruntime_op.md/#how-to-build-custom-operators-for-onnx-runtime) 3. Install MMdetection manually following steps 2-3 in [get_started.md/Install MMdetection](../get_started.md). ### Usage ```bash python tools/deployment/pytorch2onnx.py \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ --output-file ${OUTPUT_FILE} \ --input-img ${INPUT_IMAGE_PATH} \ --shape ${IMAGE_SHAPE} \ --test-img ${TEST_IMAGE_PATH} \ --opset-version ${OPSET_VERSION} \ --cfg-options ${CFG_OPTIONS} --dynamic-export \ --show \ --verify \ --simplify \ ``` ### Description of all arguments - `config` : The path of a model config file. - `checkpoint` : The path of a model checkpoint file. - `--output-file`: The path of output ONNX model. If not specified, it will be set to `tmp.onnx`. - `--input-img`: The path of an input image for tracing and conversion. By default, it will be set to `tests/data/color.jpg`. - `--shape`: The height and width of input tensor to the model. If not specified, it will be set to `800 1216`. - `--test-img` : The path of an image to verify the exported ONNX model. By default, it will be set to `None`, meaning it will use `--input-img` for verification. - `--opset-version` : The opset version of ONNX. If not specified, it will be set to `11`. - `--dynamic-export`: Determines whether to export ONNX model with dynamic input and output shapes. If not specified, it will be set to `False`. - `--show`: Determines whether to print the architecture of the exported model and whether to show detection outputs when `--verify` is set to `True`. If not specified, it will be set to `False`. - `--verify`: Determines whether to verify the correctness of an exported model. If not specified, it will be set to `False`. - `--simplify`: Determines whether to simplify the exported ONNX model. If not specified, it will be set to `False`. - `--cfg-options`: Override some settings in the used config file, the key-value pair in `xxx=yyy` format will be merged into config file. - `--skip-postprocess`: Determines whether export model without post process. If not specified, it will be set to `False`. Notice: This is an experimental option. Only work for some single stage models. Users need to implement the post-process by themselves. We do not guarantee the correctness of the exported model. Example: ```bash python tools/deployment/pytorch2onnx.py \ configs/yolo/yolov3_d53_mstrain-608_273e_coco.py \ checkpoints/yolo/yolov3_d53_mstrain-608_273e_coco.pth \ --output-file checkpoints/yolo/yolov3_d53_mstrain-608_273e_coco.onnx \ --input-img demo/demo.jpg \ --test-img tests/data/color.jpg \ --shape 608 608 \ --show \ --verify \ --dynamic-export \ --cfg-options \ model.test_cfg.deploy_nms_pre=-1 \ ``` ## How to evaluate the exported models We prepare a tool `tools/deplopyment/test.py` to evaluate ONNX models with ONNXRuntime and TensorRT. ### Prerequisite - Install onnx and onnxruntime (CPU version) ```shell pip install onnx onnxruntime==1.5.1 ``` - If you want to run the model on GPU, please remove the CPU version before using the GPU version. ```shell pip uninstall onnxruntime pip install onnxruntime-gpu ``` Note: onnxruntime-gpu is version-dependent on CUDA and CUDNN, please ensure that your environment meets the requirements. - Build custom operators for ONNX Runtime following [How to build custom operators for ONNX Runtime](https://github.com/open-mmlab/mmcv/blob/master/docs/deployment/onnxruntime_op.md/#how-to-build-custom-operators-for-onnx-runtime) - Install TensorRT by referring to [How to build TensorRT plugins in MMCV](https://mmcv.readthedocs.io/en/latest/deployment/tensorrt_plugin.html#how-to-build-tensorrt-plugins-in-mmcv) (optional) ### Usage ```bash python tools/deployment/test.py \ ${CONFIG_FILE} \ ${MODEL_FILE} \ --out ${OUTPUT_FILE} \ --backend ${BACKEND} \ --format-only ${FORMAT_ONLY} \ --eval ${EVALUATION_METRICS} \ --show-dir ${SHOW_DIRECTORY} \ ----show-score-thr ${SHOW_SCORE_THRESHOLD} \ ----cfg-options ${CFG_OPTIONS} \ ----eval-options ${EVALUATION_OPTIONS} \ ``` ### Description of all arguments - `config`: The path of a model config file. - `model`: The path of an input model file. - `--out`: The path of output result file in pickle format. - `--backend`: Backend for input model to run and should be `onnxruntime` or `tensorrt`. - `--format-only` : Format the output results without perform evaluation. It is useful when you want to format the result to a specific format and submit it to the test server. If not specified, it will be set to `False`. - `--eval`: Evaluation metrics, which depends on the dataset, e.g., "bbox", "segm", "proposal" for COCO, and "mAP", "recall" for PASCAL VOC. - `--show-dir`: Directory where painted images will be saved - `--show-score-thr`: Score threshold. Default is set to `0.3`. - `--cfg-options`: Override some settings in the used config file, the key-value pair in `xxx=yyy` format will be merged into config file. - `--eval-options`: Custom options for evaluation, the key-value pair in `xxx=yyy` format will be kwargs for `dataset.evaluate()` function Notes: - If the deployed backend platform is TensorRT, please add environment variables before running the file: ```bash export ONNX_BACKEND=MMCVTensorRT ``` - If you want to use the `--dynamic-export` parameter in the TensorRT backend to export ONNX, please remove the `--simplify` parameter, and vice versa. ### Results and Models
| Model | Config | Metric | PyTorch | ONNX Runtime | TensorRT |
|---|---|---|---|---|---|
| FCOS | configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py |
Box AP | 36.6 | 36.5 | 36.3 |
| FSAF | configs/fsaf/fsaf_r50_fpn_1x_coco.py |
Box AP | 36.0 | 36.0 | 35.9 |
| RetinaNet | configs/retinanet/retinanet_r50_fpn_1x_coco.py |
Box AP | 36.5 | 36.4 | 36.3 |
| SSD | configs/ssd/ssd300_coco.py |
Box AP | 25.6 | 25.6 | 25.6 |
| YOLOv3 | configs/yolo/yolov3_d53_mstrain-608_273e_coco.py |
Box AP | 33.5 | 33.5 | 33.5 |
| Faster R-CNN | configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py |
Box AP | 37.4 | 37.4 | 37.0 |
| Cascade R-CNN | configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py |
Box AP | 40.3 | 40.3 | 40.1 |
| Mask R-CNN | configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py |
Box AP | 38.2 | 38.1 | 37.7 |
| Mask AP | 34.7 | 33.7 | 33.3 | ||
| Cascade Mask R-CNN | configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py |
Box AP | 41.2 | 41.2 | 40.9 |
| Mask AP | 35.9 | 34.8 | 34.5 | ||
| CornerNet | configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py |
Box AP | 40.6 | 40.4 | - |
| DETR | configs/detr/detr_r50_8x2_150e_coco.py |
Box AP | 40.1 | 40.1 | - |
| PointRend | configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py |
Box AP | 38.4 | 38.4 | - |
| Mask AP | 36.3 | 35.2 | - |