openvino推理全流程

基于openvino的深度学习模型部署全流程(以语义分割、目标检测和实例分割为例)


前言

本文只针对openvino推理,给出了模型部署从输入到输出的一般流程,不涉及各个网络的后处理解析部分。具体的数据解析请关注后续几篇文章。

一、初始化对象

初始化openvino的推理Core对象。

InferenceEngine::Core core;

二、读取模型

InferenceEngine:CNNNetwork network = core.ReadNetwork(xml,bin);

三、配置输入输出

1.获得网络输入输出信息

    // 获得网络输入信息(键值对) 
    InferenceEngine::InputsDataMap inputs_info = network.getInputsInfo();
    // 获得网络输出信息(键值对)
    InferenceEngine::OutputsDataMap output_info = network.getOutputsInfo();

2.设置输入输出数据格式(两种方式)

代码如下(示例):

//获取输入并进行设置(第一种方式)
    auto item = inputs_info.begin();
    image_info_name = item->first;         //获取image_info输入的名字
    auto image_info_ptr = item->second;    //获取image_info输入的指针
    //配置input_tensor输入:U8,NCHW, 保持默认的禁止自动放缩输入图像和禁止自动转换颜色通道
    image_info_ptr ->setPrecision(InferenceEngine::Precision::FP32); // U8最通用,参考资料:
    image_info_ptr ->setLayout(InferenceEngine::Layout::NCHW);
    image_info_ptr ->getPreProcess().setColorFormat(InferenceEngine::ColorFormat::RGB);

//获取输出并进行设置(第二种方式)
	for (auto &output :output_info){
	output.second->setPrecision(Precision::FP32);
	}

四、装载模型到执行硬件中

ExecutableNetwork executable_network = core.LoadNetwork(network, "CPU");

五、创建推理请求

InferenceEngine::InferRequest infer_request = executable_network.CreateInferRequest();

六、准备输入数据

	cv::Mat image = cv::imread(IMAGE_FILE);
    
    /* 记录图片原始H,W */
    auto original_height = image.rows;
    auto original_width = image.cols;
    /* 获得模型的image_info输入的数据缓冲 */
    Blob::Ptr image_info_blob = infer_request.GetBlob(image_info_name);
    /** 向模型的image_info输入的数据缓冲填入数据: height, width, scale=1.0 **/
    InferenceEngine::LockedMemory<void> blobMapped = 
    InferenceEngine::as<MemoryBlob>(image_info_blob)->wmap();
    auto data = blobMapped.as<float*>();
    for(size_t row =0;row<640;row++){
        for(size_t col=0;col<640;col++){
            for(size_t ch =0;ch<3;ch++){
                data[img_size*ch + row*640 + col] = float(inframe.at<Vec3b>(row,col)[ch])/255.0f;
            }
        }
    }

七、开始推理

InferenceEngine::infer_request.Infer();

八、获取输出结果进行后处理

 for (auto &output : outputinfo) {
        auto output_name = output.first;
        Blob::Ptr blob = infer_request->GetBlob(output_name);
		InferenceEngine::LockedMemory<void> blobMapped = 
		InferenceEngine::as<MemoryBlob>(blob)->wmap();
		auto blob_data = blobMapped.as<float*>();
    }

获取到输出blob_data后,需针对不同的模型输出格式进行数据解析,具体请看后续关于语义分割/目标检测以及实例分割的网络解析。

总结

本文仅作为个人纪录,如有问题,欢迎指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值