convertor.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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:[w,h]")
  26. parser.add_argument(
  27. "--data_type",
  28. "-dp",
  29. default="FP32",
  30. help="option, FP32 or FP16, the data_type of openvino IR")
  31. return parser
  32. def export_openvino_model(model, args):
  33. if model.model_type == "detector" or model.__class__.__name__ == "FastSCNN":
  34. logging.error(
  35. "Only image classifier models and semantic segmentation models(except FastSCNN) are supported to export to openvino")
  36. try:
  37. import x2paddle
  38. if x2paddle.__version__ < '0.7.4':
  39. logging.error("You need to upgrade x2paddle >= 0.7.4")
  40. except:
  41. logging.error(
  42. "You need to install x2paddle first, pip install x2paddle>=0.7.4")
  43. import x2paddle.convert as x2pc
  44. x2pc.paddle2onnx(args.model_dir, args.save_dir)
  45. import mo.main as mo
  46. from mo.utils.cli_parser import get_onnx_cli_parser
  47. onnx_parser = get_onnx_cli_parser()
  48. onnx_parser.add_argument("--model_dir",type=_text_type)
  49. onnx_parser.add_argument("--save_dir",type=_text_type)
  50. onnx_parser.add_argument("--fixed_input_shape")
  51. onnx_input = os.path.join(args.save_dir, 'x2paddle_model.onnx')
  52. onnx_parser.set_defaults(input_model=onnx_input)
  53. onnx_parser.set_defaults(output_dir=args.save_dir)
  54. shape = '[1,3,'
  55. shape = shape + args.fixed_input_shape[1:]
  56. if model.__class__.__name__ == "YOLOV3":
  57. shape = shape + ",[1,2]"
  58. inputs = "image,im_size"
  59. onnx_parser.set_defaults(input = inputs)
  60. onnx_parser.set_defaults(input_shape = shape)
  61. mo.main(onnx_parser,'onnx')
  62. def main():
  63. parser = arg_parser()
  64. args = parser.parse_args()
  65. assert args.model_dir is not None, "--model_dir should be defined while exporting openvino model"
  66. assert args.save_dir is not None, "--save_dir should be defined to create openvino model"
  67. model = pdx.load_model(args.model_dir)
  68. if model.status == "Normal" or model.status == "Prune":
  69. logging.error(
  70. "Only support inference model, try to export model first as below,",
  71. exit=False)
  72. export_openvino_model(model, args)
  73. if __name__ == "__main__":
  74. main()