基于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后,需针对不同的模型输出格式进行数据解析,具体请看后续关于语义分割/目标检测以及实例分割的网络解析。
总结
本文仅作为个人纪录,如有问题,欢迎指正!