convertor.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import os
  2. from six import text_type as _text_type
  3. import argparse
  4. import sys
  5. from utils import logging
  6. import paddlex as pdx
  7. def arg_parser():
  8. parser = argparse.ArgumentParser()
  9. parser.add_argument(
  10. "--model_dir",
  11. "-m",
  12. type=_text_type,
  13. default=None,
  14. help="define model directory path")
  15. parser.add_argument(
  16. "--save_dir",
  17. "-s",
  18. type=_text_type,
  19. default=None,
  20. help="path to save inference model")
  21. parser.add_argument(
  22. "--fixed_input_shape",
  23. "-fs",
  24. default=None,
  25. help="export openvino model with input shape:[h,w]")
  26. return parser
  27. def export_openvino_model(model, args):
  28. if model.model_type == "detector" or model.__class__.__name__ == "FastSCNN":
  29. logging.error(
  30. "Only image classifier models and semantic segmentation models(except FastSCNN) are supported to export to openvino")
  31. try:
  32. import x2paddle
  33. if x2paddle.__version__ < '0.7.4':
  34. logging.error("You need to upgrade x2paddle >= 0.7.4")
  35. except:
  36. logging.error(
  37. "You need to install x2paddle first, pip install x2paddle>=0.7.4")
  38. from x2paddle.op_mapper.paddle_op_mapper import PaddleOpMapper
  39. mapper = PaddleOpMapper()
  40. mapper.convert(model.test_prog, args.save_dir)
  41. import mo.main as mo
  42. from mo.utils.cli_parser import get_onnx_cli_parser
  43. onnx_parser = get_onnx_cli_parser()
  44. onnx_parser.add_argument("--model_dir",type=_text_type)
  45. onnx_parser.add_argument("--save_dir",type=_text_type)
  46. onnx_parser.add_argument("--fixed_input_shape")
  47. onnx_input = os.path.join(args.save_dir, 'x2paddle_model.onnx')
  48. onnx_parser.set_defaults(input_model=onnx_input)
  49. onnx_parser.set_defaults(output_dir=args.save_dir)
  50. shape = '[1,3,'
  51. shape = shape + args.fixed_input_shape[1:]
  52. onnx_parser.set_defaults(input_shape = shape)
  53. mo.main(onnx_parser,'onnx')
  54. def main():
  55. parser = arg_parser()
  56. args = parser.parse_args()
  57. assert args.model_dir is not None, "--model_dir should be defined while exporting openvino model"
  58. assert args.save_dir is not None, "--save_dir should be defined to create openvino model"
  59. model = pdx.load_model(args.model_dir)
  60. if model.status == "Normal" or model.status == "Prune":
  61. logging.error(
  62. "Only support inference model, try to export model first as below,",
  63. exit=False)
  64. export_openvino_model(model, args)
  65. if __name__ == "__main__":
  66. main()