OpenVINO部署模型时如何自定义任意尺寸的支持

七分青年 2021-03-12 17:53:28 6028

基本原理

OpenVINO在高版本中支持动态修改模型的输入尺度大小(一般是图像宽与高),这个功能是非常有用的,可以帮助我们在程序执行阶段动态修改CNNNetWork的大小,而无需再次转换IR模型文件。它的基本原理支持来自推理引擎的底层ngraph功能支持。最新的IR文件版本v10,它的加载流程与依赖结构如下:

其中读取到的模型可以方便在运行时动态获取与修改替换节点。这里我们通过CNNNetwork支持的函数首先获取输入层的名称与张量维度,然后再修改,修改之后重新编译转换网络就得到修改输入层张量更新之后的CNNNetwork了,整个过程都是在程序执行时候动态完成,无需再次转换IR模型。下面就看看怎么做的!
函数与代码演示
然后我们重新获取输入层的名称与大小,就会发现已经被改变。涉及到两个函数分别为:
//获取输入大小
std::map<std::string, InferenceEngine::SizeVector> InferenceEngine::CNNNetwork::getInputShapes()
// 设置新的大小输入
void InferenceEngine::CNNNetwork::reshape(const std::map<std::string, InferenceEngine::SizeVector> shapes)
无论是来自ngraph的修改还是IR的修改之后都需要调用低延时转换(动态转换)之后会更新网络对象CNNNetwork,调用代码特别简单一句话搞定:
InferenceEngine::LowLatency(cnnNetwork);
然后就会得到改变之后的CNNNetwork了,下面的调用跟正常SDK调用流程相似,以tensorflow对象检测模型的SSD 300x300为例相关的实验代码如下:
include <opencv2\opencv.hpp>
include
include "ie_transformations.hpp"

include

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
std::string xml = "D:/projects/models/tf_ssdv2_ir/frozen_inference_graph.xml";
std::string bin = "D:/projects/models/tf_ssdv2_ir/frozen_inference_graph.bin";

InferenceEngine::Core ie;
InferenceEngine::CNNNetwork net = ie.ReadNetwork(xml, bin);
std::map<std::string, InferenceEngine::SizeVector> inputs = net.getInputShapes();
std::map<std::string, InferenceEngine::SizeVector>::iterator iter;

// 输入格式
for(iter=inputs.begin(); iter != inputs.end(); iter++) {
    std::cout <<"input name: " << iter->first << std::endl;
    InferenceEngine::SizeVector dims = static_cast<InferenceEngine::SizeVector>(iter->second);
    printf("input shapes: [");
    for (size_t t = 0; t < dims.size(); t++) {
        printf(" %d", dims[t]);
    }
    printf(" ] \n");
}

InferenceEngine::SizeVector n_dims;
n_dims.push_back(1);
n_dims.push_back(3);
n_dims.push_back(224);
n_dims.push_back(224);
std::map<std::string, InferenceEngine::SizeVector> n_input;
n_input.insert(std::make_pair("image_tensor", n_dims));
net.reshape(n_input);

InferenceEngine::LowLatency(net);
inputs = net.getInputShapes();

// 输入格式
for (iter = inputs.begin(); iter != inputs.end(); iter++) {
    std::cout << "new input name: " << iter->first << std::endl;
    InferenceEngine::SizeVector dims = static_cast<InferenceEngine::SizeVector>(iter->second);
    printf("new input shapes: [");
    for (size_t t = 0; t < dims.size(); t++) {
        printf(" %d", dims[t]);
    }
    printf(" ] \n");
}
return 0;

}
运行截图如下:

可以看到输入层:image_tensor的输入大小已经从
1x3x300x300
变为:
1x3x224x224
以后想怎么改就改吧,OpenVINOIE SDK动态修改输入大小技能get!

来源 :opencv学堂

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 96 8 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
七分青年
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区