Files
rapidocr/python/rapidocr_openvino

rapidocr_openvino

目录

基于OpenVINO推理引擎

  • OpenVINO推理方向分类模型有误,已经提了issue
  • 问题已经解决,但是需要自己编译OpenVINO,参见Answer

安装

# Windows端
pip install openvino==2022.1.0

# 里面含有mo
pip install openvino-dev==2022.1.0

模型问题

  • 因为OpenVINO可以直接推理ONNX模型,故这里暂时不作转换,直接推理之前ONNX模型即可
  • 这里仍然给出转换的代码,用作参考:
    mo --input_model models/ch_PP-OCRv2_det_infer.onnx --output_dir models/IR/
    
    mo --input_model models/ch_PP-OCRv2_det_infer.onnx \
    --output_dir models/IR/static \
    --input_shape "[1,3,12128,800]"
    

关于OpenVINO

  • OpenVINO可以直接推理IR、ONNX和PaddlePaddle模型,具体如下(图来源:link):

  • 和ONNXRuntime同时推理同一个ONNX模型,OpenVINO推理速度更快

  • 但是从对比来看,OpenVINO占用内存更大,其原因是拿空间换的时间

    • 当指定input_shape在一个区间范围时,推理时内存占用会减少一些
    • 示例命令:
      mo --input_model models/ch_PP-OCRv2_det_infer.onnx \
      --output_dir models/IR/static \
      --input_shape "[1,3,960:1200,800]"
      

OpenVINO与ONNXRuntime性能对比

  • 推理设备:Windows 64位 Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz 2.59 GHz
  • 测试图像宽高: 12119x810
测试模型 推理框架 占用内存(3次平均) 推理时间(3次平均)
ch_PP-OCRv2_det_infer.onnx ONNXRuntime=1.10.0 0.8G 5.354s
ch_PP-OCRv2_det_infer.onnx openvino=2022.1.0 3.225G 2.53s
ch_PP-OCRv2_det_infer.xml FP32 动态图 openvino=2022.1.0 3.175G 2.0455s

OpenVINO与ONNXRuntime推理代码写法对比

NOTE: 以ch_ppocr_mobile_v2_det中推理代码为例子

  • ONNXRuntime

    import onnxruntime
    
    # 声明
    sess_opt = onnxruntime.SessionOptions()
    sess_opt.log_severity_level = 4
    sess_opt.enable_cpu_mem_arena = False
    self.session = onnxruntime.InferenceSession(det_model_path, sess_opt)
    self.input_name = self.session.get_inputs()[0].name
    self.output_name = self.session.get_outputs()[0].name
    
    # 推理
    preds = self.session.run([self.output_name], {self.input_name: img})
    
  • OpenVINO

    from openvino.runtime import Core
    
    # 初始化
    ie = Core()
    model_onnx = ie.read_model(det_model_path)
    compile_model = ie.compile_model(model=model_onnx, device_name='CPU')
    self.vino_session = compile_model.create_infer_request()
    
    # 推理
    self.vino_session.infer(inputs=[img])
    vino_preds = self.vino_session.get_output_tensor().data