由于Openvino在2020 4月份,以及之前的版本中,对pytorch框架下的上采样操作,即F.interploate(或Upsample)的bilinear采样支持不是很好。
具体而言,模型转化前和转化后,输出数据不一致程度高达99%。而这根本原因在于torch在转onnx模型时,采用op9 op10的转化方法,onnx模型与原torch模型的输出不一致(99%不一致)。而采用op11, op12才能保证,模型转化前后,精度一致,数据输出一致度高于99%。
而之前的版本,openvino仅支持op9 op10的onnx模型,转化为IR模型,从而在openvino框架下进行前向推理。对于op11 op12转化方法得到的onnx模型,openvino不支持。
很开心,Intel于10月份更新的Openvino v2021版本增加了对onnx模型的采样支持(op11 op12),详见链接:https://software.intel.com/content/www/us/en/develop/articles/openvino-relnotes.html
关于onnx模型的上采样问题,已支持op11、op12,以及模型输出节点的关键字定义:
自己很快更新了版本,并进行了测试,遇到一个问题:
exec_net = ie.load_network(network=net, device_name=args.device)
File "ie_api.pyx", line 311, in openvino.inference_engine.ie_api.IECore.load_network
File "ie_api.pyx", line 320, in openvino.inference_engine.ie_api.IECore.load_network
RuntimeError: get_shape was called on a descriptor::Tensor with dynamic shape
遇到的问题在于,加载模型时出错。此时,我测试,device设置为CPU时,是没有问题的。device设置为:HETERO:GPU,CPU时会报上述错误。
查找了网上关于该问题几乎没有解答方法,经过自己的研究后,终于解决:
ie = IECore()
net = ie.read_network(model=model_xml, weights=model_bin)
# *************** 加入此段代码可解决问题 start **************************
for output_key in net.outputs:
print(net.layers[output_key].type)
if net.layers[output_key].type == "Convolution":
output_name, output_info = output_key, net.outputs[output_key]
# *************** 加入此段代码可解决问题 end **************************
exec_net = ie.load_network(network=net, device_name=args.device)
出现该问题的部分原因是,我的网络中使用到了上采样操作。