converter.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. import os
  15. import os.path as osp
  16. from six import text_type as _text_type
  17. import argparse
  18. import sys
  19. import yaml
  20. import paddlex as pdx
  21. def arg_parser():
  22. parser = argparse.ArgumentParser()
  23. parser.add_argument(
  24. "--model_dir",
  25. "-m",
  26. type=_text_type,
  27. default=None,
  28. help="define model directory path")
  29. parser.add_argument(
  30. "--save_dir",
  31. "-s",
  32. type=_text_type,
  33. default=None,
  34. help="path to save inference model")
  35. parser.add_argument(
  36. "--fixed_input_shape",
  37. "-fs",
  38. default=None,
  39. help="export openvino model with input shape:[w,h]")
  40. parser.add_argument(
  41. "--data_type",
  42. "-dp",
  43. default="FP32",
  44. help="option, FP32 or FP16, the data_type of openvino IR")
  45. return parser
  46. def export_openvino_model(model, args):
  47. if model.__class__.__name__ == "YOLOv3":
  48. pdx.converter.export_onnx_model(model, args.save_dir)
  49. else:
  50. pdx.converter.export_onnx_model(model, args.save_dir, 11)
  51. import mo.main as mo
  52. from mo.utils.cli_parser import get_onnx_cli_parser
  53. onnx_parser = get_onnx_cli_parser()
  54. onnx_parser.add_argument("--model_dir", type=_text_type)
  55. onnx_parser.add_argument("--save_dir", type=_text_type)
  56. onnx_parser.add_argument("--fixed_input_shape")
  57. onnx_input = os.path.join(args.save_dir, 'paddle2onnx_model.onnx')
  58. onnx_parser.set_defaults(input_model=onnx_input)
  59. onnx_parser.set_defaults(output_dir=args.save_dir)
  60. shape_list = args.fixed_input_shape[1:-1].split(',')
  61. with open(osp.join(args.model_dir, "model.yml")) as f:
  62. info = yaml.load(f.read(), Loader=yaml.Loader)
  63. input_channel = 3
  64. if 'input_channel' in info['_init_params']:
  65. input_channel = info['_init_params']['input_channel']
  66. shape = '[1,{},' + shape_list[1] + ',' + shape_list[0] + ']'
  67. shape = shape.format(input_channel)
  68. if model.__class__.__name__ == "YOLOv3":
  69. shape = shape + ",[1,2]"
  70. inputs = "image,im_size"
  71. onnx_parser.set_defaults(input=inputs)
  72. onnx_parser.set_defaults(input_shape=shape)
  73. mo.main(onnx_parser, 'onnx')
  74. def main():
  75. parser = arg_parser()
  76. args = parser.parse_args()
  77. assert args.model_dir is not None, "--model_dir should be defined while exporting openvino model"
  78. assert args.save_dir is not None, "--save_dir should be defined to create openvino model"
  79. model = pdx.load_model(args.model_dir)
  80. if model.status == "Normal" or model.status == "Prune":
  81. print(
  82. "Only support inference model, try to export model first as below,",
  83. exit=False)
  84. export_openvino_model(model, args)
  85. if __name__ == "__main__":
  86. main()