浏览代码

fix no module mo

wangsiyuan06 4 年之前
父节点
当前提交
3ad4b514aa

+ 33 - 27
deploy/openvino/python/converter.py

@@ -51,35 +51,41 @@ def arg_parser():
 
 
 def export_openvino_model(model, args):
-
+    #convert paddle inference model to onnx
     onnx_save_file = os.path.join(args.save_dir, 'paddle2onnx_model.onnx')
     if model.__class__.__name__ == "YOLOv3":
         pdx.converter.export_onnx_model(model, onnx_save_file)
     else:
         pdx.converter.export_onnx_model(model, onnx_save_file, 11)
-
-    import mo.main as mo
-    from mo.utils.cli_parser import get_onnx_cli_parser
-    onnx_parser = get_onnx_cli_parser()
-    onnx_parser.add_argument("--model_dir", type=_text_type)
-    onnx_parser.add_argument("--save_dir", type=_text_type)
-    onnx_parser.add_argument("--fixed_input_shape")
-    onnx_parser.set_defaults(input_model=onnx_save_file)
-    onnx_parser.set_defaults(output_dir=args.save_dir)
-    shape_list = args.fixed_input_shape[1:-1].split(',')
-    with open(osp.join(args.model_dir, "model.yml")) as f:
-        info = yaml.load(f.read(), Loader=yaml.Loader)
-    input_channel = 3
-    if 'input_channel' in info['_init_params']:
-        input_channel = info['_init_params']['input_channel']
-    shape = '[1,{},' + shape_list[1] + ',' + shape_list[0] + ']'
-    shape = shape.format(input_channel)
-    if model.__class__.__name__ == "YOLOv3":
-        shape = shape + ",[1,2]"
-        inputs = "image,im_size"
-        onnx_parser.set_defaults(input=inputs)
-    onnx_parser.set_defaults(input_shape=shape)
-    mo.main(onnx_parser, 'onnx')
+    
+    #convert onnx to openvino ir
+    try:
+    	import mo.main as mo
+    	from mo.utils.cli_parser import get_onnx_cli_parser
+    except:
+    	print("please init openvino environment first")
+	print("see https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/deploy/openvino/faq.md")
+    else:
+        onnx_parser = get_onnx_cli_parser()
+        onnx_parser.add_argument("--model_dir", type=_text_type)
+        onnx_parser.add_argument("--save_dir", type=_text_type)
+        onnx_parser.add_argument("--fixed_input_shape")
+        onnx_parser.set_defaults(input_model=onnx_save_file)
+        onnx_parser.set_defaults(output_dir=args.save_dir)
+        shape_list = args.fixed_input_shape[1:-1].split(',')
+        with open(osp.join(args.model_dir, "model.yml")) as f:
+            info = yaml.load(f.read(), Loader=yaml.Loader)
+        input_channel = 3
+        if 'input_channel' in info['_init_params']:
+            input_channel = info['_init_params']['input_channel']
+        shape = '[1,{},' + shape_list[1] + ',' + shape_list[0] + ']'
+        shape = shape.format(input_channel)
+        if model.__class__.__name__ == "YOLOv3":
+            shape = shape + ",[1,2]"
+            inputs = "image,im_size"
+            onnx_parser.set_defaults(input=inputs)
+        onnx_parser.set_defaults(input_shape=shape)
+        mo.main(onnx_parser, 'onnx')
 
 
 def main():
@@ -90,9 +96,9 @@ def main():
     model = pdx.load_model(args.model_dir)
     if model.status == "Normal" or model.status == "Prune":
         print(
-            "Only support inference model, try to export model first as below,",
-            exit=False)
-    export_openvino_model(model, args)
+            "Only support inference model, try to export inference model first as below,")
+    else:
+	export_openvino_model(model, args)
 
 
 if __name__ == "__main__":

+ 5 - 3
docs/deploy/openvino/export_openvino_model.md

@@ -5,10 +5,10 @@
 
 * ONNX 1.6.0+
 * PaddleX 1.2+
-* OpenVINO 2021.1+
+* OpenVINO 2020.4+
 
 **说明**:PaddleX安装请参考[PaddleX](https://paddlex.readthedocs.io/zh_CN/develop/install.html) , OpenVINO安装请参考[OpenVINO](https://docs.openvinotoolkit.org/latest/index.html),ONNX请安装1.6.0以上版本否则会出现转模型错误。  
-**注意**:安装OpenVINO时请务必安装官网教程初始化OpenVINO运行环境,并安装相关依赖  
+**注意**:安装OpenVINO时请务必安装官网教程初始化OpenVINO运行环境,并安装相关依赖,否则会出现"No module named mo"等问题  
 
 请确保系统已经安装好上述基本软件,**下面所有示例以工作目录 `/root/projects/`演示**。
 
@@ -41,5 +41,7 @@ python converter.py --model_dir /path/to/inference_model --save_dir /path/to/ope
 | --data_type(option)  | (可选)FP32、FP16,默认为FP32,VPU下的IR需要为FP16 |  
 
 **注意**:
-- 由于OpenVINO 从2021.1版本开始支持ONNX的resize-11 OP的原因,请下载OpenVINO 2021.1+的版本
+- 若转换过程中出现"No module named mo"的问题,请先初始化OpenVINO环境[./faq.md]再进行模型转换
+- 由于OpenVINO 从2021.1版本开始支持ONNX的resize-11 OP的原因,对于CPU部署请下载OpenVINO 2021.1+的版本
+- 由于VPU上不支持Range Layer,对于VPU部署请下载OpenVINO 2020.4版本进行模型转换
 - YOLOv3在通过OpenVINO部署时,由于OpenVINO对ONNX OP的支持限制,我们在将YOLOv3的Paddle模型导出时,对最后一层multiclass_nms进行了特殊处理,导出的ONNX模型,最终输出的Box结果包括背景类别(而Paddle模型不包含),此处在OpenVINO的部署代码中,我们通过后处理过滤了背景类别。

+ 29 - 0
docs/deploy/openvino/faq.md

@@ -0,0 +1,29 @@
+#OpenVINO部署常见问题
+
+## Q1转模型过程中出现"ModuleNotFoundError: No module named 'mo'"  
+
+原因:该问题主要是因为在安装OpenVINO之后未初始化OpenVINO环境  
+解决方案:找到OpenVINO初始化环境脚本,运行后即可以解决此问题  
+
+### Linux系统初始化OpenVINO环境
+1)root用户安装,以OpenVINO 2021.1版本为例,运行如下命令即可初始化  
+
+```
+source /opt/intel/openvino_2021/bin/setupvars.sh
+```
+  
+2)非root用户安装,以OpenVINO 2021.1版本、用户名为paddlex为例,运行如下命令即可初始化
+  
+```
+source /home/paddlex/intel/openvino_2021/bin/setupvar.sh
+```
+  
+### Window系统初始化OpenVINO环境
+以OpenVINO 2021.1版本为例,执行如下命令即可初始化OpenVINO环境  
+
+```
+cd C:\Program Files (x86)\Intel\openvino_2021\bin\
+setupvars.bat
+```
+
+**说明**:更多初始化OpenVINO环境的细节请参考[OpenVINO官网](https://docs.openvinotoolkit.org/latest/index.html)

+ 1 - 0
docs/deploy/openvino/index.rst

@@ -11,3 +11,4 @@ OpenVINO部署
    linux.md
    python.md
    export_openvino_model.md 
+   faq.md

+ 2 - 0
docs/deploy/openvino/introduction.md

@@ -36,3 +36,5 @@ CPU或者VPU的情况下使用OpenVINO进行预测加速
 **[Windows](./windows.md)**:介绍了PaddleX在操作系统为Window,编程语言为C++,硬件平台为CPU或者VPU的情况下使用OpenVINO进行预测加速  
 
 **[Python](./python.md)**:介绍了PaddleX在python下使用OpenVINO进行预测加速
+  
+**[部署常见问题](./faq.md)**