OpenVINO整活(一) 输入分辨率
OpenVINO分为转换与部署两个部分,如下图所示

在转换步中,需要将输入模型序列化后传入OpenVINO的MOModel Optimizer工具对模型进行优化,以得到IR
Intermediate Representation中间表示,详细的内部行为可以参考Model Optimizer Developer Guide。接着,在部署步中,我们使用OpenVINO提供的Python或者CPP的api,进行编程以达到我们想要的结果:1) 载入ir文件, 2) 建立ieInference Engine推理引擎, 3) 生成执行对象ExecutableNetwork, 载入不同的plugin,以支持特定的硬件(CPU、GPU等等),详细行为可参考Inference Engine Developer Guide。
对于转换步,针对"输入模型序列化"我就产生了疑问,OpenVINO所使用的序列化后进行ir转换的模型,它是一个类似静态图的东西,序列化后我再转换,那岂不就是我只能支持输入静态分辨率了?要使用OpenVINO化的模型进行推理,任意输入就得按照序列化时的分辨率来推理,岂不是很僵硬。难道,OpenVINO的推理,就得先插值,再推理,最后再插值回原分辨率?
这里就直接给结论了,OpenVINO是支持动态输入的,并且在它的手册里,也有相应的段落Using Shape Inference,乍看起来很简单,但实则暗藏坑点,这里我也直接给出坑点来,CPP api是无法全面支持OpenVINO reshape操作的:
- Python api 全面支持reshape操作,不会出错
- CPP api 某些简单网络支持,我推测还是scale的精度问题,参考我之前的日志PyTorch转ONNX之F.interpolate,从4到9,python搞得定,cpp估计就搞不定了,例如就会报如下的错,也是网络内部的upsample的问题,所以可以在2) 建立ie引擎的时候,加入resize层,也就是在ir外部添加一个处理,而不是reshape整个ir

那么,下面就是两部分的详细说明
Python api
由于Python不像CPP,在精度和内存分配上,我们都不需要担心,所以完全可以使用OpenVINO自带的reshape操作,将整个ir调整到适合的输入分辨率。
这里需要注意两点,一是在使用mo工具进行ir转换的时候,需要使用--keep_shape_ops,二是在部署的时候,需要在"3) 生成ExecutableNetwork对象"前使用reshape。
一、使用mo转换ir
--keep_shape_ops
[ Experimental feature ] Enables `Shape` operation
with all children keeping. This feature makes model
reshapable in Inference Engine
详细地,可以参考When to Specify --keep_shape_ops Command Line Parameter,mo工具会保留内部的分辨率变化的图结构,实话说这部分保留了什么样的图结构,我不清楚,我猜是像onnx那样的scale值,onnx是通过scale值来计算输入与输出的分辨率大小,有可能,--keep_shape_ops取消了原本scale的const类型?
二、使用python api进行推理
这里我给一个示例代码,这里也是修改自OpenVINO提供的deployment_tools/inference_engine/samples/python里面的,我把注释和提示信息打印了出来,方便大家理解。
# model config
model_xml = 'your_model.xml'
model_bin = 'your_model.bin'
# Read IR
print("Creating Inference Engine...")
ie = IECore()
print("Loading network files:\n\t{}\n\t{}".format(model_xml, model_bin))
net = ie.read_network(model=model_xml, weights=model_bin)
# Check params in IR
# 检查IR模型是否是支持CPU硬件的
supported_layers = ie.query_network(net, "CPU")
not_supported_layers = [l for l in net.layers.keys() if l not in supported_layers]
if len(not_supported_layers) != 0:
print("Following layers are not supported by the plugin for specified device {}:\n {}".
format('CPU', ', '.join(not_supported_layers)))

本文深入探讨OpenVINO框架如何支持动态输入分辨率,解决模型转换与部署过程中的灵活性问题。文章详细介绍Python与CPP API在重塑模型输入方面的差异,以及如何在不改变IR结构的情况下,利用OpenVINO内置的resize操作优化输入。
最低0.47元/天 解锁文章
1394

被折叠的 条评论
为什么被折叠?



