pytorch-image-models
/
onnx_export.py
102 строки · 4.6 Кб
1""" ONNX export script
2
3Export PyTorch models as ONNX graphs.
4
5This export script originally started as an adaptation of code snippets found at
6https://pytorch.org/tutorials/advanced/super_resolution_with_onnxruntime.html
7
8The default parameters work with PyTorch 1.6 and ONNX 1.7 and produce an optimal ONNX graph
9for hosting in the ONNX runtime (see onnx_validate.py). To export an ONNX model compatible
10with caffe2 (see caffe2_benchmark.py and caffe2_validate.py), the --keep-init and --aten-fallback
11flags are currently required.
12
13Older versions of PyTorch/ONNX (tested PyTorch 1.4, ONNX 1.5) do not need extra flags for
14caffe2 compatibility, but they produce a model that isn't as fast running on ONNX runtime.
15
16Most new release of PyTorch and ONNX cause some sort of breakage in the export / usage of ONNX models.
17Please do your research and search ONNX and PyTorch issue tracker before asking me. Thanks.
18
19Copyright 2020 Ross Wightman
20"""
21import argparse22
23import timm24from timm.utils.model import reparameterize_model25from timm.utils.onnx import onnx_export26
27parser = argparse.ArgumentParser(description='PyTorch ImageNet Validation')28parser.add_argument('output', metavar='ONNX_FILE',29help='output model filename')30parser.add_argument('--model', '-m', metavar='MODEL', default='mobilenetv3_large_100',31help='model architecture (default: mobilenetv3_large_100)')32parser.add_argument('--opset', type=int, default=None,33help='ONNX opset to use (default: 10)')34parser.add_argument('--keep-init', action='store_true', default=False,35help='Keep initializers as input. Needed for Caffe2 compatible export in newer PyTorch/ONNX.')36parser.add_argument('--aten-fallback', action='store_true', default=False,37help='Fallback to ATEN ops. Helps fix AdaptiveAvgPool issue with Caffe2 in newer PyTorch/ONNX.')38parser.add_argument('--dynamic-size', action='store_true', default=False,39help='Export model width dynamic width/height. Not recommended for "tf" models with SAME padding.')40parser.add_argument('--check-forward', action='store_true', default=False,41help='Do a full check of torch vs onnx forward after export.')42parser.add_argument('-b', '--batch-size', default=1, type=int,43metavar='N', help='mini-batch size (default: 1)')44parser.add_argument('--img-size', default=None, type=int,45metavar='N', help='Input image dimension, uses model default if empty')46parser.add_argument('--mean', type=float, nargs='+', default=None, metavar='MEAN',47help='Override mean pixel value of dataset')48parser.add_argument('--std', type=float, nargs='+', default=None, metavar='STD',49help='Override std deviation of of dataset')50parser.add_argument('--num-classes', type=int, default=1000,51help='Number classes in dataset')52parser.add_argument('--checkpoint', default='', type=str, metavar='PATH',53help='path to checkpoint (default: none)')54parser.add_argument('--reparam', default=False, action='store_true',55help='Reparameterize model')56parser.add_argument('--training', default=False, action='store_true',57help='Export in training mode (default is eval)')58parser.add_argument('--verbose', default=False, action='store_true',59help='Extra stdout output')60parser.add_argument('--dynamo', default=False, action='store_true',61help='Use torch dynamo export.')62
63def main():64args = parser.parse_args()65
66args.pretrained = True67if args.checkpoint:68args.pretrained = False69
70print("==> Creating PyTorch {} model".format(args.model))71# NOTE exportable=True flag disables autofn/jit scripted activations and uses Conv2dSameExport layers72# for models using SAME padding73model = timm.create_model(74args.model,75num_classes=args.num_classes,76in_chans=3,77pretrained=args.pretrained,78checkpoint_path=args.checkpoint,79exportable=True,80)81
82if args.reparam:83model = reparameterize_model(model)84
85onnx_export(86model,87args.output,88opset=args.opset,89dynamic_size=args.dynamic_size,90aten_fallback=args.aten_fallback,91keep_initializers=args.keep_init,92check_forward=args.check_forward,93training=args.training,94verbose=args.verbose,95use_dynamo=args.dynamo,96input_size=(3, args.img_size, args.img_size),97batch_size=args.batch_size,98)99
100
101if __name__ == '__main__':102main()103